Evas GL: Add support for Evas GL 3.0 44/47444/4
authormythri.venugopal <mythri.venugopal@samsung.com>
Fri, 13 Mar 2015 19:19:44 +0000 (19:19 +0000)
committerDaeKwang Ryu <dkdk.ryu@samsung.com>
Wed, 16 Sep 2015 12:05:44 +0000 (21:05 +0900)
This is a unified backport from upstream efl containing:

commit 56c9919d0080df6fb7630068229c992443728078
Author: Dongyeon Kim <dy5.kim@samsung.com>
Date:   Mon Mar 9 17:17:19 2015 +0900
    Evas GL: change function naming and small bug fixes
    Summary:
    Remove gles1 prefixes for functions that are also used by gles3.
    Refactor evgl_make_current a little bit.
    Destroy indirect context properly.
    Some log message changes and typo fixes.
    Test Plan: Local tests on desktop PC
    Reviewers: jpeg
    Subscribers: mythri, mer.kim, wonsik, cedric
    Differential Revision: https://phab.enlightenment.org/D2104

commit f3bbc602ac30a66dac50a1e8eddaf2ac3710cdc0
Author: Jean-Philippe Andre <jp.andre@samsung.com>
Date:   Thu Mar 5 18:16:05 2015 +0900
    Evas GL: Fix list of extensions with GLESv1
    EGL/EvasGL extensions are also valid with GLESv1.
    This means evasglCreateImage could be used.

commit 8f465c0b104df73affc12e42e67cd25e6cc5d1d0
Author: Jean-Philippe Andre <jp.andre@samsung.com>
Date:   Thu Mar 5 17:20:57 2015 +0900
    Evas GL: Fix logic in debug check

commit 4817103b8c5217179055a130e20452b7e85b14e8
Author: Jean-Philippe Andre <jp.andre@samsung.com>
Date:   Thu Mar 5 15:57:14 2015 +0900
    Evas GL: Fix build errors and warnings from previous commit

commit 2245cc12a47da9fe826f29a19ddb1874e18f7eb4
Author: mythri.venugopal <mythri.venugopal@samsung.com>
Date:   Thu Mar 5 15:36:35 2015 +0900
    Evas GL: Add support for Evas GL 3.0
    Summary:
    This should enable applications to use GLES 3.0 through evas gl.

Change-Id: Ia73473a9d705d970b0f7ddbc55f510f3c112bb81

12 files changed:
src/lib/evas/Evas_GL.h
src/lib/evas/Evas_GL_GLES3_Helpers.h
src/lib/evas/canvas/evas_gl.c
src/modules/evas/engines/gl_common/evas_gl_api.c
src/modules/evas/engines/gl_common/evas_gl_api_ext.c [changed mode: 0644->0755]
src/modules/evas/engines/gl_common/evas_gl_api_ext.h
src/modules/evas/engines/gl_common/evas_gl_common.h
src/modules/evas/engines/gl_common/evas_gl_context.c
src/modules/evas/engines/gl_common/evas_gl_core.c
src/modules/evas/engines/gl_common/evas_gl_core_private.h
src/modules/evas/engines/gl_generic/evas_engine.c
src/modules/evas/engines/gl_x11/evas_engine.c

index c3ce92a..de3c80b 100644 (file)
@@ -3366,6 +3366,319 @@ typedef signed int         GLclampx;   // Changed khronos_int32_t
 typedef struct __GLsync*   GLsync;
 
 
+/* OpenGLES 3.0 */
+#ifndef __gl3_h_
+# define __gl3_h_ 1
+
+
+#define GL_READ_BUFFER                    0x0C02
+#define GL_UNPACK_ROW_LENGTH              0x0CF2
+#define GL_UNPACK_SKIP_ROWS               0x0CF3
+#define GL_UNPACK_SKIP_PIXELS             0x0CF4
+#define GL_PACK_ROW_LENGTH                0x0D02
+#define GL_PACK_SKIP_ROWS                 0x0D03
+#define GL_PACK_SKIP_PIXELS               0x0D04
+#define GL_COLOR                          0x1800
+#define GL_DEPTH                          0x1801
+#define GL_STENCIL                        0x1802
+#define GL_RED                            0x1903
+#define GL_RGB8                           0x8051
+#define GL_RGBA8                          0x8058
+#define GL_RGB10_A2                       0x8059
+#define GL_TEXTURE_BINDING_3D             0x806A
+#define GL_UNPACK_SKIP_IMAGES             0x806D
+#define GL_UNPACK_IMAGE_HEIGHT            0x806E
+#define GL_TEXTURE_3D                     0x806F
+#define GL_TEXTURE_WRAP_R                 0x8072
+#define GL_MAX_3D_TEXTURE_SIZE            0x8073
+#define GL_UNSIGNED_INT_2_10_10_10_REV    0x8368
+#define GL_MAX_ELEMENTS_VERTICES          0x80E8
+#define GL_MAX_ELEMENTS_INDICES           0x80E9
+#define GL_TEXTURE_MIN_LOD                0x813A
+#define GL_TEXTURE_MAX_LOD                0x813B
+#define GL_TEXTURE_BASE_LEVEL             0x813C
+#define GL_TEXTURE_MAX_LEVEL              0x813D
+#define GL_MIN                            0x8007
+#define GL_MAX                            0x8008
+#define GL_DEPTH_COMPONENT24              0x81A6
+#define GL_MAX_TEXTURE_LOD_BIAS           0x84FD
+#define GL_TEXTURE_COMPARE_MODE           0x884C
+#define GL_TEXTURE_COMPARE_FUNC           0x884D
+#define GL_CURRENT_QUERY                  0x8865
+#define GL_QUERY_RESULT                   0x8866
+#define GL_QUERY_RESULT_AVAILABLE         0x8867
+#define GL_BUFFER_MAPPED                  0x88BC
+#define GL_BUFFER_MAP_POINTER             0x88BD
+#define GL_STREAM_READ                    0x88E1
+#define GL_STREAM_COPY                    0x88E2
+#define GL_STATIC_READ                    0x88E5
+#define GL_STATIC_COPY                    0x88E6
+#define GL_DYNAMIC_READ                   0x88E9
+#define GL_DYNAMIC_COPY                   0x88EA
+#define GL_MAX_DRAW_BUFFERS               0x8824
+#define GL_DRAW_BUFFER0                   0x8825
+#define GL_DRAW_BUFFER1                   0x8826
+#define GL_DRAW_BUFFER2                   0x8827
+#define GL_DRAW_BUFFER3                   0x8828
+#define GL_DRAW_BUFFER4                   0x8829
+#define GL_DRAW_BUFFER5                   0x882A
+#define GL_DRAW_BUFFER6                   0x882B
+#define GL_DRAW_BUFFER7                   0x882C
+#define GL_DRAW_BUFFER8                   0x882D
+#define GL_DRAW_BUFFER9                   0x882E
+#define GL_DRAW_BUFFER10                  0x882F
+#define GL_DRAW_BUFFER11                  0x8830
+#define GL_DRAW_BUFFER12                  0x8831
+#define GL_DRAW_BUFFER13                  0x8832
+#define GL_DRAW_BUFFER14                  0x8833
+#define GL_DRAW_BUFFER15                  0x8834
+#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49
+#define GL_MAX_VERTEX_UNIFORM_COMPONENTS  0x8B4A
+#define GL_SAMPLER_3D                     0x8B5F
+#define GL_SAMPLER_2D_SHADOW              0x8B62
+#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B
+#define GL_PIXEL_PACK_BUFFER              0x88EB
+#define GL_PIXEL_UNPACK_BUFFER            0x88EC
+#define GL_PIXEL_PACK_BUFFER_BINDING      0x88ED
+#define GL_PIXEL_UNPACK_BUFFER_BINDING    0x88EF
+#define GL_FLOAT_MAT2x3                   0x8B65
+#define GL_FLOAT_MAT2x4                   0x8B66
+#define GL_FLOAT_MAT3x2                   0x8B67
+#define GL_FLOAT_MAT3x4                   0x8B68
+#define GL_FLOAT_MAT4x2                   0x8B69
+#define GL_FLOAT_MAT4x3                   0x8B6A
+#define GL_SRGB                           0x8C40
+#define GL_SRGB8                          0x8C41
+#define GL_SRGB8_ALPHA8                   0x8C43
+#define GL_COMPARE_REF_TO_TEXTURE         0x884E
+#define GL_MAJOR_VERSION                  0x821B
+#define GL_MINOR_VERSION                  0x821C
+#define GL_NUM_EXTENSIONS                 0x821D
+#define GL_RGBA32F                        0x8814
+#define GL_RGB32F                         0x8815
+#define GL_RGBA16F                        0x881A
+#define GL_RGB16F                         0x881B
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER    0x88FD
+#define GL_MAX_ARRAY_TEXTURE_LAYERS       0x88FF
+#define GL_MIN_PROGRAM_TEXEL_OFFSET       0x8904
+#define GL_MAX_PROGRAM_TEXEL_OFFSET       0x8905
+#define GL_MAX_VARYING_COMPONENTS         0x8B4B
+#define GL_TEXTURE_2D_ARRAY               0x8C1A
+#define GL_TEXTURE_BINDING_2D_ARRAY       0x8C1D
+#define GL_R11F_G11F_B10F                 0x8C3A
+#define GL_UNSIGNED_INT_10F_11F_11F_REV   0x8C3B
+#define GL_RGB9_E5                        0x8C3D
+#define GL_UNSIGNED_INT_5_9_9_9_REV       0x8C3E
+#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76
+#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80
+#define GL_TRANSFORM_FEEDBACK_VARYINGS    0x8C83
+#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84
+#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85
+#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88
+#define GL_RASTERIZER_DISCARD             0x8C89
+#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A
+#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B
+#define GL_INTERLEAVED_ATTRIBS            0x8C8C
+#define GL_SEPARATE_ATTRIBS               0x8C8D
+#define GL_TRANSFORM_FEEDBACK_BUFFER      0x8C8E
+#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F
+#define GL_RGBA32UI                       0x8D70
+#define GL_RGB32UI                        0x8D71
+#define GL_RGBA16UI                       0x8D76
+#define GL_RGB16UI                        0x8D77
+#define GL_RGBA8UI                        0x8D7C
+#define GL_RGB8UI                         0x8D7D
+#define GL_RGBA32I                        0x8D82
+#define GL_RGB32I                         0x8D83
+#define GL_RGBA16I                        0x8D88
+#define GL_RGB16I                         0x8D89
+#define GL_RGBA8I                         0x8D8E
+#define GL_RGB8I                          0x8D8F
+#define GL_RED_INTEGER                    0x8D94
+#define GL_RGB_INTEGER                    0x8D98
+#define GL_RGBA_INTEGER                   0x8D99
+#define GL_SAMPLER_2D_ARRAY               0x8DC1
+#define GL_SAMPLER_2D_ARRAY_SHADOW        0x8DC4
+#define GL_SAMPLER_CUBE_SHADOW            0x8DC5
+#define GL_UNSIGNED_INT_VEC2              0x8DC6
+#define GL_UNSIGNED_INT_VEC3              0x8DC7
+#define GL_UNSIGNED_INT_VEC4              0x8DC8
+#define GL_INT_SAMPLER_2D                 0x8DCA
+#define GL_INT_SAMPLER_3D                 0x8DCB
+#define GL_INT_SAMPLER_CUBE               0x8DCC
+#define GL_INT_SAMPLER_2D_ARRAY           0x8DCF
+#define GL_UNSIGNED_INT_SAMPLER_2D        0x8DD2
+#define GL_UNSIGNED_INT_SAMPLER_3D        0x8DD3
+#define GL_UNSIGNED_INT_SAMPLER_CUBE      0x8DD4
+#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY  0x8DD7
+#define GL_BUFFER_ACCESS_FLAGS            0x911F
+#define GL_BUFFER_MAP_LENGTH              0x9120
+#define GL_BUFFER_MAP_OFFSET              0x9121
+#define GL_DEPTH_COMPONENT32F             0x8CAC
+#define GL_DEPTH32F_STENCIL8              0x8CAD
+#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD
+#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210
+#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211
+#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212
+#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213
+#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214
+#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215
+#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216
+#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217
+#define GL_FRAMEBUFFER_DEFAULT            0x8218
+#define GL_FRAMEBUFFER_UNDEFINED          0x8219
+#define GL_DEPTH_STENCIL_ATTACHMENT       0x821A
+#define GL_DEPTH_STENCIL                  0x84F9
+#define GL_UNSIGNED_INT_24_8              0x84FA
+#define GL_DEPTH24_STENCIL8               0x88F0
+#define GL_UNSIGNED_NORMALIZED            0x8C17
+#define GL_DRAW_FRAMEBUFFER_BINDING       0x8CA6
+#define GL_READ_FRAMEBUFFER               0x8CA8
+#define GL_DRAW_FRAMEBUFFER               0x8CA9
+#define GL_READ_FRAMEBUFFER_BINDING       0x8CAA
+#define GL_RENDERBUFFER_SAMPLES           0x8CAB
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4
+#define GL_MAX_COLOR_ATTACHMENTS          0x8CDF
+#define GL_COLOR_ATTACHMENT1              0x8CE1
+#define GL_COLOR_ATTACHMENT2              0x8CE2
+#define GL_COLOR_ATTACHMENT3              0x8CE3
+#define GL_COLOR_ATTACHMENT4              0x8CE4
+#define GL_COLOR_ATTACHMENT5              0x8CE5
+#define GL_COLOR_ATTACHMENT6              0x8CE6
+#define GL_COLOR_ATTACHMENT7              0x8CE7
+#define GL_COLOR_ATTACHMENT8              0x8CE8
+#define GL_COLOR_ATTACHMENT9              0x8CE9
+#define GL_COLOR_ATTACHMENT10             0x8CEA
+#define GL_COLOR_ATTACHMENT11             0x8CEB
+#define GL_COLOR_ATTACHMENT12             0x8CEC
+#define GL_COLOR_ATTACHMENT13             0x8CED
+#define GL_COLOR_ATTACHMENT14             0x8CEE
+#define GL_COLOR_ATTACHMENT15             0x8CEF
+#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56
+#define GL_MAX_SAMPLES                    0x8D57
+#define GL_HALF_FLOAT                     0x140B
+#define GL_MAP_READ_BIT                   0x0001
+#define GL_MAP_WRITE_BIT                  0x0002
+#define GL_MAP_INVALIDATE_RANGE_BIT       0x0004
+#define GL_MAP_INVALIDATE_BUFFER_BIT      0x0008
+#define GL_MAP_FLUSH_EXPLICIT_BIT         0x0010
+#define GL_MAP_UNSYNCHRONIZED_BIT         0x0020
+#define GL_RG                             0x8227
+#define GL_RG_INTEGER                     0x8228
+#define GL_R8                             0x8229
+#define GL_RG8                            0x822B
+#define GL_R16F                           0x822D
+#define GL_R32F                           0x822E
+#define GL_RG16F                          0x822F
+#define GL_RG32F                          0x8230
+#define GL_R8I                            0x8231
+#define GL_R8UI                           0x8232
+#define GL_R16I                           0x8233
+#define GL_R16UI                          0x8234
+#define GL_R32I                           0x8235
+#define GL_R32UI                          0x8236
+#define GL_RG8I                           0x8237
+#define GL_RG8UI                          0x8238
+#define GL_RG16I                          0x8239
+#define GL_RG16UI                         0x823A
+#define GL_RG32I                          0x823B
+#define GL_RG32UI                         0x823C
+#define GL_VERTEX_ARRAY_BINDING           0x85B5
+#define GL_R8_SNORM                       0x8F94
+#define GL_RG8_SNORM                      0x8F95
+#define GL_RGB8_SNORM                     0x8F96
+#define GL_RGBA8_SNORM                    0x8F97
+#define GL_SIGNED_NORMALIZED              0x8F9C
+#define GL_PRIMITIVE_RESTART_FIXED_INDEX  0x8D69
+#define GL_COPY_READ_BUFFER               0x8F36
+#define GL_COPY_WRITE_BUFFER              0x8F37
+#define GL_COPY_READ_BUFFER_BINDING       0x8F36
+#define GL_COPY_WRITE_BUFFER_BINDING      0x8F37
+#define GL_UNIFORM_BUFFER                 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING         0x8A28
+#define GL_UNIFORM_BUFFER_START           0x8A29
+#define GL_UNIFORM_BUFFER_SIZE            0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS      0x8A2B
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS    0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS    0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS    0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE         0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS          0x8A36
+#define GL_UNIFORM_TYPE                   0x8A37
+#define GL_UNIFORM_SIZE                   0x8A38
+#define GL_UNIFORM_NAME_LENGTH            0x8A39
+#define GL_UNIFORM_BLOCK_INDEX            0x8A3A
+#define GL_UNIFORM_OFFSET                 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE           0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE          0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR           0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING          0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE        0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH      0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS  0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX                  0xFFFFFFFFu
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS   0x9122
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS  0x9125
+#define GL_MAX_SERVER_WAIT_TIMEOUT        0x9111
+#define GL_OBJECT_TYPE                    0x9112
+#define GL_SYNC_CONDITION                 0x9113
+#define GL_SYNC_STATUS                    0x9114
+#define GL_SYNC_FLAGS                     0x9115
+#define GL_SYNC_FENCE                     0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE     0x9117
+#define GL_UNSIGNALED                     0x9118
+#define GL_SIGNALED                       0x9119
+#define GL_ALREADY_SIGNALED               0x911A
+#define GL_TIMEOUT_EXPIRED                0x911B
+#define GL_CONDITION_SATISFIED            0x911C
+#define GL_WAIT_FAILED                    0x911D
+#define GL_SYNC_FLUSH_COMMANDS_BIT        0x00000001
+#define GL_TIMEOUT_IGNORED                0xFFFFFFFFFFFFFFFFull
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR    0x88FE
+#define GL_ANY_SAMPLES_PASSED             0x8C2F
+#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A
+#define GL_SAMPLER_BINDING                0x8919
+#define GL_RGB10_A2UI                     0x906F
+#define GL_TEXTURE_SWIZZLE_R              0x8E42
+#define GL_TEXTURE_SWIZZLE_G              0x8E43
+#define GL_TEXTURE_SWIZZLE_B              0x8E44
+#define GL_TEXTURE_SWIZZLE_A              0x8E45
+#define GL_GREEN                          0x1904
+#define GL_BLUE                           0x1905
+#define GL_INT_2_10_10_10_REV             0x8D9F
+#define GL_TRANSFORM_FEEDBACK             0x8E22
+#define GL_TRANSFORM_FEEDBACK_PAUSED      0x8E23
+#define GL_TRANSFORM_FEEDBACK_ACTIVE      0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING     0x8E25
+#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
+#define GL_COMPRESSED_R11_EAC             0x9270
+#define GL_COMPRESSED_SIGNED_R11_EAC      0x9271
+#define GL_COMPRESSED_RG11_EAC            0x9272
+#define GL_COMPRESSED_SIGNED_RG11_EAC     0x9273
+#define GL_COMPRESSED_RGB8_ETC2           0x9274
+#define GL_COMPRESSED_SRGB8_ETC2          0x9275
+#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
+#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
+#define GL_COMPRESSED_RGBA8_ETC2_EAC      0x9278
+#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279
+#define GL_TEXTURE_IMMUTABLE_FORMAT       0x912F
+#define GL_MAX_ELEMENT_INDEX              0x8D6B
+#define GL_NUM_SAMPLE_COUNTS              0x9380
+#define GL_TEXTURE_IMMUTABLE_LEVELS       0x82DF
+
+#endif
+
 
 /*
  * EGL-related definitions
@@ -3507,8 +3820,9 @@ typedef unsigned long long EvasGLTime;
  * Version 1: GLES 2.0 + GLES2 extensions only
  * Version 2: GLES 2.0 + GLES2 extensions + GLES1 + GLES1.1 extensions
  * Version 3: [version 2] + Wayland extensions
+ * Version 4: [version 3] + GLES3.0 + GLES3.0 extensions
  */
-#define EVAS_GL_API_VERSION 3
+#define EVAS_GL_API_VERSION 4
 
 /**
  * @brief The Evas GL API
@@ -3518,7 +3832,7 @@ typedef unsigned long long EvasGLTime;
 struct _Evas_GL_API
 {
    /**
-    * The current version number is @c EVAS_GL_API_VERSION (3).
+    * The current version number is @c EVAS_GL_API_VERSION (4).
     * This should not be confused with the OpenGL-ES context version.
     */
    int            version;
@@ -4164,6 +4478,123 @@ EvasGLImage *img = glapi->evasglCreateImageForContext
     */
    Eina_Bool    (*evasglQueryWaylandBuffer) (Evas_GL *evas_gl, void *buffer, int attribute, int *value);
    /** @} */
+   // ---------------------------------------------------------------------- //
+   /**
+    * @anchor gles3
+    * @name OpenGL-ES 3.0.
+    *
+    * Evas_GL_API version 4.
+    *
+    * The following functions are supported in all OpenGL-ES 3.0 contexts.
+    * @{
+    */
+   /* This defines shows that Evas_GL_API supports GLES3 APIs */
+#define EVAS_GL_GLES3 1
+    void         (*glBeginQuery) (GLenum target, GLuint id);
+    void         (*glBeginTransformFeedback) (GLenum primitiveMode);
+    void         (*glBindBufferBase) (GLenum target, GLuint index, GLuint buffer);
+    void         (*glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+    void         (*glBindSampler) (GLuint unit, GLuint sampler);
+    void         (*glBindTransformFeedback) (GLenum target, GLuint id);
+    void         (*glBindVertexArray) (GLuint array);
+    void         (*glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+    void         (*glClearBufferfi) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil);
+    void         (*glClearBufferfv) (GLenum buffer, GLint drawBuffer, const GLfloat * value);
+    void         (*glClearBufferiv) (GLenum buffer, GLint drawBuffer, const GLint * value);
+    void         (*glClearBufferuiv) (GLenum buffer, GLint drawBuffer, const GLuint * value);
+    GLenum       (*glClientWaitSync) (GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+    void         (*glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * data);
+    void         (*glCompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid * data);
+    void         (*glCopyBufferSubData) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
+    void         (*glCopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+    void         (*glDeleteQueries) (GLsizei n, const GLuint * ids);
+    void         (*glDeleteSamplers) (GLsizei n, const GLuint * samplers);
+    void         (*glDeleteSync) (GLsync sync);
+    void         (*glDeleteTransformFeedbacks) (GLsizei n, const GLuint *ids);
+    void         (*glDeleteVertexArrays) (GLsizei n, const GLuint *arrays);
+    void         (*glDrawArraysInstanced) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
+    void         (*glDrawBuffers) (GLsizei n, const GLenum *bufs);
+    void         (*glDrawElementsInstanced) (GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount);
+    void         (*glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
+    void         (*glEndQuery) (GLenum target);
+    void         (*glEndTransformFeedback) (void);
+    GLsync       (*glFenceSync) (GLenum condition, GLbitfield flags);
+    GLsync       (*glFlushMappedBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length);
+    void         (*glFramebufferTextureLayer) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+    void         (*glGenQueries) (GLsizei n, GLuint * ids);
+    void         (*glGenSamplers) (GLsizei n, GLuint *samplers);
+    void         (*glGenTransformFeedbacks) (GLsizei n, GLuint *ids);
+    void         (*glGenVertexArrays) (GLsizei n, GLuint *arrays);
+    void         (*glGetActiveUniformBlockiv) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params);
+    void         (*glGetActiveUniformBlockName) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName);
+    void         (*glGetActiveUniformsiv) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params);
+    void         (*glGetBufferParameteri64v) (GLenum target, GLenum value, EvasGLint64 * data);
+    void         (*glGetBufferPointerv) (GLenum target, GLenum pname, GLvoid ** params);
+    GLint        (*glGetFragDataLocation) (GLuint program, const char * name);
+    void         (*glGetInteger64i_v) (GLenum target, GLuint index, EvasGLint64 * data);
+    void         (*glGetInteger64v) (GLenum pname, EvasGLint64 * data);
+    void         (*glGetIntegeri_v) (GLenum target, GLuint index, GLint * data);
+    void         (*glGetInternalformativ) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params);
+    void         (*glGetProgramBinary) (GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
+    void         (*glGetQueryiv) (GLenum target, GLenum pname, GLint * params);
+    void         (*glGetQueryObjectuiv) (GLuint id, GLenum pname, GLuint * params);
+    void         (*glGetSamplerParameterfv) (GLuint sampler, GLenum pname, GLfloat * params);
+    void         (*glGetSamplerParameteriv) (GLuint sampler, GLenum pname, GLint * params);
+    const GLubyte* (*glGetStringi) (GLenum name, GLuint index);
+    void         (*glGetSynciv) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
+    void         (*glGetTransformFeedbackVarying) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, char * name);
+    GLuint       (*glGetUniformBlockIndex) (GLuint program, const GLchar *uniformBlockName);
+    void         (*glGetUniformIndices) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices);
+    void         (*glGetUniformuiv) (GLuint program, GLint location, GLuint* params);
+    void         (*glGetVertexAttribIiv) (GLuint index, GLenum pname, GLint *params);
+    void         (*glGetVertexAttribIuiv) (GLuint index, GLenum pname, GLuint *params);
+    void         (*glInvalidateFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
+    void         (*glInvalidateSubFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+    GLboolean    (*glIsQuery) (GLuint id);
+    GLboolean    (*glIsSampler) (GLuint id);
+    GLboolean    (*glIsSync) (GLsync sync);
+    GLboolean    (*glIsTransformFeedback) (GLuint id);
+    GLboolean    (*glIsVertexArray) (GLuint array);
+    void *       (*glMapBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+    void         (*glPauseTransformFeedback) (void);
+    void         (*glProgramBinary) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
+    void         (*glProgramParameteri) (GLuint program, GLenum pname, GLint value);
+    void         (*glReadBuffer) (GLenum src);
+    void         (*glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+    void         (*glResumeTransformFeedback) (void);
+    void         (*glSamplerParameterf) (GLuint sampler, GLenum pname, GLfloat param);
+    void         (*glSamplerParameterfv) (GLuint sampler, GLenum pname, const GLfloat * params);
+    void         (*glSamplerParameteri) (GLuint sampler, GLenum pname, GLint param);
+    void         (*glSamplerParameteriv) (GLuint sampler, GLenum pname, const GLint * params);
+    void         (*glTexImage3D) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * data);
+    void         (*glTexStorage2D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+    void         (*glTexStorage3D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+    void         (*glTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid * data);
+    void         (*glTransformFeedbackVaryings) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode);
+    void         (*glUniform1ui) (GLint location, GLuint v0);
+    void         (*glUniform1uiv) (GLint location, GLsizei count, const GLuint *value);
+    void         (*glUniform2ui) (GLint location, GLuint v0, GLuint v1);
+    void         (*glUniform2uiv) (GLint location, GLsizei count, const GLuint *value);
+    void         (*glUniform3ui) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+    void         (*glUniform3uiv) (GLint location, GLsizei count, const GLuint *value);
+    void         (*glUniform4ui) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+    void         (*glUniform4uiv) (GLint location, GLsizei count, const GLuint *value);
+    void         (*glUniformBlockBinding) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+    void         (*glUniformMatrix2x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+    void         (*glUniformMatrix3x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+    void         (*glUniformMatrix2x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+    void         (*glUniformMatrix4x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+    void         (*glUniformMatrix3x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+    void         (*glUniformMatrix4x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+    GLboolean    (*glUnmapBuffer) (GLenum target);
+    void         (*glVertexAttribDivisor) (GLuint index, GLuint divisor);
+    void         (*glVertexAttribI4i) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3);
+    void         (*glVertexAttribI4iv) (GLuint index, const GLint *v);
+    void         (*glVertexAttribI4ui) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+    void         (*glVertexAttribI4uiv) (GLuint index, const GLuint *v);
+    void         (*glVertexAttribIPointer) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+    void         (*glWaitSync) (GLsync sync, GLbitfield flags, EvasGLuint64 timeout);
+   /** @} */
 
    /* Future calls will be added down here for expansion, when adding
     * new APIs here, please bump the struct version number (together with
index a0a77d9..4bfe709 100755 (executable)
@@ -1,4 +1,5 @@
 /**
+<<<<<<< HEAD
  * @internal
  * @file Evas_GL_GLES3_Helpers.h
  * @defgroup Evas_GL_GLES3_Helpers Evas GL GLES3 helpers
@@ -6,6 +7,14 @@
  */
 
 /**
+=======
+ * @ingroup Evas_GL
+ * @{
+ */
+
+/**
+ * @file Evas_GL_GLES3_Helpers.h
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  * @brief Provides a set of helper functions and macros to use GLES 3.0 with
  * @ref Evas_GL "Evas GL".
  *
@@ -25,7 +34,11 @@ if (glExtensionFunction)
  * @endcode
  *
  * When using Elementary @ref GLView, please include the header file
+<<<<<<< HEAD
  * @ref Elementary_GL_Helpers "Elementary_GL_Helpers.h" instead.
+=======
+ * @ref Elementary_GL_Helpers.h instead.
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  *
  * This header file should be included when using @ref Evas_GL "Evas GL"
  * directly at a low level and with an OpenGL-ES 3.0 context only.
@@ -33,7 +46,11 @@ if (glExtensionFunction)
  * @note When this file is included, all @c glFunctions are now macros, which
  *       means that the @ref Evas_GL_API struct can't be used anyore.
  *
+<<<<<<< HEAD
  * @see @ref elm_opengl_page
+=======
+ * @see elm_opengl_page
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  */
 #ifndef _EVAS_GL_GLES3_HELPERS_H
 #define _EVAS_GL_GLES3_HELPERS_H
@@ -44,8 +61,12 @@ if (glExtensionFunction)
 // local convenience macros
 
 /**
+<<<<<<< HEAD
  * @internal
  * @addtogroup Evas_GL_GLES3_Helpers
+=======
+ * @name Convenience functions for OpenGL-ES 3.0
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  * @{
  */
 
@@ -64,8 +85,12 @@ EVAS_GL_GLES3_USE(evasgl, context); // Add this at the beginning
 glFunction(); // All calls 'look' normal
  * @endcode
  *
+<<<<<<< HEAD
  * @note Please use @ref ELEMENTARY_GLVIEW_USE() instead, when possible.
  * @since_tizen 2.4
+=======
+ * @note Please use @ref ELEMENTARY_GL_USE() instead, when possible.
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  */
 #define EVAS_GL_GLES3_USE(evasgl, context) \
    Evas_GL_API *__evas_gl_glapi = evas_gl_context_api_get(evasgl, context);
@@ -76,18 +101,34 @@ glFunction(); // All calls 'look' normal
  * This is similar to @ref EVAS_GL_GLES3_USE except that it will return from
  * the function if the GL API can not be used.
  *
+<<<<<<< HEAD
  * @note Please use @ref ELEMENTARY_GLVIEW_USE() instead, when possible.
  * @since_tizen 2.4
+=======
+ * @note Please use @ref ELEMENTARY_GL_USE() instead, when possible.
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  */
 #define EVAS_GL_GLES3_USE_OR_RETURN(evasgl, context, retval) \
    Evas_GL_API *__evas_gl_glapi = evas_gl_context_api_get(evasgl, context); \
    if (!__evas_gl_glapi) return retval;
 
 // End of the convenience functions
+<<<<<<< HEAD
+=======
+/** @} */
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
 
 // Global convenience macros
 
 /**
+<<<<<<< HEAD
+=======
+ * @name Convenience functions for OpenGL (global definitions)
+ * @{
+ */
+
+/**
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  * @brief Convenience macro to use the GL helpers in simple applications: declare
  *
  * @c EVAS_GL_GLOBAL_GLES3_DECLARE should be used in a global header for the
@@ -105,13 +146,21 @@ EVAS_GL_GLOBAL_GLES3_DECLARE()
 // ...
  * @endcode
  *
+<<<<<<< HEAD
  * @note Please use @ref ELEMENTARY_GLVIEW_USE() instead, when possible.
+=======
+ * @note Please use @ref ELEMENTARY_GL_USE() instead, when possible.
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  *
  * @see @ref ELEMENTARY_GLVIEW_GLOBAL_DECLARE
  * @see @ref EVAS_GL_GLOBAL_GLES3_DEFINE
  * @see @ref EVAS_GL_GLOBAL_GLES3_USE
  *
+<<<<<<< HEAD
  * @since_tizen 2.4
+=======
+ * @since_tizen 2.3
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  */
 #define EVAS_GL_GLOBAL_GLES3_DECLARE() \
    extern Evas_GL_API *__evas_gl_glapi;
@@ -147,7 +196,11 @@ evgl_init(...)
  * @see @ref EVAS_GL_GLOBAL_GLES3_DECLARE
  * @see @ref EVAS_GL_GLOBAL_GLES3_USE
  *
+<<<<<<< HEAD
  * @since_tizen 2.4
+=======
+ * @since_tizen 2.3
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  */
 #define EVAS_GL_GLOBAL_GLES3_DEFINE() \
    Evas_GL_API *__evas_gl_glapi = NULL;
@@ -164,7 +217,11 @@ evgl_init(...)
  * @see @ref EVAS_GL_GLOBAL_GLES3_DECLARE
  * @see @ref EVAS_GL_GLOBAL_GLES3_DEFINE
  *
+<<<<<<< HEAD
  * @since_tizen 2.4
+=======
+ * @since_tizen 2.3
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  */
 #define EVAS_GL_GLOBAL_GLES3_USE(evgl, ctx) \
    do { __evas_gl_glapi = evas_gl_context_api_get(evgl, ctx); } while (0)
@@ -511,11 +568,15 @@ evgl_init(...)
 #define  glUniformMatrix3x4fv                    __evas_gl_glapi->glUniformMatrix3x4fv
 #define  glUniformMatrix4x3fv                    __evas_gl_glapi->glUniformMatrix4x3fv
 #define  glUnmapBuffer                           __evas_gl_glapi->glUnmapBuffer
+<<<<<<< HEAD
 #define  glVertexAttribDivisor                   __evas_gl_glapi->glVertexAttribDivisor
+=======
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
 #define  glVertexAttribI4i                       __evas_gl_glapi->glVertexAttribI4i
 #define  glVertexAttribI4iv                      __evas_gl_glapi->glVertexAttribI4iv
 #define  glVertexAttribI4ui                      __evas_gl_glapi->glVertexAttribI4ui
 #define  glVertexAttribI4uiv                     __evas_gl_glapi->glVertexAttribI4uiv
+<<<<<<< HEAD
 #define  glVertexAttribIPointer                  __evas_gl_glapi->glVertexAttribIPointer
 #define  glWaitSync                              __evas_gl_glapi->glWaitSync
 
@@ -523,13 +584,27 @@ evgl_init(...)
  * @ingroup Evas_GL_GLES3_Helpers
  * @brief Macro to check that the GL APIs are properly set (GLES 3.0)
  * @since_tizen 2.4
+=======
+#define  glWaitSync                              __evas_gl_glapi->glWaitSync
+
+/**
+ * @brief Macro to check that the GL APIs are properly set (GLES 3.0)
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
  */
 #define EVAS_GL_GLES3_API_CHECK() \
    ((__evas_gl_glapi != NULL) && (__evas_gl_glapi->version == EVAS_GL_API_VERSION) && (glBeginQuery))
 
+<<<<<<< HEAD
+=======
+#endif
+
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
 /**
  * @}
  */
 
+<<<<<<< HEAD
 #endif
 
+=======
+>>>>>>> f99ae5b... Evas GL: Add support for Evas GL 3.0
index 3373bb4..d7ec99e 100644 (file)
@@ -337,7 +337,7 @@ evas_gl_context_version_create(Evas_GL *evas_gl, Evas_GL_Context *share_ctx,
    return NULL;
    MAGIC_CHECK_END();
 
-   if ((version != EVAS_GL_GLES_1_X) && (version != EVAS_GL_GLES_2_X))
+   if ((version < EVAS_GL_GLES_1_X) || (version > EVAS_GL_GLES_3_X))
      {
         ERR("Can not create an OpenGL-ES %d.x context (not supported).",
             (int) version);
index 693d4e2..0f592d4 100644 (file)
@@ -1,5 +1,6 @@
 #include "evas_gl_core_private.h"
 #include "evas_gl_api_ext.h"
+#include <dlfcn.h>
 
 #define EVGL_FUNC_BEGIN() \
 { \
@@ -10,7 +11,8 @@
 #define _EVGL_INT_INIT_VALUE -3
 
 extern int _evas_gl_log_level;
-
+static void *_gles3_handle = NULL;
+static Evas_GL_API _gles3_api;
 //---------------------------------------//
 // API Debug Error Checking Code
 static
@@ -22,7 +24,7 @@ void _make_current_check(const char* api)
 
    if (!ctx)
      CRI("\e[1;33m%s\e[m: Current Context NOT SET: GL Call Should NOT Be Called without MakeCurrent!!!", api);
-   else if (ctx->version != EVAS_GL_GLES_2_X)
+   else if ((ctx->version != EVAS_GL_GLES_2_X) && (ctx->version != EVAS_GL_GLES_3_X))
      CRI("\e[1;33m%s\e[m: This API is being called with the wrong context (invalid version).", api);
 }
 
@@ -712,7 +714,7 @@ _evgl_glGetString(GLenum name)
         ret = glGetString(GL_VERSION);
         if (!ret) return NULL;
 #ifdef GL_GLES
-        if (ret[11] != (GLubyte) '2')
+        if ((ret[10] != (GLubyte) '2') && (ret[10] != (GLubyte) '3'))
           {
              // We try not to remove the vendor fluff
              snprintf(_version, sizeof(_version), "OpenGL ES 2.0 Evas GL (%s)", ((char *) ret) + 10);
@@ -728,8 +730,8 @@ _evgl_glGetString(GLenum name)
 #endif
 
       case GL_EXTENSIONS:
-        // No need to check context version, this is GLESv2 API.
-        return (GLubyte *) evgl_api_ext_string_get(EINA_TRUE, EINA_FALSE);
+        // Passing the verion -  GLESv2/GLESv3.
+        return (GLubyte *) evgl_api_ext_string_get(EINA_TRUE, rsc->current_ctx->version);
 
       default:
         // GL_INVALID_ENUM is generated if name is not an accepted value.
@@ -996,1276 +998,3622 @@ _evgl_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
 //-------------------------------------------------------------//
 
 
-
-//-------------------------------------------------------------//
-// Debug Evas GL APIs
-//  - GL APIs Overriden for debugging purposes
 //-------------------------------------------------------------//
+// Open GLES 3.0 APIs
 
-void
-_evgld_glActiveTexture(GLenum texture)
+
+static void
+_evgl_glReadBuffer(GLenum mode)
 {
-   EVGL_FUNC_BEGIN();
-   glActiveTexture(texture);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glReadBuffer)
+     return;
+   _gles3_api.glReadBuffer(mode);
 }
 
-void
-_evgld_glAttachShader(GLuint program, GLuint shader)
+static void
+_evgl_glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
 {
-   EVGL_FUNC_BEGIN();
-   glAttachShader(program, shader);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glDrawRangeElements)
+     return;
+   _gles3_api.glDrawRangeElements(mode, start, end, count, type, indices);
 }
 
-void
-_evgld_glBindAttribLocation(GLuint program, GLuint idx, const char* name)
+static void
+_evgl_glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
 {
-   EVGL_FUNC_BEGIN();
-   glBindAttribLocation(program, idx, name);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glTexImage3D)
+     return;
+   _gles3_api.glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
 }
 
-void
-_evgld_glBindBuffer(GLenum target, GLuint buffer)
+static void
+_evgl_glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
 {
-   EVGL_FUNC_BEGIN();
-   glBindBuffer(target, buffer);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glTexSubImage3D)
+     return;
+   _gles3_api.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
 }
 
-void
-_evgld_glBindFramebuffer(GLenum target, GLuint framebuffer)
+static void
+_evgl_glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
 {
-   EVGL_FUNC_BEGIN();
-
-   _evgl_glBindFramebuffer(target, framebuffer);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glCopyTexSubImage3D)
+     return;
+   _gles3_api.glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
 }
 
-void
-_evgld_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+static void
+_evgl_glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
 {
-   EVGL_FUNC_BEGIN();
-   glBindRenderbuffer(target, renderbuffer);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glCompressedTexImage3D)
+     return;
+   _gles3_api.glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
 }
 
-void
-_evgld_glBindTexture(GLenum target, GLuint texture)
+static void
+_evgl_glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
 {
-   EVGL_FUNC_BEGIN();
-   glBindTexture(target, texture);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glCompressedTexSubImage3D)
+     return;
+   _gles3_api.glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
 }
 
-void
-_evgld_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+static void
+_evgl_glGenQueries(GLsizei n, GLuint *ids)
 {
-   EVGL_FUNC_BEGIN();
-   glBlendColor(red, green, blue, alpha);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glGenQueries)
+     return;
+   _gles3_api.glGenQueries(n, ids);
 }
 
-void
-_evgld_glBlendEquation(GLenum mode)
+static void
+_evgl_glDeleteQueries(GLsizei n, const GLuint *ids)
 {
-   EVGL_FUNC_BEGIN();
-   glBlendEquation(mode);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glDeleteQueries)
+     return;
+   _gles3_api.glDeleteQueries(n, ids);
 }
 
-void
-_evgld_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+static GLboolean
+ _evgl_glIsQuery(GLuint id)
 {
-   EVGL_FUNC_BEGIN();
-   glBlendEquationSeparate(modeRGB, modeAlpha);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   GLboolean ret;
+   if (!_gles3_api.glIsQuery)
+     return EINA_FALSE;
+   ret = _gles3_api.glIsQuery(id);
+   return ret;
 }
 
-void
-_evgld_glBlendFunc(GLenum sfactor, GLenum dfactor)
+static void
+_evgl_glBeginQuery(GLenum target, GLuint id)
 {
-   EVGL_FUNC_BEGIN();
-   glBlendFunc(sfactor, dfactor);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glBeginQuery)
+     return;
+   _gles3_api.glBeginQuery(target, id);
 }
 
-void
-_evgld_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+static void
+_evgl_glEndQuery(GLenum target)
 {
-   EVGL_FUNC_BEGIN();
-   glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glEndQuery)
+     return;
+   _gles3_api.glEndQuery(target);
 }
 
-void
-_evgld_glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
+static void
+_evgl_glGetQueryiv(GLenum target, GLenum pname, GLint *params)
 {
-   EVGL_FUNC_BEGIN();
-   glBufferData(target, size, data, usage);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glGetQueryiv)
+     return;
+   _gles3_api.glGetQueryiv(target, pname, params);
 }
 
-void
-_evgld_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
+static void
+_evgl_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
 {
-   EVGL_FUNC_BEGIN();
-   glBufferSubData(target, offset, size, data);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glGetQueryObjectuiv)
+     return;
+   _gles3_api.glGetQueryObjectuiv(id, pname, params);
 }
 
-GLenum
-_evgld_glCheckFramebufferStatus(GLenum target)
+static GLboolean
+_evgl_glUnmapBuffer(GLenum target)
 {
-   GLenum ret = GL_NONE;
-
-   EVGL_FUNC_BEGIN();
-   ret = glCheckFramebufferStatus(target);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   GLboolean ret;
+   if (!_gles3_api.glUnmapBuffer)
+     return EINA_FALSE;
+   ret = _gles3_api.glUnmapBuffer(target);
    return ret;
 }
 
-void
-_evgld_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+static void
+_evgl_glGetBufferPointerv(GLenum target, GLenum pname, GLvoid **params)
 {
-   EVGL_FUNC_BEGIN();
-   _evgl_glClearColor(red, green, blue, alpha);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glGetBufferPointerv)
+     return;
+   _gles3_api.glGetBufferPointerv(target, pname, params);
 }
 
-void
-_evgld_glClearDepthf(GLclampf depth)
+static void
+_evgl_glDrawBuffers(GLsizei n, const GLenum *bufs)
 {
-   EVGL_FUNC_BEGIN();
-
-   _evgl_glClearDepthf(depth);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   if (!_gles3_api.glDrawBuffers)
+     return;
+   _gles3_api.glDrawBuffers(n, bufs);
+}
 
-   EVGL_FUNC_END();
+static void
+_evgl_glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
+{
+   if (!_gles3_api.glUniformMatrix2x3fv)
+     return;
+   _gles3_api.glUniformMatrix2x3fv(location, count, transpose, value);
 }
 
-void
-_evgld_glClearStencil(GLint s)
+static void
+_evgl_glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   EVGL_FUNC_BEGIN();
-   glClearStencil(s);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glUniformMatrix3x2fv)
+     return;
+   _gles3_api.glUniformMatrix3x2fv(location, count, transpose, value);
 }
 
-void
-_evgld_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+static void
+_evgl_glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   EVGL_FUNC_BEGIN();
-   glColorMask(red, green, blue, alpha);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glUniformMatrix2x4fv)
+     return;
+   _gles3_api.glUniformMatrix2x4fv(location, count, transpose, value);
 }
 
-void
-_evgld_glCompileShader(GLuint shader)
+static void
+_evgl_glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   EVGL_FUNC_BEGIN();
-   glCompileShader(shader);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glUniformMatrix4x2fv)
+     return;
+   _gles3_api.glUniformMatrix4x2fv(location, count, transpose, value);
 }
 
-void
-_evgld_glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
+static void
+_evgl_glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   EVGL_FUNC_BEGIN();
-   glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glUniformMatrix3x4fv)
+     return;
+   _gles3_api.glUniformMatrix3x4fv(location, count, transpose, value);
 }
 
-void
-_evgld_glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
+static void
+_evgl_glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
-   EVGL_FUNC_BEGIN();
-   glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glUniformMatrix4x3fv)
+     return;
+   _gles3_api.glUniformMatrix4x3fv(location, count, transpose, value);
 }
 
-void
-_evgld_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+static void
+_evgl_glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
 {
-   EVGL_FUNC_BEGIN();
-   glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glBlitFramebuffer)
+     return;
+   _gles3_api.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
 }
 
-void
-_evgld_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+static void
+_evgl_glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
 {
-   EVGL_FUNC_BEGIN();
-   glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glRenderbufferStorageMultisample)
+     return;
+   _gles3_api.glRenderbufferStorageMultisample(target, samples, internalformat, width, height);
 }
 
-GLuint
-_evgld_glCreateProgram(void)
+static void
+_evgl_glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
 {
-   GLuint ret = _EVGL_INT_INIT_VALUE;
+   if (!_gles3_api.glFramebufferTextureLayer)
+     return;
+   _gles3_api.glFramebufferTextureLayer(target, attachment, texture, level, layer);
+}
 
-   EVGL_FUNC_BEGIN();
-   ret = glCreateProgram();
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+static void*
+_evgl_glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+{
+   void* ret;
+   if (!_gles3_api.glMapBufferRange)
+     return NULL;
+   ret = _gles3_api.glMapBufferRange(target, offset, length, access);
    return ret;
 }
 
-GLuint
-_evgld_glCreateShader(GLenum type)
+static GLsync
+_evgl_glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
 {
-   GLuint ret = _EVGL_INT_INIT_VALUE;
-   EVGL_FUNC_BEGIN();
-   ret = glCreateShader(type);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   GLsync ret;
+   if (!_gles3_api.glFlushMappedBufferRange)
+     return 0;
+   ret = _gles3_api.glFlushMappedBufferRange(target, offset, length);
    return ret;
 }
 
-void
-_evgld_glCullFace(GLenum mode)
+static void
+_evgl_glBindVertexArray(GLuint array)
 {
-   EVGL_FUNC_BEGIN();
-   glCullFace(mode);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glBindVertexArray)
+     return;
+   _gles3_api.glBindVertexArray(array);
 }
 
-void
-_evgld_glDeleteBuffers(GLsizei n, const GLuint* buffers)
+static void
+_evgl_glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
 {
-   EVGL_FUNC_BEGIN();
-   glDeleteBuffers(n, buffers);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glDeleteVertexArrays)
+     return;
+   _gles3_api.glDeleteVertexArrays(n, arrays);
 }
 
-void
-_evgld_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
+static void
+_evgl_glGenVertexArrays(GLsizei n, GLuint *arrays)
 {
-   EVGL_FUNC_BEGIN();
-   glDeleteFramebuffers(n, framebuffers);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glGenVertexArrays)
+     return;
+   _gles3_api.glGenVertexArrays(n, arrays);
 }
 
-void
-_evgld_glDeleteProgram(GLuint program)
+static GLboolean
+_evgl_glIsVertexArray(GLuint array)
 {
-   EVGL_FUNC_BEGIN();
-   glDeleteProgram(program);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   GLboolean ret;
+   if (!_gles3_api.glIsVertexArray)
+     return EINA_FALSE;
+   ret = _gles3_api.glIsVertexArray(array);
+   return ret;
 }
 
-void
-_evgld_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
+static void
+_evgl_glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
 {
-   EVGL_FUNC_BEGIN();
-   glDeleteRenderbuffers(n, renderbuffers);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glGetIntegeri_v)
+     return;
+   _gles3_api.glGetIntegeri_v(target, index, data);
 }
 
-void
-_evgld_glDeleteShader(GLuint shader)
+static void
+_evgl_glBeginTransformFeedback(GLenum primitiveMode)
 {
-   EVGL_FUNC_BEGIN();
-   glDeleteShader(shader);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glBeginTransformFeedback)
+     return;
+   _gles3_api.glBeginTransformFeedback(primitiveMode);
 }
 
-void
-_evgld_glDeleteTextures(GLsizei n, const GLuint* textures)
+static void
+_evgl_glEndTransformFeedback(void)
 {
-   EVGL_FUNC_BEGIN();
-   glDeleteTextures(n, textures);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glEndTransformFeedback)
+     return;
+   _gles3_api.glEndTransformFeedback();
 }
 
-void
-_evgld_glDepthFunc(GLenum func)
+static void
+_evgl_glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
 {
-   EVGL_FUNC_BEGIN();
-   glDepthFunc(func);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (!_gles3_api.glBindBufferRange)
+     return;
+   _gles3_api.glBindBufferRange(target, index, buffer, offset, size);
+}
+
+static void
+_evgl_glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
+{
+   if (!_gles3_api.glBindBufferBase)
+     return;
+   _gles3_api.glBindBufferBase(target, index, buffer);
+}
+
+static void
+_evgl_glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode)
+{
+   if (!_gles3_api.glTransformFeedbackVaryings)
+     return;
+   _gles3_api.glTransformFeedbackVaryings(program, count, varyings, bufferMode);
+}
+
+static void
+_evgl_glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
+{
+   if (!_gles3_api.glGetTransformFeedbackVarying)
+     return;
+   _gles3_api.glGetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
+}
+
+static void
+_evgl_glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
+{
+   if (!_gles3_api.glVertexAttribIPointer)
+     return;
+   _gles3_api.glVertexAttribIPointer(index, size, type, stride, pointer);
+}
+
+static void
+_evgl_glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
+{
+   if (!_gles3_api.glGetVertexAttribIiv)
+     return;
+   _gles3_api.glGetVertexAttribIiv(index, pname, params);
+}
+
+static void
+_evgl_glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
+{
+   if (!_gles3_api.glGetVertexAttribIuiv)
+     return;
+   _gles3_api.glGetVertexAttribIuiv(index, pname, params);
+}
+
+static void
+_evgl_glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+{
+   if (!_gles3_api.glVertexAttribI4i)
+     return;
+   _gles3_api.glVertexAttribI4i(index, x, y, z,  w);
+}
+
+static void
+_evgl_glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+{
+   if (!_gles3_api.glVertexAttribI4ui)
+     return;
+   _gles3_api.glVertexAttribI4ui(index, x, y, z, w);
+}
+
+static void
+_evgl_glVertexAttribI4iv(GLuint index, const GLint *v)
+{
+   if (!_gles3_api.glVertexAttribI4iv)
+     return;
+   _gles3_api.glVertexAttribI4iv(index, v);
+}
+
+static void
+_evgl_glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+   if (!_gles3_api.glVertexAttribI4uiv)
+     return;
+   _gles3_api.glVertexAttribI4uiv(index, v);
+}
+
+static void
+_evgl_glGetUniformuiv(GLuint program, GLint location, GLuint *params)
+{
+   if (!_gles3_api.glGetUniformuiv)
+     return;
+   _gles3_api.glGetUniformuiv(program, location, params);
+}
+
+static GLint
+_evgl_glGetFragDataLocation(GLuint program, const GLchar *name)
+{
+   GLint ret;
+   if (!_gles3_api.glGetFragDataLocation)
+     return EVAS_GL_NOT_INITIALIZED;
+   ret = _gles3_api.glGetFragDataLocation(program, name);
+   return ret;
+}
+
+static void
+_evgl_glUniform1ui(GLint location, GLuint v0)
+{
+   if (!_gles3_api.glUniform1ui)
+     return;
+   _gles3_api.glUniform1ui(location, v0);
+}
+
+static void
+_evgl_glUniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+   if (!_gles3_api.glUniform2ui)
+     return;
+   _gles3_api.glUniform2ui(location, v0, v1);
+}
+
+static void
+_evgl_glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+   if (!_gles3_api.glUniform3ui)
+     return;
+   _gles3_api.glUniform3ui(location, v0, v1, v2);
+}
+
+static void
+_evgl_glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+   if (!_gles3_api.glUniform4ui)
+     return;
+   _gles3_api.glUniform4ui(location, v0, v1, v2, v3);
+}
+
+static void
+_evgl_glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+   if (!_gles3_api.glUniform1uiv)
+     return;
+   _gles3_api.glUniform1uiv(location, count, value);
+}
+
+static void
+_evgl_glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+   if (!_gles3_api.glUniform2uiv)
+     return;
+   _gles3_api.glUniform2uiv(location, count, value);
+}
+
+static void
+_evgl_glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+   if (!_gles3_api.glUniform3uiv)
+     return;
+   _gles3_api.glUniform3uiv(location, count, value);
+}
+
+static void
+_evgl_glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+   if (!_gles3_api.glUniform4uiv)
+     return;
+   _gles3_api.glUniform4uiv(location, count, value);
+}
+
+static void
+_evgl_glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+   if (!_gles3_api.glClearBufferiv)
+     return;
+   _gles3_api.glClearBufferiv(buffer, drawbuffer, value);
+}
+
+static void
+_evgl_glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+   if (!_gles3_api.glClearBufferuiv)
+     return;
+   _gles3_api.glClearBufferuiv(buffer, drawbuffer, value);
+}
+
+static void
+_evgl_glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+   if (!_gles3_api.glClearBufferfv)
+     return;
+   _gles3_api.glClearBufferfv(buffer, drawbuffer, value);
+}
+
+static void
+_evgl_glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+{
+   if (!_gles3_api.glClearBufferfi)
+     return;
+   _gles3_api.glClearBufferfi(buffer, drawbuffer, depth, stencil);
+}
+
+static const GLubyte *
+ _evgl_glGetStringi(GLenum name, GLuint index)
+{
+   const GLubyte *ret;
+   if (!_gles3_api.glGetStringi)
+     return NULL;
+   ret = _gles3_api.glGetStringi(name, index);
+   return ret;
+}
+
+static void
+_evgl_glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+{
+   if (!_gles3_api.glCopyBufferSubData)
+     return;
+   _gles3_api.glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
+}
+
+static void
+_evgl_glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices)
+{
+   if (!_gles3_api.glGetUniformIndices)
+     return;
+   _gles3_api.glGetUniformIndices(program, uniformCount, uniformNames,uniformIndices);
+}
+
+static void
+_evgl_glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
+{
+   if (!_gles3_api.glGetActiveUniformsiv)
+     return;
+   _gles3_api.glGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
+}
+
+static GLuint
+_evgl_glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
+{
+   GLuint ret;
+   if (!_gles3_api.glGetUniformBlockIndex)
+     return EVAS_GL_NOT_INITIALIZED;
+   ret = _gles3_api.glGetUniformBlockIndex(program, uniformBlockName);
+   return ret;
+}
+
+static void
+_evgl_glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
+{
+   if (!_gles3_api.glGetActiveUniformBlockiv)
+     return;
+   _gles3_api.glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
+}
+
+static void
+_evgl_glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
+{
+   if (!_gles3_api.glGetActiveUniformBlockName)
+     return;
+   _gles3_api.glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
+}
+
+static void
+_evgl_glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+{
+   if (!_gles3_api.glUniformBlockBinding)
+     return;
+   _gles3_api.glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
+}
+
+static void
+_evgl_glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
+{
+   if (!_gles3_api.glDrawArraysInstanced)
+     return;
+   _gles3_api.glDrawArraysInstanced(mode, first, count, instancecount);
+}
+
+static void
+_evgl_glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
+{
+   if (!_gles3_api.glDrawElementsInstanced)
+     return;
+   _gles3_api.glDrawElementsInstanced(mode, count, type, indices, instancecount);
+}
+
+static GLsync
+_evgl_glFenceSync(GLenum condition, GLbitfield flags)
+{
+   GLsync ret;
+   if (!_gles3_api.glFenceSync)
+     return 0;
+   ret = _gles3_api.glFenceSync(condition, flags);
+   return ret;
+}
+
+static GLboolean
+_evgl_glIsSync(GLsync sync)
+{
+   GLboolean ret;
+   if (!_gles3_api.glIsSync)
+     return EINA_FALSE;
+   ret = _gles3_api.glIsSync(sync);
+   return ret;
+}
+
+static void
+_evgl_glDeleteSync(GLsync sync)
+{
+   if (!_gles3_api.glDeleteSync)
+     return;
+   _gles3_api.glDeleteSync(sync);
+}
+
+static GLenum
+_evgl_glClientWaitSync(GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
+{
+   GLenum ret;
+   if (!_gles3_api.glClientWaitSync)
+     return EVAS_GL_NOT_INITIALIZED;
+   ret = _gles3_api.glClientWaitSync(sync, flags, timeout);
+   return ret;
+}
+
+static void
+_evgl_glWaitSync(GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
+{
+   if (!_gles3_api.glWaitSync)
+     return;
+   _gles3_api.glWaitSync(sync, flags, timeout);
+}
+
+static void
+_evgl_glGetInteger64v(GLenum pname, EvasGLint64 *params)
+{
+   if (!_gles3_api.glGetInteger64v)
+     return;
+   _gles3_api.glGetInteger64v(pname, params);
+}
+
+static void
+_evgl_glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
+{
+   if (!_gles3_api.glGetSynciv)
+     return;
+   _gles3_api.glGetSynciv(sync, pname, bufSize, length, values);
+}
+
+static void
+_evgl_glGetInteger64i_v(GLenum target, GLuint index, EvasGLint64 *data)
+{
+   if (!_gles3_api.glGetInteger64i_v)
+     return;
+   _gles3_api.glGetInteger64i_v(target, index, data);
+}
+
+static void
+_evgl_glGetBufferParameteri64v(GLenum target, GLenum pname, EvasGLint64 *params)
+{
+   if (!_gles3_api.glGetBufferParameteri64v)
+     return;
+   _gles3_api.glGetBufferParameteri64v(target, pname, params);
+}
+
+static void
+_evgl_glGenSamplers(GLsizei count, GLuint *samplers)
+{
+   if (!_gles3_api.glGenSamplers)
+     return;
+   _gles3_api.glGenSamplers(count, samplers);
+}
+
+static void
+_evgl_glDeleteSamplers(GLsizei count, const GLuint *samplers)
+{
+   if (!_gles3_api.glDeleteSamplers)
+     return;
+   _gles3_api.glDeleteSamplers(count, samplers);
+}
+
+static GLboolean
+_evgl_glIsSampler(GLuint sampler)
+{
+   GLboolean ret;
+   if (!_gles3_api.glIsSampler)
+     return EINA_FALSE;
+   ret = _gles3_api.glIsSampler(sampler);
+   return ret;
+}
+
+static void
+_evgl_glBindSampler(GLuint unit, GLuint sampler)
+{
+   if (!_gles3_api.glBindSampler)
+     return;
+   _gles3_api.glBindSampler(unit, sampler);
+}
+
+static void
+_evgl_glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+{
+   if (!_gles3_api.glSamplerParameteri)
+     return;
+   _gles3_api.glSamplerParameteri(sampler, pname, param);
+}
+
+static void
+_evgl_glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
+{
+   if (!_gles3_api.glSamplerParameteriv)
+     return;
+   _gles3_api.glSamplerParameteriv(sampler, pname, param);
+}
+
+static void
+_evgl_glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+{
+   if (!_gles3_api.glSamplerParameterf)
+     return;
+   _gles3_api.glSamplerParameterf(sampler, pname, param);
+}
+
+static void
+_evgl_glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
+{
+   if (!_gles3_api.glSamplerParameterfv)
+     return;
+   _gles3_api.glSamplerParameterfv(sampler, pname, param);
+}
+
+static void
+_evgl_glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
+{
+   if (!_gles3_api.glGetSamplerParameteriv)
+     return;
+   _gles3_api.glGetSamplerParameteriv(sampler, pname, params);
+}
+
+static void
+_evgl_glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
+{
+   if (!_gles3_api.glGetSamplerParameterfv)
+     return;
+   _gles3_api.glGetSamplerParameterfv(sampler, pname, params);
+}
+
+static void
+_evgl_glVertexAttribDivisor(GLuint index, GLuint divisor)
+{
+   if (!_gles3_api.glVertexAttribDivisor)
+     return;
+   _gles3_api.glVertexAttribDivisor(index, divisor);
+}
+
+static void
+_evgl_glBindTransformFeedback(GLenum target, GLuint id)
+{
+   if (!_gles3_api.glBindTransformFeedback)
+     return;
+   _gles3_api.glBindTransformFeedback(target, id);
+}
+
+static void
+_evgl_glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
+{
+   if (!_gles3_api.glDeleteTransformFeedbacks)
+     return;
+   _gles3_api.glDeleteTransformFeedbacks(n, ids);
+}
+
+static void
+_evgl_glGenTransformFeedbacks(GLsizei n, GLuint *ids)
+{
+   if (!_gles3_api.glGenTransformFeedbacks)
+     return;
+   _gles3_api.glGenTransformFeedbacks(n, ids);
+}
+
+static GLboolean
+_evgl_glIsTransformFeedback(GLuint id)
+{
+   GLboolean ret;
+   if (!_gles3_api.glIsTransformFeedback)
+     return EINA_FALSE;
+   ret = _gles3_api.glIsTransformFeedback(id);
+   return ret;
+}
+
+static void
+_evgl_glPauseTransformFeedback(void)
+{
+   if (!_gles3_api.glPauseTransformFeedback)
+     return;
+   _gles3_api.glPauseTransformFeedback();
+}
+
+static void
+_evgl_glResumeTransformFeedback(void)
+{
+   if (!_gles3_api.glResumeTransformFeedback)
+     return;
+   _gles3_api.glResumeTransformFeedback();
+}
+
+static void
+_evgl_glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
+{
+   if (!_gles3_api.glGetProgramBinary)
+     return;
+   _gles3_api.glGetProgramBinary(program, bufSize, length, binaryFormat, binary);
+}
+
+static void
+_evgl_glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
+{
+   if (!_gles3_api.glProgramBinary)
+     return;
+   _gles3_api.glProgramBinary(program, binaryFormat, binary, length);
+}
+
+static void
+_evgl_glProgramParameteri(GLuint program, GLenum pname, GLint value)
+{
+   if (!_gles3_api.glProgramParameteri)
+     return;
+   _gles3_api.glProgramParameteri(program, pname, value);
+}
+
+static void
+_evgl_glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
+{
+   if (!_gles3_api.glInvalidateFramebuffer)
+     return;
+   _gles3_api.glInvalidateFramebuffer(target, numAttachments, attachments);
+}
+
+static void
+_evgl_glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+   if (!_gles3_api.glInvalidateSubFramebuffer)
+     return;
+   _gles3_api.glInvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
+}
+
+static void
+_evgl_glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+{
+   if (!_gles3_api.glTexStorage2D)
+     return;
+   _gles3_api.glTexStorage2D(target, levels, internalformat, width, height);
+}
+
+static void
+_evgl_glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+{
+   if (!_gles3_api.glTexStorage3D)
+     return;
+   _gles3_api.glTexStorage3D(target, levels, internalformat, width, height, depth);
+}
+
+static void
+_evgl_glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
+{
+   if (!_gles3_api.glGetInternalformativ)
+     return;
+   _gles3_api.glGetInternalformativ(target, internalformat, pname, bufSize, params);
+}
+
+//-------------------------------------------------------------//
+// Debug Evas GL APIs
+//  - GL APIs Overriden for debugging purposes
+//-------------------------------------------------------------//
+
+void
+_evgld_glActiveTexture(GLenum texture)
+{
+   EVGL_FUNC_BEGIN();
+   glActiveTexture(texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glAttachShader(GLuint program, GLuint shader)
+{
+   EVGL_FUNC_BEGIN();
+   glAttachShader(program, shader);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glBindAttribLocation(GLuint program, GLuint idx, const char* name)
+{
+   EVGL_FUNC_BEGIN();
+   glBindAttribLocation(program, idx, name);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glBindBuffer(GLenum target, GLuint buffer)
+{
+   EVGL_FUNC_BEGIN();
+   glBindBuffer(target, buffer);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glBindFramebuffer(GLenum target, GLuint framebuffer)
+{
+   EVGL_FUNC_BEGIN();
+
+   _evgl_glBindFramebuffer(target, framebuffer);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glBindRenderbuffer(GLenum target, GLuint renderbuffer)
+{
+   EVGL_FUNC_BEGIN();
+   glBindRenderbuffer(target, renderbuffer);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glBindTexture(GLenum target, GLuint texture)
+{
+   EVGL_FUNC_BEGIN();
+   glBindTexture(target, texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glBlendEquation(GLenum mode)
+{
+   EVGL_FUNC_BEGIN();
+   glBlendEquation(mode);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
+{
+   EVGL_FUNC_BEGIN();
+   glBlendEquationSeparate(modeRGB, modeAlpha);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glBlendFunc(GLenum sfactor, GLenum dfactor)
+{
+   EVGL_FUNC_BEGIN();
+   glBlendFunc(sfactor, dfactor);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   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__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+GLenum
+_evgld_glCheckFramebufferStatus(GLenum target)
+{
+   GLenum ret = GL_NONE;
+
+   EVGL_FUNC_BEGIN();
+   ret = glCheckFramebufferStatus(target);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+void
+_evgld_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+{
+   EVGL_FUNC_BEGIN();
+   _evgl_glClearColor(red, green, blue, alpha);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glClearDepthf(GLclampf depth)
+{
+   EVGL_FUNC_BEGIN();
+
+   _evgl_glClearDepthf(depth);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glClearStencil(GLint s)
+{
+   EVGL_FUNC_BEGIN();
+   glClearStencil(s);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glCompileShader(GLuint shader)
+{
+   EVGL_FUNC_BEGIN();
+   glCompileShader(shader);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   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__, "");
+   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__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+GLuint
+_evgld_glCreateProgram(void)
+{
+   GLuint ret = _EVGL_INT_INIT_VALUE;
+
+   EVGL_FUNC_BEGIN();
+   ret = glCreateProgram();
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+void
+_evgld_glCullFace(GLenum mode)
+{
+   EVGL_FUNC_BEGIN();
+   glCullFace(mode);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDeleteBuffers(GLsizei n, const GLuint* buffers)
+{
+   EVGL_FUNC_BEGIN();
+   glDeleteBuffers(n, buffers);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
+{
+   EVGL_FUNC_BEGIN();
+   glDeleteFramebuffers(n, framebuffers);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDeleteProgram(GLuint program)
+{
+   EVGL_FUNC_BEGIN();
+   glDeleteProgram(program);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
+{
+   EVGL_FUNC_BEGIN();
+   glDeleteRenderbuffers(n, renderbuffers);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDeleteShader(GLuint shader)
+{
+   EVGL_FUNC_BEGIN();
+   glDeleteShader(shader);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDeleteTextures(GLsizei n, const GLuint* textures)
+{
+   EVGL_FUNC_BEGIN();
+   glDeleteTextures(n, textures);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDepthFunc(GLenum func)
+{
+   EVGL_FUNC_BEGIN();
+   glDepthFunc(func);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDepthMask(GLboolean flag)
+{
+   EVGL_FUNC_BEGIN();
+   glDepthMask(flag);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDepthRangef(GLclampf zNear, GLclampf zFar)
+{
+   EVGL_FUNC_BEGIN();
+
+   _evgl_glDepthRangef(zNear, zFar);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDetachShader(GLuint program, GLuint shader)
+{
+   EVGL_FUNC_BEGIN();
+   glDetachShader(program, shader);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDisableVertexAttribArray(GLuint idx)
+{
+   EVGL_FUNC_BEGIN();
+   glDisableVertexAttribArray(idx);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDrawArrays(GLenum mode, GLint first, GLsizei count)
+{
+   EVGL_FUNC_BEGIN();
+   glDrawArrays(mode, first, count);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glEnableVertexAttribArray(GLuint idx)
+{
+   EVGL_FUNC_BEGIN();
+   glEnableVertexAttribArray(idx);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glFinish(void)
+{
+   EVGL_FUNC_BEGIN();
+   glFinish();
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glFlush(void)
+{
+   EVGL_FUNC_BEGIN();
+   glFlush();
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glFrontFace(GLenum mode)
+{
+   EVGL_FUNC_BEGIN();
+   glFrontFace(mode);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetVertexAttribfv(GLuint idx, GLenum pname, GLfloat* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetVertexAttribfv(idx, pname, params);
+
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetVertexAttribiv(GLuint idx, GLenum pname, GLint* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetVertexAttribiv(idx, pname, params);
+
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetVertexAttribPointerv(GLuint idx, GLenum pname, void** pointer)
+{
+   EVGL_FUNC_BEGIN();
+   glGetVertexAttribPointerv(idx, pname, pointer);
+
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glHint(GLenum target, GLenum mode)
+{
+   EVGL_FUNC_BEGIN();
+   glHint(target, mode);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGenBuffers(GLsizei n, GLuint* buffers)
+{
+   EVGL_FUNC_BEGIN();
+   glGenBuffers(n, buffers);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGenerateMipmap(GLenum target)
+{
+   EVGL_FUNC_BEGIN();
+   glGenerateMipmap(target);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGenFramebuffers(GLsizei n, GLuint* framebuffers)
+{
+   EVGL_FUNC_BEGIN();
+   glGenFramebuffers(n, framebuffers);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
+{
+   EVGL_FUNC_BEGIN();
+   glGenRenderbuffers(n, renderbuffers);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGenTextures(GLsizei n, GLuint* textures)
+{
+   EVGL_FUNC_BEGIN();
+   glGenTextures(n, textures);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetActiveAttrib(GLuint program, GLuint idx, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
+{
+   EVGL_FUNC_BEGIN();
+   glGetActiveAttrib(program, idx, bufsize, length, size, type, name);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetActiveUniform(GLuint program, GLuint idx, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
+{
+   EVGL_FUNC_BEGIN();
+   glGetActiveUniform(program, idx, bufsize, length, size, type, name);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   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__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+void
+_evgld_glGetBooleanv(GLenum pname, GLboolean* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetBooleanv(pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetBufferParameteriv(target, pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+GLenum
+_evgld_glGetError(void)
+{
+   GLenum ret = GL_NONE;
+
+   EVGL_FUNC_BEGIN();
+   ret = glGetError();
+   EVGL_FUNC_END();
+   return ret;
+}
+
+void
+_evgld_glGetFloatv(GLenum pname, GLfloat* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetFloatv(pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetProgramiv(GLuint program, GLenum pname, GLint* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetProgramiv(program, pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetRenderbufferParameteriv(target, pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetShaderiv(shader, pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   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__, "");
+
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+const GLubyte *
+_evgld_glGetString(GLenum name)
+{
+   const GLubyte *ret = NULL;
+
+   EVGL_FUNC_BEGIN();
+   ret = _evgl_glGetString(name);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetTexParameteriv(target, pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetUniformfv(GLuint program, GLint location, GLfloat* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetUniformfv(program, location, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetUniformiv(GLuint program, GLint location, GLint* params)
+{
+   EVGL_FUNC_BEGIN();
+   glGetUniformiv(program, location, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+GLboolean
+_evgld_glIsBuffer(GLuint buffer)
+{
+   GLboolean ret = GL_FALSE;
+
+   EVGL_FUNC_BEGIN();
+   ret = glIsBuffer(buffer);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+GLboolean
+_evgld_glIsEnabled(GLenum cap)
+{
+   GLboolean ret = GL_FALSE;
+
+   EVGL_FUNC_BEGIN();
+   ret = glIsEnabled(cap);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+GLboolean
+_evgld_glIsFramebuffer(GLuint framebuffer)
+{
+   GLboolean ret = GL_FALSE;
+
+   EVGL_FUNC_BEGIN();
+   ret = glIsFramebuffer(framebuffer);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+GLboolean
+_evgld_glIsProgram(GLuint program)
+{
+   GLboolean ret;
+   EVGL_FUNC_BEGIN();
+   ret = glIsProgram(program);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+GLboolean
+_evgld_glIsRenderbuffer(GLuint renderbuffer)
+{
+   GLboolean ret;
+   EVGL_FUNC_BEGIN();
+   ret = glIsRenderbuffer(renderbuffer);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+GLboolean
+_evgld_glIsShader(GLuint shader)
+{
+   GLboolean ret;
+   EVGL_FUNC_BEGIN();
+   ret = glIsShader(shader);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+GLboolean
+_evgld_glIsTexture(GLuint texture)
+{
+   GLboolean ret;
+   EVGL_FUNC_BEGIN();
+   ret = glIsTexture(texture);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+void
+_evgld_glLineWidth(GLfloat width)
+{
+   EVGL_FUNC_BEGIN();
+   glLineWidth(width);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glLinkProgram(GLuint program)
+{
+   EVGL_FUNC_BEGIN();
+   glLinkProgram(program);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glPixelStorei(GLenum pname, GLint param)
+{
+   EVGL_FUNC_BEGIN();
+   glPixelStorei(pname, param);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glPolygonOffset(GLfloat factor, GLfloat units)
+{
+   EVGL_FUNC_BEGIN();
+   glPolygonOffset(factor, units);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glReleaseShaderCompiler(void)
+{
+   EVGL_FUNC_BEGIN();
+
+   _evgl_glReleaseShaderCompiler();
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glSampleCoverage(GLclampf value, GLboolean invert)
+{
+   EVGL_FUNC_BEGIN();
+   glSampleCoverage(value, invert);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glShaderSource(GLuint shader, GLsizei count, const char* const * string, const GLint* length)
+{
+   EVGL_FUNC_BEGIN();
+#ifdef GL_GLES
+   glShaderSource(shader, count, (const GLchar * const *) string, length);
+#else
+   glShaderSource(shader, count, (const GLchar **) string, length);
+#endif
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glStencilFunc(GLenum func, GLint ref, GLuint mask)
+{
+   EVGL_FUNC_BEGIN();
+   glStencilFunc(func, ref, mask);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glStencilMask(GLuint mask)
+{
+   EVGL_FUNC_BEGIN();
+   glStencilMask(mask);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glStencilMaskSeparate(GLenum face, GLuint mask)
+{
+   EVGL_FUNC_BEGIN();
+   glStencilMaskSeparate(face, mask);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+{
+   EVGL_FUNC_BEGIN();
+   glStencilOp(fail, zfail, zpass);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+{
+   EVGL_FUNC_BEGIN();
+   glTexParameterf(target, pname, param);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
+{
+   EVGL_FUNC_BEGIN();
+   glTexParameterfv(target, pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glTexParameteri(GLenum target, GLenum pname, GLint param)
+{
+   EVGL_FUNC_BEGIN();
+   glTexParameteri(target, pname, param);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
+{
+   EVGL_FUNC_BEGIN();
+   glTexParameteriv(target, pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glUniform1f(GLint location, GLfloat x)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform1f(location, x);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform1fv(location, count, v);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glUniform1i(GLint location, GLint x)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform1i(location, x);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glUniform1iv(GLint location, GLsizei count, const GLint* v)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform1iv(location, count, v);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glUniform2f(GLint location, GLfloat x, GLfloat y)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform2f(location, x, y);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform2fv(location, count, v);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glUniform2i(GLint location, GLint x, GLint y)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform2i(location, x, y);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glUniform2iv(GLint location, GLsizei count, const GLint* v)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform2iv(location, count, v);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform3fv(location, count, v);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glUniform3iv(GLint location, GLsizei count, const GLint* v)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform3iv(location, count, v);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
 }
 
 void
-_evgld_glDepthMask(GLboolean flag)
+_evgld_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
 {
    EVGL_FUNC_BEGIN();
-   glDepthMask(flag);
+   glUniform4f(location, x, y, z, w);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glDepthRangef(GLclampf zNear, GLclampf zFar)
+_evgld_glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
 {
    EVGL_FUNC_BEGIN();
+   glUniform4fv(location, count, v);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
 
-   _evgl_glDepthRangef(zNear, zFar);
+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__, "");
+   EVGL_FUNC_END();
+}
 
+void
+_evgld_glUniform4iv(GLint location, GLsizei count, const GLint* v)
+{
+   EVGL_FUNC_BEGIN();
+   glUniform4iv(location, count, v);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glDetachShader(GLuint program, GLuint shader)
+_evgld_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
 {
    EVGL_FUNC_BEGIN();
-   glDetachShader(program, shader);
+   glUniformMatrix2fv(location, count, transpose, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glDisableVertexAttribArray(GLuint idx)
+_evgld_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
 {
    EVGL_FUNC_BEGIN();
-   glDisableVertexAttribArray(idx);
+   glUniformMatrix3fv(location, count, transpose, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glDrawArrays(GLenum mode, GLint first, GLsizei count)
+_evgld_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
 {
    EVGL_FUNC_BEGIN();
-   glDrawArrays(mode, first, count);
+   glUniformMatrix4fv(location, count, transpose, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
+_evgld_glUseProgram(GLuint program)
 {
    EVGL_FUNC_BEGIN();
-   glDrawElements(mode, count, type, indices);
+   glUseProgram(program);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glEnableVertexAttribArray(GLuint idx)
+_evgld_glValidateProgram(GLuint program)
 {
    EVGL_FUNC_BEGIN();
-   glEnableVertexAttribArray(idx);
+   glValidateProgram(program);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glFinish(void)
+_evgld_glVertexAttrib1f(GLuint indx, GLfloat x)
 {
    EVGL_FUNC_BEGIN();
-   glFinish();
+   glVertexAttrib1f(indx, x);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glFlush(void)
+_evgld_glVertexAttrib1fv(GLuint indx, const GLfloat* values)
 {
    EVGL_FUNC_BEGIN();
-   glFlush();
+   glVertexAttrib1fv(indx, values);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+_evgld_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
 {
    EVGL_FUNC_BEGIN();
-   glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+   glVertexAttrib2f(indx, x, y);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+_evgld_glVertexAttrib2fv(GLuint indx, const GLfloat* values)
 {
    EVGL_FUNC_BEGIN();
-   glFramebufferTexture2D(target, attachment, textarget, texture, level);
+   glVertexAttrib2fv(indx, values);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glFrontFace(GLenum mode)
+_evgld_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
+{
+   EVGL_FUNC_BEGIN();
+   glVertexAttrib3f(indx, x, y, z);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glVertexAttrib3fv(GLuint indx, const GLfloat* values)
+{
+   EVGL_FUNC_BEGIN();
+   glVertexAttrib3fv(indx, values);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glVertexAttrib4fv(GLuint indx, const GLfloat* values)
+{
+   EVGL_FUNC_BEGIN();
+   glVertexAttrib4fv(indx, values);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   EVGL_FUNC_END();
+}
+
+//-------------------------------------------------------------//
+// Open GLES 3.0 APIs
+
+void
+_evgld_glReadBuffer(GLenum mode)
+{
+   if (!_gles3_api.glReadBuffer)
+     {
+        ERR("Can not call glReadBuffer() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glReadBuffer(mode);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)
+{
+   if (!_gles3_api.glDrawRangeElements)
+     {
+        ERR("Can not call glDrawRangeElements() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glDrawRangeElements(mode, start, end, count, type, indices);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
+{
+   if (!_gles3_api.glTexImage3D)
+     {
+        ERR("Can not call glTexImage3D() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels)
+{
+   if (!_gles3_api.glTexSubImage3D)
+     {
+        ERR("Can not call glTexSubImage3D() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+{
+   if (!_gles3_api.glCopyTexSubImage3D)
+     {
+        ERR("Can not call glCopyTexSubImage3D() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data)
+{
+   if (!_gles3_api.glCompressedTexImage3D)
+     {
+        ERR("Can not call glCompressedTexImage3D() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data)
+{
+   if (!_gles3_api.glCompressedTexSubImage3D)
+     {
+        ERR("Can not call glCompressedTexSubImage3D() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGenQueries(GLsizei n, GLuint *ids)
+{
+   if (!_gles3_api.glGenQueries)
+     {
+        ERR("Can not call glGenQueries() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glGenQueries(n, ids);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glDeleteQueries(GLsizei n, const GLuint *ids)
+{
+   if (!_gles3_api.glDeleteQueries)
+     {
+        ERR("Can not call glDeleteQueries() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glDeleteQueries(n, ids);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+GLboolean
+ _evgld_glIsQuery(GLuint id)
+{
+   if (!_gles3_api.glIsQuery)
+     {
+        ERR("Can not call glIsQuery() in this context!");
+        return EINA_FALSE;
+     }
+   GLboolean ret;
+   EVGL_FUNC_BEGIN();
+   ret = _evgl_glIsQuery(id);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+   return ret;
+}
+
+void
+_evgld_glBeginQuery(GLenum target, GLuint id)
+{
+   if (!_gles3_api.glBeginQuery)
+     {
+        ERR("Can not call glBeginQuery() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glBeginQuery(target, id);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glEndQuery(GLenum target)
+{
+   if (!_gles3_api.glEndQuery)
+     {
+        ERR("Can not call glEndQuery() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glEndQuery(target);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetQueryiv(GLenum target, GLenum pname, GLint *params)
+{
+   if (!_gles3_api.glGetQueryiv)
+     {
+        ERR("Can not call glGetQueryiv() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glGetQueryiv(target, pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+void
+_evgld_glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint *params)
+{
+   if (!_gles3_api.glGetQueryObjectuiv)
+     {
+        ERR("Can not call glGetQueryObjectuiv() in this context!");
+        return;
+     }
+   EVGL_FUNC_BEGIN();
+   _evgl_glGetQueryObjectuiv(id, pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   EVGL_FUNC_END();
+}
+
+GLboolean
+_evgld_glUnmapBuffer(GLenum target)
 {
+   if (!_gles3_api.glUnmapBuffer)
+     {
+        ERR("Can not call glUnmapBuffer() in this context!");
+        return EINA_FALSE;
+     }
+   GLboolean ret;
    EVGL_FUNC_BEGIN();
-   glFrontFace(mode);
+   ret = _evgl_glUnmapBuffer(target);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
+   return ret;
 }
 
 void
-_evgld_glGetVertexAttribfv(GLuint idx, GLenum pname, GLfloat* params)
+_evgld_glGetBufferPointerv(GLenum target, GLenum pname, GLvoid **params)
 {
+   if (!_gles3_api.glGetBufferPointerv)
+     {
+        ERR("Can not call glGetBufferPointerv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetVertexAttribfv(idx, pname, params);
-
+   _evgl_glGetBufferPointerv(target, pname, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetVertexAttribiv(GLuint idx, GLenum pname, GLint* params)
+_evgld_glDrawBuffers(GLsizei n, const GLenum *bufs)
 {
+   if (!_gles3_api.glDrawBuffers)
+     {
+        ERR("Can not call glDrawBuffers() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetVertexAttribiv(idx, pname, params);
-
+   _evgl_glDrawBuffers(n, bufs);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetVertexAttribPointerv(GLuint idx, GLenum pname, void** pointer)
+_evgld_glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
+   if (!_gles3_api.glUniformMatrix2x3fv)
+     {
+        ERR("Can not call glUniformMatrix2x3fv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetVertexAttribPointerv(idx, pname, pointer);
-
+   _evgl_glUniformMatrix2x3fv(location, count, transpose, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glHint(GLenum target, GLenum mode)
+_evgld_glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
+   if (!_gles3_api.glUniformMatrix3x2fv)
+     {
+        ERR("Can not call glUniformMatrix3x2fv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glHint(target, mode);
+   _evgl_glUniformMatrix3x2fv(location, count, transpose, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGenBuffers(GLsizei n, GLuint* buffers)
+_evgld_glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
+   if (!_gles3_api.glUniformMatrix2x4fv)
+     {
+        ERR("Can not call glUniformMatrix2x4fv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGenBuffers(n, buffers);
+   _evgl_glUniformMatrix2x4fv(location, count, transpose, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGenerateMipmap(GLenum target)
+_evgld_glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
+   if (!_gles3_api.glUniformMatrix4x2fv)
+     {
+        ERR("Can not call glUniformMatrix4x2fv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGenerateMipmap(target);
+   _evgl_glUniformMatrix4x2fv(location, count, transpose, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGenFramebuffers(GLsizei n, GLuint* framebuffers)
+_evgld_glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
+   if (!_gles3_api.glUniformMatrix3x4fv)
+     {
+        ERR("Can not call glUniformMatrix3x4fv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGenFramebuffers(n, framebuffers);
+   _evgl_glUniformMatrix3x4fv(location, count, transpose, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
+_evgld_glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
 {
+   if (!_gles3_api.glUniformMatrix4x3fv)
+     {
+        ERR("Can not call glUniformMatrix4x3fv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGenRenderbuffers(n, renderbuffers);
+   _evgl_glUniformMatrix4x3fv(location, count, transpose, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGenTextures(GLsizei n, GLuint* textures)
+_evgld_glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
 {
+   if (!_gles3_api.glBlitFramebuffer)
+     {
+        ERR("Can not call glBlitFramebuffer() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGenTextures(n, textures);
+   _evgl_glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetActiveAttrib(GLuint program, GLuint idx, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
+_evgld_glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
 {
+   if (!_gles3_api.glRenderbufferStorageMultisample)
+     {
+        ERR("Can not call glRenderbufferStorageMultisample() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetActiveAttrib(program, idx, bufsize, length, size, type, name);
+   _evgl_glRenderbufferStorageMultisample(target, samples, internalformat, width, height);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetActiveUniform(GLuint program, GLuint idx, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
+_evgld_glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
 {
+   if (!_gles3_api.glFramebufferTextureLayer)
+     {
+        ERR("Can not call glFramebufferTextureLayer() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetActiveUniform(program, idx, bufsize, length, size, type, name);
+   _evgl_glFramebufferTextureLayer(target, attachment, texture, level, layer);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
-void
-_evgld_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
+void*
+_evgld_glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
 {
+   if (!_gles3_api.glMapBufferRange)
+     {
+        ERR("Can not call glMapBufferRange() in this context!");
+        return NULL;
+     }
+   void* ret;
    EVGL_FUNC_BEGIN();
-   glGetAttachedShaders(program, maxcount, count, shaders);
+   ret = _evgl_glMapBufferRange(target, offset, length, access);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
+   return ret;
 }
 
-int
-_evgld_glGetAttribLocation(GLuint program, const char* name)
+GLsync
+_evgld_glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
 {
-   int ret = _EVGL_INT_INIT_VALUE;
+   if (!_gles3_api.glFlushMappedBufferRange)
+     {
+        ERR("Can not call glFlushMappedBufferRange() in this context!");
+        return 0;
+     }
+   GLsync ret;
    EVGL_FUNC_BEGIN();
-   ret = glGetAttribLocation(program, name);
+   ret = _evgl_glFlushMappedBufferRange(target, offset, length);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
    return ret;
 }
 
 void
-_evgld_glGetBooleanv(GLenum pname, GLboolean* params)
+_evgld_glBindVertexArray(GLuint array)
 {
+   if (!_gles3_api.glBindVertexArray)
+     {
+        ERR("Can not call glBindVertexArray() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetBooleanv(pname, params);
+   _evgl_glBindVertexArray(array);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
+_evgld_glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
 {
+   if (!_gles3_api.glDeleteVertexArrays)
+     {
+        ERR("Can not call glDeleteVertexArrays() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetBufferParameteriv(target, pname, params);
+   _evgl_glDeleteVertexArrays(n, arrays);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
-GLenum
-_evgld_glGetError(void)
+void
+_evgld_glGenVertexArrays(GLsizei n, GLuint *arrays)
 {
-   GLenum ret = GL_NONE;
-
+   if (!_gles3_api.glGenVertexArrays)
+     {
+        ERR("Can not call glGenVertexArrays() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   ret = glGetError();
+   _evgl_glGenVertexArrays(n, arrays);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
-   return ret;
 }
 
-void
-_evgld_glGetFloatv(GLenum pname, GLfloat* params)
+GLboolean
+_evgld_glIsVertexArray(GLuint array)
 {
+   if (!_gles3_api.glIsVertexArray)
+     {
+        ERR("Can not call glIsVertexArray() in this context!");
+        return EINA_FALSE;
+     }
+   GLboolean ret;
    EVGL_FUNC_BEGIN();
-   glGetFloatv(pname, params);
+   ret = _evgl_glIsVertexArray(array);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
+   return ret;
 }
 
 void
-_evgld_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
+_evgld_glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
 {
+   if (!_gles3_api.glGetIntegeri_v)
+     {
+        ERR("Can not call glGetIntegeri_v() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetFramebufferAttachmentParameteriv(target, attachment, pname, params);
+   _evgl_glGetIntegeri_v(target, index, data);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetProgramiv(GLuint program, GLenum pname, GLint* params)
+_evgld_glBeginTransformFeedback(GLenum primitiveMode)
 {
+   if (!_gles3_api.glBeginTransformFeedback)
+     {
+        ERR("Can not call glBeginTransformFeedback() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetProgramiv(program, pname, params);
+   _evgl_glBeginTransformFeedback(primitiveMode);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
+_evgld_glEndTransformFeedback(void)
 {
+   if (!_gles3_api.glEndTransformFeedback)
+     {
+        ERR("Can not call glEndTransformFeedback() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetProgramInfoLog(program, bufsize, length, infolog);
+   _evgl_glEndTransformFeedback();
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
+_evgld_glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
 {
+   if (!_gles3_api.glBindBufferRange)
+     {
+        ERR("Can not call glBindBufferRange() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetRenderbufferParameteriv(target, pname, params);
+   _evgl_glBindBufferRange(target, index, buffer, offset, size);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
+_evgld_glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
 {
+   if (!_gles3_api.glBindBufferBase)
+     {
+        ERR("Can not call glBindBufferBase() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetShaderiv(shader, pname, params);
+   _evgl_glBindBufferBase(target, index, buffer);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
+_evgld_glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode)
 {
+   if (!_gles3_api.glTransformFeedbackVaryings)
+     {
+        ERR("Can not call glTransformFeedbackVaryings() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetShaderInfoLog(shader, bufsize, length, infolog);
+   _evgl_glTransformFeedbackVaryings(program, count, varyings, bufferMode);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
+_evgld_glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name)
 {
+   if (!_gles3_api.glGetTransformFeedbackVarying)
+     {
+        ERR("Can not call glGetTransformFeedbackVarying() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-
-   _evgl_glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+   _evgl_glGetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
+_evgld_glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
 {
+   if (!_gles3_api.glVertexAttribIPointer)
+     {
+        ERR("Can not call glVertexAttribIPointer() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetShaderSource(shader, bufsize, length, source);
+   _evgl_glVertexAttribIPointer(index, size, type, stride, pointer);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
-const GLubyte *
-_evgld_glGetString(GLenum name)
+void
+_evgld_glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
 {
-   const GLubyte *ret = NULL;
-
+   if (!_gles3_api.glGetVertexAttribIiv)
+     {
+        ERR("Can not call glGetVertexAttribIiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   ret = _evgl_glGetString(name);
+   _evgl_glGetVertexAttribIiv(index, pname, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
-   return ret;
 }
 
 void
-_evgld_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
+_evgld_glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
 {
+   if (!_gles3_api.glGetVertexAttribIuiv)
+     {
+        ERR("Can not call glGetVertexAttribIuiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetTexParameterfv(target, pname, params);
+   _evgl_glGetVertexAttribIuiv(index, pname, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
+_evgld_glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
 {
+   if (!_gles3_api.glVertexAttribI4i)
+     {
+        ERR("Can not call glVertexAttribI4i() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetTexParameteriv(target, pname, params);
+   _evgl_glVertexAttribI4i(index, x, y, z,  w);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetUniformfv(GLuint program, GLint location, GLfloat* params)
+_evgld_glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
 {
+   if (!_gles3_api.glVertexAttribI4ui)
+     {
+        ERR("Can not call glVertexAttribI4ui() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetUniformfv(program, location, params);
+   _evgl_glVertexAttribI4ui(index, x, y, z, w);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glGetUniformiv(GLuint program, GLint location, GLint* params)
+_evgld_glVertexAttribI4iv(GLuint index, const GLint *v)
 {
+   if (!_gles3_api.glVertexAttribI4iv)
+     {
+        ERR("Can not call glVertexAttribI4iv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glGetUniformiv(program, location, params);
+   _evgl_glVertexAttribI4iv(index, v);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
-int
-_evgld_glGetUniformLocation(GLuint program, const char* name)
-{
-   int ret = _EVGL_INT_INIT_VALUE;
 
+void
+_evgld_glVertexAttribI4uiv(GLuint index, const GLuint *v)
+{
+   if (!_gles3_api.glVertexAttribI4uiv)
+     {
+        ERR("Can not call glVertexAttribI4uiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   ret = glGetUniformLocation(program, name);
+   _evgl_glVertexAttribI4uiv(index, v);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
-   return ret;
 }
 
-GLboolean
-_evgld_glIsBuffer(GLuint buffer)
+void
+_evgld_glGetUniformuiv(GLuint program, GLint location, GLuint *params)
 {
-   GLboolean ret = GL_FALSE;
-
+   if (!_gles3_api.glGetUniformuiv)
+     {
+        ERR("Can not call glGetUniformuiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   ret = glIsBuffer(buffer);
+   _evgl_glGetUniformuiv(program, location, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
-   return ret;
 }
 
-GLboolean
-_evgld_glIsEnabled(GLenum cap)
+GLint
+_evgld_glGetFragDataLocation(GLuint program, const GLchar *name)
 {
-   GLboolean ret = GL_FALSE;
-
+   if (!_gles3_api.glGetFragDataLocation)
+     {
+        ERR("Can not call glGetFragDataLocation() in this context!");
+        return EVAS_GL_NOT_INITIALIZED;
+     }
+   GLint ret;
    EVGL_FUNC_BEGIN();
-   ret = glIsEnabled(cap);
+   ret = _evgl_glGetFragDataLocation(program, name);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
    return ret;
 }
 
-GLboolean
-_evgld_glIsFramebuffer(GLuint framebuffer)
+void
+_evgld_glUniform1ui(GLint location, GLuint v0)
 {
-   GLboolean ret = GL_FALSE;
-
+   if (!_gles3_api.glUniform1ui)
+     {
+       ERR("Can not call glUniform1ui() in this context!");
+       return;
+     }
    EVGL_FUNC_BEGIN();
-   ret = glIsFramebuffer(framebuffer);
+   _evgl_glUniform1ui(location, v0);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
-   return ret;
 }
 
-GLboolean
-_evgld_glIsProgram(GLuint program)
+void
+_evgld_glUniform2ui(GLint location, GLuint v0, GLuint v1)
 {
-   GLboolean ret;
+   if (!_gles3_api.glUniform2ui)
+     {
+        ERR("Can not call glUniform2ui() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   ret = glIsProgram(program);
+   _evgl_glUniform2ui(location, v0, v1);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
-   return ret;
 }
 
-GLboolean
-_evgld_glIsRenderbuffer(GLuint renderbuffer)
+void
+_evgld_glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
 {
-   GLboolean ret;
+   if (!_gles3_api.glUniform3ui)
+     {
+        ERR("Can not call glUniform3ui() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   ret = glIsRenderbuffer(renderbuffer);
+   _evgl_glUniform3ui(location, v0, v1, v2);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
-   return ret;
 }
 
-GLboolean
-_evgld_glIsShader(GLuint shader)
+void
+_evgld_glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
 {
-   GLboolean ret;
+   if (!_gles3_api.glUniform4ui)
+     {
+        ERR("Can not call glUniform4ui() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   ret = glIsShader(shader);
+   _evgl_glUniform4ui(location, v0, v1, v2, v3);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
-   return ret;
 }
 
-GLboolean
-_evgld_glIsTexture(GLuint texture)
+void
+_evgld_glUniform1uiv(GLint location, GLsizei count, const GLuint *value)
 {
-   GLboolean ret;
+   if (!_gles3_api.glUniform1uiv)
+     {
+        ERR("Can not call glUniform1uiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   ret = glIsTexture(texture);
+   _evgl_glUniform1uiv(location, count, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
-   return ret;
 }
 
 void
-_evgld_glLineWidth(GLfloat width)
+_evgld_glUniform2uiv(GLint location, GLsizei count, const GLuint *value)
 {
+   if (!_gles3_api.glUniform2uiv)
+     {
+        ERR("Can not call glUniform2uiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glLineWidth(width);
+   _evgl_glUniform2uiv(location, count, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glLinkProgram(GLuint program)
+_evgld_glUniform3uiv(GLint location, GLsizei count, const GLuint *value)
 {
+   if (!_gles3_api.glUniform3uiv)
+     {
+        ERR("Can not call glUniform3uiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glLinkProgram(program);
+   _evgl_glUniform3uiv(location, count, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glPixelStorei(GLenum pname, GLint param)
+_evgld_glUniform4uiv(GLint location, GLsizei count, const GLuint *value)
 {
+   if (!_gles3_api.glUniform4uiv)
+     {
+        ERR("Can not call glUniform4uiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glPixelStorei(pname, param);
+   _evgl_glUniform4uiv(location, count, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glPolygonOffset(GLfloat factor, GLfloat units)
+_evgld_glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
 {
+   if (!_gles3_api.glClearBufferiv)
+     {
+        ERR("Can not call glClearBufferiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glPolygonOffset(factor, units);
+   _evgl_glClearBufferiv(buffer, drawbuffer, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glReleaseShaderCompiler(void)
+_evgld_glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
 {
+   if (!_gles3_api.glClearBufferuiv)
+     {
+        ERR("Can not call glClearBufferuiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-
-   _evgl_glReleaseShaderCompiler();
+   _evgl_glClearBufferuiv(buffer, drawbuffer, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+_evgld_glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
 {
+   if (!_gles3_api.glClearBufferfv)
+     {
+        ERR("Can not call glClearBufferfv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glRenderbufferStorage(target, internalformat, width, height);
+   _evgl_glClearBufferfv(buffer, drawbuffer, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glSampleCoverage(GLclampf value, GLboolean invert)
+_evgld_glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
 {
+   if (!_gles3_api.glClearBufferfi)
+     {
+        ERR("Can not call glClearBufferfi() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glSampleCoverage(value, invert);
+   _evgl_glClearBufferfi(buffer, drawbuffer, depth, stencil);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
-void
-_evgld_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
+const GLubyte *
+ _evgld_glGetStringi(GLenum name, GLuint index)
 {
+   if (!_gles3_api.glGetStringi)
+     {
+        ERR("Can not call glGetStringi() in this context!");
+        return NULL;
+     }
+   const GLubyte *ret;
    EVGL_FUNC_BEGIN();
-
-   _evgl_glShaderBinary(n, shaders, binaryformat, binary, length);
+   ret = _evgl_glGetStringi(name, index);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-
    EVGL_FUNC_END();
+   return ret;
 }
 
 void
-_evgld_glShaderSource(GLuint shader, GLsizei count, const char* const * string, const GLint* length)
+_evgld_glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
 {
+   if (!_gles3_api.glCopyBufferSubData)
+     {
+        ERR("Can not call glCopyBufferSubData() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-#ifdef GL_GLES
-   glShaderSource(shader, count, (const GLchar * const *) string, length);
-#else
-   glShaderSource(shader, count, (const GLchar **) string, length);
-#endif
+   _evgl_glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glStencilFunc(GLenum func, GLint ref, GLuint mask)
+_evgld_glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices)
 {
+   if (!_gles3_api.glGetUniformIndices)
+     {
+        ERR("Can not call glGetUniformIndices() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glStencilFunc(func, ref, mask);
+   _evgl_glGetUniformIndices(program, uniformCount, uniformNames,uniformIndices);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+_evgld_glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params)
 {
+   if (!_gles3_api.glGetActiveUniformsiv)
+     {
+        ERR("Can not call glGetActiveUniformsiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glStencilFuncSeparate(face, func, ref, mask);
+   _evgl_glGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
-void
-_evgld_glStencilMask(GLuint mask)
+GLuint
+_evgld_glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
 {
+   if (!_gles3_api.glGetUniformBlockIndex)
+     {
+        ERR("Can not call glGetUniformBlockIndex() in this context!");
+        return EVAS_GL_NOT_INITIALIZED;
+     }
+   GLuint ret;
    EVGL_FUNC_BEGIN();
-   glStencilMask(mask);
+   ret = _evgl_glGetUniformBlockIndex(program, uniformBlockName);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
+   return ret;
 }
 
 void
-_evgld_glStencilMaskSeparate(GLenum face, GLuint mask)
+_evgld_glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
 {
+   if (!_gles3_api.glGetActiveUniformBlockiv)
+     {
+        ERR("Can not call glGetActiveUniformBlockiv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glStencilMaskSeparate(face, mask);
+   _evgl_glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+_evgld_glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName)
 {
+   if (!_gles3_api.glGetActiveUniformBlockName)
+     {
+        ERR("Can not call glGetActiveUniformBlockName() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glStencilOp(fail, zfail, zpass);
+   _evgl_glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
+_evgld_glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
 {
+   if (!_gles3_api.glUniformBlockBinding)
+     {
+        ERR("Can not call glUniformBlockBinding() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glStencilOpSeparate(face, fail, zfail, zpass);
+   _evgl_glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    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)
+_evgld_glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount)
 {
+   if (!_gles3_api.glDrawArraysInstanced)
+     {
+        ERR("Can not call glDrawArraysInstanced() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
+   _evgl_glDrawArraysInstanced(mode, first, count, instancecount);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glTexParameterf(GLenum target, GLenum pname, GLfloat param)
+_evgld_glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei instancecount)
 {
+   if (!_gles3_api.glDrawElementsInstanced)
+     {
+        ERR("Can not call glDrawElementsInstanced() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glTexParameterf(target, pname, param);
+   _evgl_glDrawElementsInstanced(mode, count, type, indices, instancecount);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
-void
-_evgld_glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
+GLsync
+_evgld_glFenceSync(GLenum condition, GLbitfield flags)
 {
+   if (!_gles3_api.glFenceSync)
+     {
+        ERR("Can not call glFenceSync() in this context!");
+        return 0;
+     }
+   GLsync ret;
    EVGL_FUNC_BEGIN();
-   glTexParameterfv(target, pname, params);
+   ret = _evgl_glFenceSync(condition, flags);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
+   return ret;
 }
 
-void
-_evgld_glTexParameteri(GLenum target, GLenum pname, GLint param)
+GLboolean
+_evgld_glIsSync(GLsync sync)
 {
+   if (!_gles3_api.glIsSync)
+     {
+        ERR("Can not call glIsSync() in this context!");
+        return EINA_FALSE;
+     }
+   GLboolean ret;
    EVGL_FUNC_BEGIN();
-   glTexParameteri(target, pname, param);
+   ret = _evgl_glIsSync(sync);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
+   return ret;
 }
 
 void
-_evgld_glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
+_evgld_glDeleteSync(GLsync sync)
 {
+   if (!_gles3_api.glDeleteSync)
+     {
+        ERR("Can not call glDeleteSync() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glTexParameteriv(target, pname, params);
+   _evgl_glDeleteSync(sync);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    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)
+GLenum
+_evgld_glClientWaitSync(GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
 {
+   if (!_gles3_api.glClientWaitSync)
+     {
+        ERR("Can not call glClientWaitSync() in this context!");
+        return EVAS_GL_NOT_INITIALIZED;
+     }
+   GLenum ret;
    EVGL_FUNC_BEGIN();
-   glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
+   ret =  _evgl_glClientWaitSync(sync, flags, timeout);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
+   return ret;
 }
 
 void
-_evgld_glUniform1f(GLint location, GLfloat x)
+_evgld_glWaitSync(GLsync sync, GLbitfield flags, EvasGLuint64 timeout)
 {
+   if (!_gles3_api.glWaitSync)
+     {
+        ERR("Can not call glWaitSync() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform1f(location, x);
+   _evgl_glWaitSync(sync, flags, timeout);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
+_evgld_glGetInteger64v(GLenum pname, EvasGLint64 *params)
 {
+   if (!_gles3_api.glGetInteger64v)
+     {
+        ERR("Can not call glGetInteger64v() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform1fv(location, count, v);
+   _evgl_glGetInteger64v(pname, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform1i(GLint location, GLint x)
+_evgld_glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values)
 {
+   if (!_gles3_api.glGetSynciv)
+     {
+        ERR("Can not call glGetSynciv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform1i(location, x);
+   _evgl_glGetSynciv(sync, pname, bufSize, length, values);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform1iv(GLint location, GLsizei count, const GLint* v)
+_evgld_glGetInteger64i_v(GLenum target, GLuint index, EvasGLint64 *data)
 {
+   if (!_gles3_api.glGetInteger64i_v)
+     {
+        ERR("Can not call glGetInteger64i_v() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform1iv(location, count, v);
+   _evgl_glGetInteger64i_v(target, index, data);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform2f(GLint location, GLfloat x, GLfloat y)
+_evgld_glGetBufferParameteri64v(GLenum target, GLenum pname, EvasGLint64 *params)
 {
+   if (!_gles3_api.glGetBufferParameteri64v)
+     {
+        ERR("Can not call glGetBufferParameteri64v() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform2f(location, x, y);
+   _evgl_glGetBufferParameteri64v(target, pname, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
+_evgld_glGenSamplers(GLsizei count, GLuint *samplers)
 {
+   if (!_gles3_api.glGenSamplers)
+     {
+        ERR("Can not call glGenSamplers() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform2fv(location, count, v);
+   _evgl_glGenSamplers(count, samplers);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform2i(GLint location, GLint x, GLint y)
+_evgld_glDeleteSamplers(GLsizei count, const GLuint *samplers)
 {
+   if (!_gles3_api.glDeleteSamplers)
+     {
+        ERR("Can not call glDeleteSamplers() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform2i(location, x, y);
+   _evgl_glDeleteSamplers(count, samplers);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
-void
-_evgld_glUniform2iv(GLint location, GLsizei count, const GLint* v)
+GLboolean
+_evgld_glIsSampler(GLuint sampler)
 {
+   if (!_gles3_api.glIsSampler)
+     {
+        ERR("Can not call glIsSampler() in this context!");
+        return EINA_FALSE;
+     }
+   GLboolean ret;
    EVGL_FUNC_BEGIN();
-   glUniform2iv(location, count, v);
+   ret = _evgl_glIsSampler(sampler);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
+   return ret;
 }
 
 void
-_evgld_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
+_evgld_glBindSampler(GLuint unit, GLuint sampler)
 {
+   if (!_gles3_api.glBindSampler)
+     {
+        ERR("Can not call glBindSampler() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform3f(location, x, y, z);
+   _evgl_glBindSampler(unit, sampler);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
+_evgld_glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
 {
+   if (!_gles3_api.glSamplerParameteri)
+     {
+        ERR("Can not call glSamplerParameteri() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform3fv(location, count, v);
+   _evgl_glSamplerParameteri(sampler, pname, param);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform3i(GLint location, GLint x, GLint y, GLint z)
+_evgld_glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint *param)
 {
+   if (!_gles3_api.glSamplerParameteriv)
+     {
+        ERR("Can not call glSamplerParameteriv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform3i(location, x, y, z);
+   _evgl_glSamplerParameteriv(sampler, pname, param);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform3iv(GLint location, GLsizei count, const GLint* v)
+_evgld_glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
 {
+   if (!_gles3_api.glSamplerParameterf)
+     {
+        ERR("Can not call glSamplerParameterf() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform3iv(location, count, v);
+   _evgl_glSamplerParameterf(sampler, pname, param);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+_evgld_glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *param)
 {
+   if (!_gles3_api.glSamplerParameterfv)
+     {
+        ERR("Can not call glSamplerParameterfv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform4f(location, x, y, z, w);
+   _evgl_glSamplerParameterfv(sampler, pname, param);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
+_evgld_glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint *params)
 {
+   if (!_gles3_api.glGetSamplerParameteriv)
+     {
+        ERR("Can not call glGetSamplerParameteriv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform4fv(location, count, v);
+   _evgl_glGetSamplerParameteriv(sampler, pname, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
+_evgld_glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *params)
 {
+   if (!_gles3_api.glGetSamplerParameterfv)
+     {
+        ERR("Can not call glGetSamplerParameterfv() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform4i(location, x, y, z, w);
+   _evgl_glGetSamplerParameterfv(sampler, pname, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniform4iv(GLint location, GLsizei count, const GLint* v)
+_evgld_glVertexAttribDivisor(GLuint index, GLuint divisor)
 {
+   if (!_gles3_api.glVertexAttribDivisor)
+     {
+        ERR("Can not call glVertexAttribDivisor() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniform4iv(location, count, v);
+   _evgl_glVertexAttribDivisor(index, divisor);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+_evgld_glBindTransformFeedback(GLenum target, GLuint id)
 {
+   if (!_gles3_api.glBindTransformFeedback)
+     {
+        ERR("Can not call glBindTransformFeedback() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniformMatrix2fv(location, count, transpose, value);
+   _evgl_glBindTransformFeedback(target, id);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+_evgld_glDeleteTransformFeedbacks(GLsizei n, const GLuint *ids)
 {
+   if (!_gles3_api.glDeleteTransformFeedbacks)
+     {
+        ERR("Can not call glDeleteTransformFeedbacks() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniformMatrix3fv(location, count, transpose, value);
+   _evgl_glDeleteTransformFeedbacks(n, ids);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+_evgld_glGenTransformFeedbacks(GLsizei n, GLuint *ids)
 {
+   if (!_gles3_api.glGenTransformFeedbacks)
+     {
+        ERR("Can not call glGenTransformFeedbacks() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glUniformMatrix4fv(location, count, transpose, value);
+   _evgl_glGenTransformFeedbacks(n, ids);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
-void
-_evgld_glUseProgram(GLuint program)
+GLboolean
+_evgld_glIsTransformFeedback(GLuint id)
 {
+   if (!_gles3_api.glIsTransformFeedback)
+     {
+        ERR("Can not call glIsTransformFeedback() in this context!");
+        return EINA_FALSE;
+     }
+   GLboolean ret;
    EVGL_FUNC_BEGIN();
-   glUseProgram(program);
+   ret = _evgl_glIsTransformFeedback(id);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
+   return ret;
 }
 
 void
-_evgld_glValidateProgram(GLuint program)
+_evgld_glPauseTransformFeedback(void)
 {
+   if (!_gles3_api.glPauseTransformFeedback)
+     {
+        ERR("Can not call glPauseTransformFeedback() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glValidateProgram(program);
+   _evgl_glPauseTransformFeedback();
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glVertexAttrib1f(GLuint indx, GLfloat x)
+_evgld_glResumeTransformFeedback(void)
 {
+   if (!_gles3_api.glResumeTransformFeedback)
+     {
+        ERR("Can not call glResumeTransformFeedback() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glVertexAttrib1f(indx, x);
+   _evgl_glResumeTransformFeedback();
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glVertexAttrib1fv(GLuint indx, const GLfloat* values)
+_evgld_glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary)
 {
+   if (!_gles3_api.glGetProgramBinary)
+     {
+        ERR("Can not call glGetProgramBinary() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glVertexAttrib1fv(indx, values);
+   _evgl_glGetProgramBinary(program, bufSize, length, binaryFormat, binary);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
+_evgld_glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid *binary, GLsizei length)
 {
+   if (!_gles3_api.glProgramBinary)
+     {
+        ERR("Can not call glProgramBinary() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glVertexAttrib2f(indx, x, y);
+   _evgl_glProgramBinary(program, binaryFormat, binary, length);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glVertexAttrib2fv(GLuint indx, const GLfloat* values)
+_evgld_glProgramParameteri(GLuint program, GLenum pname, GLint value)
 {
+   if (!_gles3_api.glProgramParameteri)
+     {
+        ERR("Can not call glProgramParameteri() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glVertexAttrib2fv(indx, values);
+   _evgl_glProgramParameteri(program, pname, value);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
+_evgld_glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
 {
+   if (!_gles3_api.glInvalidateFramebuffer)
+     {
+        ERR("Can not call glInvalidateFramebuffer() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glVertexAttrib3f(indx, x, y, z);
+   _evgl_glInvalidateFramebuffer(target, numAttachments, attachments);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glVertexAttrib3fv(GLuint indx, const GLfloat* values)
+_evgld_glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height)
 {
+   if (!_gles3_api.glInvalidateSubFramebuffer)
+     {
+        ERR("Can not call glInvalidateSubFramebuffer() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glVertexAttrib3fv(indx, values);
+   _evgl_glInvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+_evgld_glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
 {
+   if (!_gles3_api.glTexStorage2D)
+     {
+        ERR("Can not call glTexStorage2D() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glVertexAttrib4f(indx, x, y, z, w);
+   _evgl_glTexStorage2D(target, levels, internalformat, width, height);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glVertexAttrib4fv(GLuint indx, const GLfloat* values)
+_evgld_glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
 {
+   if (!_gles3_api.glTexStorage3D)
+     {
+        ERR("Can not call glTexStorage3D() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glVertexAttrib4fv(indx, values);
+   _evgl_glTexStorage3D(target, levels, internalformat, width, height, depth);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
 
 void
-_evgld_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
+_evgld_glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params)
 {
+   if (!_gles3_api.glGetInternalformativ)
+     {
+        ERR("Can not call glGetInternalformativ() in this context!");
+        return;
+     }
    EVGL_FUNC_BEGIN();
-   glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
+   _evgl_glGetInternalformativ(target, internalformat, pname, bufSize, params);
    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
    EVGL_FUNC_END();
 }
@@ -2577,53 +4925,417 @@ _evgld_glDisable(GLenum cap)
    EVGL_FUNC_END();
 }
 
-void
-_evgld_glGetIntegerv(GLenum pname, GLint* params)
-{
-   EVGL_FUNC_BEGIN();
-   _evgl_glGetIntegerv(pname, params);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
-}
+void
+_evgld_glGetIntegerv(GLenum pname, GLint* params)
+{
+   EVGL_FUNC_BEGIN();
+   _evgl_glGetIntegerv(pname, params);
+   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+   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__, "");
+   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__, "");
+   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__, "");
+   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);
+// Deal with double glShaderSource signature
+   funcs->glShaderSource = (void (*)(GLuint, GLsizei, const char * const *, const GLint *))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(glClearColor);
+   ORD(glDisable);
+   ORD(glEnable);
+   ORD(glGetIntegerv);
+   ORD(glGetString);
+   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
+_direct_scissor_off_api_get(Evas_GL_API *funcs)
+{
+
+#define ORD(f) EVAS_API_OVERRIDE(f, funcs,)
+   // For Direct Rendering
+   ORD(glClear);
+   ORD(glClearColor);
+   ORD(glDisable);
+   ORD(glEnable);
+   ORD(glGetIntegerv);
+   ORD(glReadPixels);
+   ORD(glScissor);
+   ORD(glViewport);
+#undef ORD
+}
+
 
 static void
-_evgld_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
+_debug_gl_api_get(Evas_GL_API *funcs)
 {
-   EVGL_FUNC_BEGIN();
+   funcs->version = EVAS_GL_API_VERSION;
 
-   _evgl_glReadPixels(x, y, width, height, format, type, pixels);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
-}
+#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);
 
-static void
-_evgld_glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
-{
-   EVGL_FUNC_BEGIN();
+   ORD(glBindFramebuffer);
+   ORD(glBindRenderbuffer);
+#undef ORD
 
-   _evgl_glScissor(x, y, width, height);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   evgl_api_ext_get(funcs);
 }
 
-static void
-_evgld_glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
+void
+_evgl_api_get(Evas_GL_API *funcs, int debug)
 {
-   EVGL_FUNC_BEGIN();
+   if (debug)
+     _debug_gl_api_get(funcs);
+   else
+      _normal_gl_api_get(funcs);
 
-   _evgl_glViewport(x, y, width, height);
-   GLERR(__FUNCTION__, __FILE__, __LINE__, "");
-   EVGL_FUNC_END();
+   if (evgl_engine->direct_scissor_off)
+     _direct_scissor_off_api_get(funcs);
 }
-//-------------------------------------------------------------//
 
 static void
-_normal_gl_api_get(Evas_GL_API *funcs)
+_normal_gles3_api_get(Evas_GL_API *funcs)
 {
-   funcs->version = EVAS_GL_API_VERSION;
-
 #define ORD(f) EVAS_API_OVERRIDE(f, funcs,)
-   // GLES 2.0
+   // GLES 3.0 APIs that are same as GLES 2.0
    ORD(glActiveTexture);
    ORD(glAttachShader);
    ORD(glBindAttribLocation);
@@ -2770,8 +5482,119 @@ _normal_gl_api_get(Evas_GL_API *funcs)
    ORD(glBindRenderbuffer);
 #undef ORD
 
+// GLES 3.0 NEW APIs
+#define ORD(name) EVAS_API_OVERRIDE(name, funcs, _evgl_)
+   ORD(glBeginQuery);
+   ORD(glBeginTransformFeedback);
+   ORD(glBindBufferBase);
+   ORD(glBindBufferRange);
+   ORD(glBindSampler);
+   ORD(glBindTransformFeedback);
+   ORD(glBindVertexArray);
+   ORD(glBlitFramebuffer);
+   ORD(glClearBufferfi);
+   ORD(glClearBufferfv);
+   ORD(glClearBufferiv);
+   ORD(glClearBufferuiv);
+   ORD(glClientWaitSync);
+   ORD(glCompressedTexImage3D);
+   ORD(glCompressedTexSubImage3D);
+   ORD(glCopyBufferSubData);
+   ORD(glCopyTexSubImage3D);
+   ORD(glDeleteQueries);
+   ORD(glDeleteSamplers);
+   ORD(glDeleteSync);
+   ORD(glDeleteTransformFeedbacks);
+   ORD(glDeleteVertexArrays);
+   ORD(glDrawArraysInstanced);
+   ORD(glDrawBuffers);
+   ORD(glDrawElementsInstanced);
+   ORD(glDrawRangeElements);
+   ORD(glEndQuery);
+   ORD(glEndTransformFeedback);
+   ORD(glFenceSync);
+   ORD(glFlushMappedBufferRange);
+   ORD(glFramebufferTextureLayer);
+   ORD(glGenQueries);
+   ORD(glGenSamplers);
+   ORD(glGenTransformFeedbacks);
+   ORD(glGenVertexArrays);
+   ORD(glGetActiveUniformBlockiv);
+   ORD(glGetActiveUniformBlockName);
+   ORD(glGetActiveUniformsiv);
+   ORD(glGetBufferParameteri64v);
+   ORD(glGetBufferPointerv);
+   ORD(glGetFragDataLocation);
+   ORD(glGetInteger64i_v);
+   ORD(glGetInteger64v);
+   ORD(glGetIntegeri_v);
+   ORD(glGetInternalformativ);
+   ORD(glGetProgramBinary);
+   ORD(glGetQueryiv);
+   ORD(glGetQueryObjectuiv);
+   ORD(glGetSamplerParameterfv);
+   ORD(glGetSamplerParameteriv);
+   ORD(glGetStringi);
+   ORD(glGetSynciv);
+   ORD(glGetTransformFeedbackVarying);
+   ORD(glGetUniformBlockIndex);
+   ORD(glGetUniformIndices);
+   ORD(glGetUniformuiv);
+   ORD(glGetVertexAttribIiv);
+   ORD(glGetVertexAttribIuiv);
+   ORD(glInvalidateFramebuffer);
+   ORD(glInvalidateSubFramebuffer);
+   ORD(glIsQuery);
+   ORD(glIsSampler);
+   ORD(glIsSync);
+   ORD(glIsTransformFeedback);
+   ORD(glIsVertexArray);
+   ORD(glMapBufferRange);
+   ORD(glPauseTransformFeedback);
+   ORD(glProgramBinary);
+   ORD(glProgramParameteri);
+   ORD(glReadBuffer);
+   ORD(glRenderbufferStorageMultisample);
+   ORD(glResumeTransformFeedback);
+   ORD(glSamplerParameterf);
+   ORD(glSamplerParameterfv);
+   ORD(glSamplerParameteri);
+   ORD(glSamplerParameteriv);
+   ORD(glTexImage3D);
+   ORD(glTexStorage2D);
+   ORD(glTexStorage3D);
+   ORD(glTexSubImage3D);
+   ORD(glTransformFeedbackVaryings);
+   ORD(glUniform1ui);
+   ORD(glUniform1uiv);
+   ORD(glUniform2ui);
+   ORD(glUniform2uiv);
+   ORD(glUniform3ui);
+   ORD(glUniform3uiv);
+   ORD(glUniform4ui);
+   ORD(glUniform4uiv);
+   ORD(glUniformBlockBinding);
+   ORD(glUniformMatrix2x3fv);
+   ORD(glUniformMatrix3x2fv);
+   ORD(glUniformMatrix2x4fv);
+   ORD(glUniformMatrix4x2fv);
+   ORD(glUniformMatrix3x4fv);
+   ORD(glUniformMatrix4x3fv);
+   ORD(glUnmapBuffer);
+   ORD(glVertexAttribI4i);
+   ORD(glVertexAttribI4iv);
+   ORD(glVertexAttribI4ui);
+   ORD(glVertexAttribI4uiv);
+   ORD(glWaitSync);
+
+#undef ORD
+
 
 #define ORD(f) EVAS_API_OVERRIDE(f, funcs, _evgl_)
+
+   // General purpose wrapper
+   ORD(glGetString);
+
    // For Surface FBO
    ORD(glBindFramebuffer);
 
@@ -2781,7 +5604,6 @@ _normal_gl_api_get(Evas_GL_API *funcs)
    ORD(glDisable);
    ORD(glEnable);
    ORD(glGetIntegerv);
-   ORD(glGetString);
    ORD(glReadPixels);
    ORD(glScissor);
    ORD(glViewport);
@@ -2795,34 +5617,15 @@ _normal_gl_api_get(Evas_GL_API *funcs)
 
 #undef ORD
 
-   evgl_api_ext_get(funcs);
-}
-
-static void
-_direct_scissor_off_api_get(Evas_GL_API *funcs)
-{
-
-#define ORD(f) EVAS_API_OVERRIDE(f, funcs,)
-   // For Direct Rendering
-   ORD(glClear);
-   ORD(glClearColor);
-   ORD(glDisable);
-   ORD(glEnable);
-   ORD(glGetIntegerv);
-   ORD(glReadPixels);
-   ORD(glScissor);
-   ORD(glViewport);
-#undef ORD
+   evgl_api_gles3_ext_get(funcs);
 }
 
-
 static void
-_debug_gl_api_get(Evas_GL_API *funcs)
+_debug_gles3_api_get(Evas_GL_API *funcs)
 {
-   funcs->version = EVAS_GL_API_VERSION;
 
 #define ORD(f) EVAS_API_OVERRIDE(f, funcs, _evgld_)
-   // GLES 2.0
+   // GLES 3.0 APIs that are same as GLES 2.0
    ORD(glActiveTexture);
    ORD(glAttachShader);
    ORD(glBindAttribLocation);
@@ -2966,19 +5769,306 @@ _debug_gl_api_get(Evas_GL_API *funcs)
 
    ORD(glBindFramebuffer);
    ORD(glBindRenderbuffer);
+
+   // GLES 3.0 new APIs
+   ORD(glBeginQuery);
+   ORD(glBeginTransformFeedback);
+   ORD(glBindBufferBase);
+   ORD(glBindBufferRange);
+   ORD(glBindSampler);
+   ORD(glBindTransformFeedback);
+   ORD(glBindVertexArray);
+   ORD(glBlitFramebuffer);
+   ORD(glClearBufferfi);
+   ORD(glClearBufferfv);
+   ORD(glClearBufferiv);
+   ORD(glClearBufferuiv);
+   ORD(glClientWaitSync);
+   ORD(glCompressedTexImage3D);
+   ORD(glCompressedTexSubImage3D);
+   ORD(glCopyBufferSubData);
+   ORD(glCopyTexSubImage3D);
+   ORD(glDeleteQueries);
+   ORD(glDeleteSamplers);
+   ORD(glDeleteSync);
+   ORD(glDeleteTransformFeedbacks);
+   ORD(glDeleteVertexArrays);
+   ORD(glDrawArraysInstanced);
+   ORD(glDrawBuffers);
+   ORD(glDrawElementsInstanced);
+   ORD(glDrawRangeElements);
+   ORD(glEndQuery);
+   ORD(glEndTransformFeedback);
+   ORD(glFenceSync);
+   ORD(glFlushMappedBufferRange);
+   ORD(glFramebufferTextureLayer);
+   ORD(glGenQueries);
+   ORD(glGenSamplers);
+   ORD(glGenTransformFeedbacks);
+   ORD(glGenVertexArrays);
+   ORD(glGetActiveUniformBlockiv);
+   ORD(glGetActiveUniformBlockName);
+   ORD(glGetActiveUniformsiv);
+   ORD(glGetBufferParameteri64v);
+   ORD(glGetBufferPointerv);
+   ORD(glGetFragDataLocation);
+   ORD(glGetInteger64i_v);
+   ORD(glGetInteger64v);
+   ORD(glGetIntegeri_v);
+   ORD(glGetInternalformativ);
+   ORD(glGetProgramBinary);
+   ORD(glGetQueryiv);
+   ORD(glGetQueryObjectuiv);
+   ORD(glGetSamplerParameterfv);
+   ORD(glGetSamplerParameteriv);
+   ORD(glGetStringi);
+   ORD(glGetSynciv);
+   ORD(glGetTransformFeedbackVarying);
+   ORD(glGetUniformBlockIndex);
+   ORD(glGetUniformIndices);
+   ORD(glGetUniformuiv);
+   ORD(glGetVertexAttribIiv);
+   ORD(glGetVertexAttribIuiv);
+   ORD(glInvalidateFramebuffer);
+   ORD(glInvalidateSubFramebuffer);
+   ORD(glIsQuery);
+   ORD(glIsSampler);
+   ORD(glIsSync);
+   ORD(glIsTransformFeedback);
+   ORD(glIsVertexArray);
+   ORD(glMapBufferRange);
+   ORD(glPauseTransformFeedback);
+   ORD(glProgramBinary);
+   ORD(glProgramParameteri);
+   ORD(glReadBuffer);
+   ORD(glRenderbufferStorageMultisample);
+   ORD(glResumeTransformFeedback);
+   ORD(glSamplerParameterf);
+   ORD(glSamplerParameterfv);
+   ORD(glSamplerParameteri);
+   ORD(glSamplerParameteriv);
+   ORD(glTexImage3D);
+   ORD(glTexStorage2D);
+   ORD(glTexStorage3D);
+   ORD(glTexSubImage3D);
+   ORD(glTransformFeedbackVaryings);
+   ORD(glUniform1ui);
+   ORD(glUniform1uiv);
+   ORD(glUniform2ui);
+   ORD(glUniform2uiv);
+   ORD(glUniform3ui);
+   ORD(glUniform3uiv);
+   ORD(glUniform4ui);
+   ORD(glUniform4uiv);
+   ORD(glUniformBlockBinding);
+   ORD(glUniformMatrix2x3fv);
+   ORD(glUniformMatrix3x2fv);
+   ORD(glUniformMatrix2x4fv);
+   ORD(glUniformMatrix4x2fv);
+   ORD(glUniformMatrix3x4fv);
+   ORD(glUniformMatrix4x3fv);
+   ORD(glUnmapBuffer);
+   ORD(glVertexAttribI4i);
+   ORD(glVertexAttribI4iv);
+   ORD(glVertexAttribI4ui);
+   ORD(glVertexAttribI4uiv);
+   ORD(glWaitSync);
 #undef ORD
 
-   evgl_api_ext_get(funcs);
+   evgl_api_gles3_ext_get(funcs);
 }
 
-void
-_evgl_api_get(Evas_GL_API *funcs, int debug)
+
+static Eina_Bool
+_evgl_load_gles3_apis(void *dl_handle, Evas_GL_API *funcs)
+{
+   if (!dl_handle) return EINA_FALSE;
+
+#define ORD(name) \
+   funcs->name = dlsym(dl_handle, #name); \
+   if (!funcs->name) \
+     { \
+        WRN("%s symbol not found", #name); \
+        return EINA_FALSE; \
+     }
+
+   // Used to update extensions
+   ORD(glGetString);
+
+   // GLES 3.0 new APIs
+   ORD(glBeginQuery);
+   ORD(glBeginTransformFeedback);
+   ORD(glBindBufferBase);
+   ORD(glBindBufferRange);
+   ORD(glBindSampler);
+   ORD(glBindTransformFeedback);
+   ORD(glBindVertexArray);
+   ORD(glBlitFramebuffer);
+   ORD(glClearBufferfi);
+   ORD(glClearBufferfv);
+   ORD(glClearBufferiv);
+   ORD(glClearBufferuiv);
+   ORD(glClientWaitSync);
+   ORD(glCompressedTexImage3D);
+   ORD(glCompressedTexSubImage3D);
+   ORD(glCopyBufferSubData);
+   ORD(glCopyTexSubImage3D);
+   ORD(glDeleteQueries);
+   ORD(glDeleteSamplers);
+   ORD(glDeleteSync);
+   ORD(glDeleteTransformFeedbacks);
+   ORD(glDeleteVertexArrays);
+   ORD(glDrawArraysInstanced);
+   ORD(glDrawBuffers);
+   ORD(glDrawElementsInstanced);
+   ORD(glDrawRangeElements);
+   ORD(glEndQuery);
+   ORD(glEndTransformFeedback);
+   ORD(glFenceSync);
+   ORD(glFlushMappedBufferRange);
+   ORD(glFramebufferTextureLayer);
+   ORD(glGenQueries);
+   ORD(glGenSamplers);
+   ORD(glGenTransformFeedbacks);
+   ORD(glGenVertexArrays);
+   ORD(glGetActiveUniformBlockiv);
+   ORD(glGetActiveUniformBlockName);
+   ORD(glGetActiveUniformsiv);
+   ORD(glGetBufferParameteri64v);
+   ORD(glGetBufferPointerv);
+   ORD(glGetFragDataLocation);
+   ORD(glGetInteger64i_v);
+   ORD(glGetInteger64v);
+   ORD(glGetIntegeri_v);
+   ORD(glGetInternalformativ);
+   ORD(glGetProgramBinary);
+   ORD(glGetQueryiv);
+   ORD(glGetQueryObjectuiv);
+   ORD(glGetSamplerParameterfv);
+   ORD(glGetSamplerParameteriv);
+   ORD(glGetStringi);
+   ORD(glGetSynciv);
+   ORD(glGetTransformFeedbackVarying);
+   ORD(glGetUniformBlockIndex);
+   ORD(glGetUniformIndices);
+   ORD(glGetUniformuiv);
+   ORD(glGetVertexAttribIiv);
+   ORD(glGetVertexAttribIuiv);
+   ORD(glInvalidateFramebuffer);
+   ORD(glInvalidateSubFramebuffer);
+   ORD(glIsQuery);
+   ORD(glIsSampler);
+   ORD(glIsSync);
+   ORD(glIsTransformFeedback);
+   ORD(glIsVertexArray);
+   ORD(glMapBufferRange);
+   ORD(glPauseTransformFeedback);
+   ORD(glProgramBinary);
+   ORD(glProgramParameteri);
+   ORD(glReadBuffer);
+   ORD(glRenderbufferStorageMultisample);
+   ORD(glResumeTransformFeedback);
+   ORD(glSamplerParameterf);
+   ORD(glSamplerParameterfv);
+   ORD(glSamplerParameteri);
+   ORD(glSamplerParameteriv);
+   ORD(glTexImage3D);
+   ORD(glTexStorage2D);
+   ORD(glTexStorage3D);
+   ORD(glTexSubImage3D);
+   ORD(glTransformFeedbackVaryings);
+   ORD(glUniform1ui);
+   ORD(glUniform1uiv);
+   ORD(glUniform2ui);
+   ORD(glUniform2uiv);
+   ORD(glUniform3ui);
+   ORD(glUniform3uiv);
+   ORD(glUniform4ui);
+   ORD(glUniform4uiv);
+   ORD(glUniformBlockBinding);
+   ORD(glUniformMatrix2x3fv);
+   ORD(glUniformMatrix3x2fv);
+   ORD(glUniformMatrix2x4fv);
+   ORD(glUniformMatrix4x2fv);
+   ORD(glUniformMatrix3x4fv);
+   ORD(glUniformMatrix4x3fv);
+   ORD(glUnmapBuffer);
+   ORD(glVertexAttribI4i);
+   ORD(glVertexAttribI4iv);
+   ORD(glVertexAttribI4ui);
+   ORD(glVertexAttribI4uiv);
+   ORD(glWaitSync);
+#undef ORD
+   return EINA_TRUE;
+}
+
+
+
+static Eina_Bool
+_evgl_api_init(void)
+{
+   static Eina_Bool _initialized = EINA_FALSE;
+   if (_initialized) return EINA_TRUE;
+
+   memset(&_gles3_api, 0, sizeof(_gles3_api));
+
+#ifdef GL_GLES
+   _gles3_handle = dlopen("libGLESv2.so", RTLD_NOW);
+   if (!_gles3_handle) _gles3_handle = dlopen("libGLESv2.so.2.0", RTLD_NOW);
+   if (!_gles3_handle) _gles3_handle = dlopen("libGLESv2.so.2", RTLD_NOW);
+#else
+   _gles3_handle = dlopen("libGL.so", RTLD_NOW);
+   if (!_gles3_handle) _gles3_handle = dlopen("libGL.so.4", RTLD_NOW);
+   if (!_gles3_handle) _gles3_handle = dlopen("libGL.so.3", RTLD_NOW);
+   if (!_gles3_handle) _gles3_handle = dlopen("libGL.so.2", RTLD_NOW);
+   if (!_gles3_handle) _gles3_handle = dlopen("libGL.so.1", RTLD_NOW);
+   if (!_gles3_handle) _gles3_handle = dlopen("libGL.so.0", RTLD_NOW);
+#endif
+
+   if (!_gles3_handle)
+     {
+        WRN("OpenGL ES 3 was not found on this system. Evas GL will not support GLES 3 contexts.");
+        return EINA_FALSE;
+     }
+
+   if (!dlsym(_gles3_handle, "glBeginQuery"))
+     {
+        WRN("OpenGL ES 3 was not found on this system. Evas GL will not support GLES 3 contexts.");
+        return EINA_FALSE;
+     }
+
+   if (!_evgl_load_gles3_apis(_gles3_handle, &_gles3_api))
+     {
+        return EINA_FALSE;
+     }
+/*  TODO
+   if (!_evgl_api_gles3_ext_init())
+     WRN("Could not initialize OpenGL ES 1 extensions yet.");
+*/
+   _initialized = EINA_TRUE;
+   return EINA_TRUE;
+}
+
+
+Eina_Bool
+_evgl_api_gles3_get(Evas_GL_API *funcs, Eina_Bool debug)
 {
+   if(!_evgl_api_init())
+      return EINA_FALSE;
+
    if (debug)
-      _debug_gl_api_get(funcs);
+     _debug_gles3_api_get(funcs);
    else
-      _normal_gl_api_get(funcs);
+     _normal_gles3_api_get(funcs);
 
    if (evgl_engine->direct_scissor_off)
-      _direct_scissor_off_api_get(funcs);
+     _direct_scissor_off_api_get(funcs);
+
+   return EINA_TRUE;
+}
+
+Evas_GL_API *
+_evgl_api_gles3_internal_get(void)
+{
+   return &_gles3_api;
 }
old mode 100644 (file)
new mode 100755 (executable)
index 87869ed..20307f9
@@ -12,6 +12,8 @@ char _gl_ext_string[MAX_EXTENSION_STRING_BUFFER] = { 0 };
 char _gl_ext_string_official[MAX_EXTENSION_STRING_BUFFER] = { 0 };
 // list of gles 1.1 exts by official name
 static char *_gles1_ext_string = NULL;
+// list of gles 3.1 exts by official name
+static char *_gles3_ext_string = NULL;
 
 typedef void (*_getproc_fn) (void);
 typedef _getproc_fn (*fp_getproc)(const char *);
@@ -32,7 +34,8 @@ typedef _getproc_fn (*fp_getproc)(const char *);
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
 #define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param) \
    ret (*gl_ext_sym_##name) param = NULL; \
-   ret (*gles1_ext_sym_##name) param = NULL;
+   ret (*gles1_ext_sym_##name) param = NULL; \
+   ret (*gles3_ext_sym_##name) param = NULL;
 #define _EVASGL_EXT_FUNCTION_END()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
 #define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
@@ -63,12 +66,14 @@ typedef _getproc_fn (*fp_getproc)(const char *);
 #define _EVASGL_EXT_DISCARD_SUPPORT()
 #define _EVASGL_EXT_BEGIN(name) \
    int _gl_ext_support_##name = 0; \
-   int _gles1_ext_support_##name = 0;
+   int _gles1_ext_support_##name = 0; \
+   int _gles3_ext_support_##name = 0;
 #define _EVASGL_EXT_END()
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name) \
    int _gl_ext_support_func_##name = 0; \
-   int _gles1_ext_support_func_##name = 0;
+   int _gles1_ext_support_func_##name = 0; \
+   int _gles3_ext_support_func_##name = 0;
 #define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
 #define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param)
 #define _EVASGL_EXT_FUNCTION_END()
@@ -297,7 +302,11 @@ evgl_evasglQueryWaylandBuffer(Evas_GL *evas_gl EINA_UNUSED,
 #else
 #endif
 
-// 0: not initialized, 1: GLESv2 initialized, 2: GLESv1 also initialized
+//  0: not initialized,
+//  1: GLESv2 initialized,
+//  3: GLESv1 and GLESv2 initialized,
+//  5: GLESv3 and GLESv2 initialized,
+//  7: GLESv3 + GLESv2  + GLESv1 all initialized.
 static int _evgl_api_ext_status = 0;
 
 Eina_Bool
@@ -544,13 +553,14 @@ evgl_api_ext_get(Evas_GL_API *gl_funcs)
 Eina_Bool
 _evgl_api_gles1_ext_init(void)
 {
-   if (_evgl_api_ext_status >= 2)
+   // Return if GLESv1 ext is already intiialised
+   if (_evgl_api_ext_status & 0x2)
      return EINA_TRUE;
 
 #ifdef GL_GLES
    int _curext_supported = 0;
    Evas_GL_API *gles1_funcs;
-   const char *gles1_exts;
+   const char *gles1_exts, *eglexts;
    EVGL_Resource *rsc;
    EGLint context_version;
    EGLDisplay dpy = EGLDISPLAY_GET();
@@ -597,6 +607,13 @@ _evgl_api_gles1_ext_init(void)
         return EINA_FALSE;
      }
 
+   eglexts = eglQueryString(dpy, EGL_EXTENSIONS);
+   if (!eglexts)
+     {
+        ERR("eglQueryString(EGL_EXTENSIONS) returned NULL!");
+        eglexts = "";
+     }
+
    if (!_gles1_ext_string)
      {
         _gles1_ext_string = calloc(MAX_EXTENSION_STRING_BUFFER, 1);
@@ -622,7 +639,7 @@ _evgl_api_gles1_ext_init(void)
    }
 
 #define _EVASGL_EXT_CHECK_SUPPORT(name) \
-   (strstr(gles1_exts, name) != NULL)
+   ((strstr(gles1_exts, name) != NULL) || (strstr(eglexts, name) != NULL))
 
 #define _EVASGL_EXT_DISCARD_SUPPORT() \
    *ext_support = 0;
@@ -738,8 +755,8 @@ _evgl_api_gles1_ext_init(void)
    if (evgl_engine->api_debug_mode)
      DBG("GLES1: List of supported extensions:\n%s", _gles1_ext_string);
 
-   // Both GLES versions have been initialized!
-   _evgl_api_ext_status 2;
+   // GLESv1 version has been initialized!
+   _evgl_api_ext_status |= 0x2;
    return EINA_TRUE;
 #else
    ERR("GLESv1 support is not implemented for GLX");
@@ -756,7 +773,7 @@ evgl_api_gles1_ext_get(Evas_GL_API *gl_funcs)
         return;
      }
 
-   if (_evgl_api_ext_status < 2)
+   if (!(_evgl_api_ext_status & 0x2))
      {
         DBG("Initializing GLESv1 extensions...");
         if (!_evgl_api_gles1_ext_init())
@@ -816,8 +833,276 @@ evgl_api_gles1_ext_get(Evas_GL_API *gl_funcs)
 
 }
 
+Eina_Bool
+_evgl_api_gles3_ext_init(void)
+{
+   if (_evgl_api_ext_status & 0x4)
+     return EINA_TRUE;
+
+   int _curext_supported = 0;
+   Evas_GL_API *gles3_funcs;
+   const char *gles3_exts;
+#ifdef GL_GLES
+   EVGL_Resource *rsc;
+   EGLint context_version;
+   EGLDisplay dpy = EGLDISPLAY_GET();
+
+   /* glGetString returns the information for the currently bound context
+    * So, update gles3_exts only if GLES3 context is currently bound.
+    * Check here if GLESv3 is current
+    */
+   if (!(rsc=_evgl_tls_resource_get()))
+     {
+        ERR("Unable to initialize GLES3 extensions. Error retrieving tls");
+        return EINA_FALSE;
+     }
+
+   if ((dpy == EGL_NO_DISPLAY) || !rsc->current_ctx)
+     {
+        DBG("Unable to initialize GLES3 extensions. Engine not initialised");
+        return EINA_FALSE;
+     }
+
+   if (!eglQueryContext(dpy, rsc->current_ctx->context, EGL_CONTEXT_CLIENT_VERSION, &context_version))
+     {
+        ERR("Unable to initialize GLES3 extensions. eglQueryContext failed 0x%x", eglGetError());
+        return EINA_FALSE;
+     }
+
+   if (context_version != EVAS_GL_GLES_3_X)
+     {
+        DBG("GLESv3 context not bound");
+        return EINA_FALSE;
+     }
+#endif
+
+   gles3_funcs = _evgl_api_gles3_internal_get();
+   if (!gles3_funcs || !gles3_funcs->glGetString)
+     {
+        ERR("Could not get address of glGetString in GLESv3 library!");
+        return EINA_FALSE;
+     }
+
+   gles3_exts = (const char *) gles3_funcs->glGetString(GL_EXTENSIONS);
+   if (!gles3_exts)
+     {
+        ERR("GLESv3:glGetString(GL_EXTENSIONS) returned NULL!");
+        return EINA_FALSE;
+     }
+
+   if (!_gles3_ext_string)
+     {
+        _gles3_ext_string = calloc(MAX_EXTENSION_STRING_BUFFER, 1);
+        if (!_gles3_ext_string) return EINA_FALSE;
+     }
+
+   _gles3_ext_string[0] = '\0';
+
+   /////////////////////////////////////////////////////////////////////////////////////////////////////
+   // Scanning supported extensions, sets the variables
+   /////////////////////////////////////////////////////////////////////////////////////////////////////
+
+   // Preparing all the magic macros
+#define GETPROCADDR(sym) \
+   ((__typeof__((*drvfunc))) (eglGetProcAddress(sym)))
+
+#define _EVASGL_EXT_BEGIN(name) \
+   { \
+      int *ext_support = &_gles3_ext_support_##name; \
+      *ext_support = 0;
+
+#define _EVASGL_EXT_END() \
+   }
+
+#define _EVASGL_EXT_CHECK_SUPPORT(name) \
+   (strstr(gles3_exts, name) != NULL)
+
+#define _EVASGL_EXT_DISCARD_SUPPORT() \
+   *ext_support = 0;
+
+#define _EVASGL_EXT_DRVNAME(name) \
+   if (_EVASGL_EXT_CHECK_SUPPORT(#name)) *ext_support = 1;
+
+#define _EVASGL_EXT_DRVNAME_PRIVATE(name) \
+   if (_EVASGL_EXT_CHECK_SUPPORT(#name)) { *ext_support = 1; _gles3_ext_support_func_##name = 1; }
+#define _EVASGL_EXT_DRVNAME_DESKTOP(deskname) \
+   if (_EVASGL_EXT_CHECK_SUPPORT(deskname)) *ext_support = 1;
+
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param) \
+     { \
+        ret (**drvfunc)param = &gles3_ext_sym_##name; \
+        if (*ext_support == 1) \
+          {
+
+#define _EVASGL_EXT_FUNCTION_END() \
+          } \
+        if ((*drvfunc) == NULL) _EVASGL_EXT_DISCARD_SUPPORT(); \
+     }
+#define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
+#define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
+#define _EVASGL_EXT_FUNCTION_DRVFUNC(name) \
+   if ((*drvfunc) == NULL) *drvfunc = name;
+
+#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name) \
+   if ((*drvfunc) == NULL) \
+     { \
+        *drvfunc = GETPROCADDR(name); \
+        evgl_safe_extension_add(name, (void *) (*drvfunc)); \
+     } \
+   else evgl_safe_extension_add(name, NULL);
+
+#ifdef _EVASGL_EXT_FUNCTION_WHITELIST
+# undef _EVASGL_EXT_FUNCTION_WHITELIST
+#endif
+#define _EVASGL_EXT_FUNCTION_WHITELIST(name) evgl_safe_extension_add(name, NULL);
+
+   // Okay, now we are ready to scan.
+#include "evas_gl_api_ext_def.h"
+
+#undef _EVASGL_EXT_FUNCTION_WHITELIST
+#undef _EVASGL_EXT_CHECK_SUPPORT
+#undef _EVASGL_EXT_DISCARD_SUPPORT
+#undef _EVASGL_EXT_BEGIN
+#undef _EVASGL_EXT_END
+#undef _EVASGL_EXT_DRVNAME
+#undef _EVASGL_EXT_DRVNAME_PRIVATE
+#undef _EVASGL_EXT_DRVNAME_DESKTOP
+#undef _EVASGL_EXT_FUNCTION_BEGIN
+#undef _EVASGL_EXT_FUNCTION_END
+#undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
+#undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
+#undef _EVASGL_EXT_FUNCTION_DRVFUNC
+#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
+#undef GETPROCADDR
+
+#define _EVASGL_EXT_BEGIN(name) \
+     _curext_supported = (_gles3_ext_support_##name != 0);
+
+
+   /////////////////////////////////////////////////////////////////////////////////////////////////////
+   // Scanning again to add to the gles3 ext string list
+   /////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#define _EVASGL_EXT_END()
+#define _EVASGL_EXT_CHECK_SUPPORT(name)
+#define _EVASGL_EXT_DISCARD_SUPPORT()
+#define _EVASGL_EXT_DRVNAME_PRINT(name) \
+     { \
+        if ((strncmp(name, "GL", 2) == 0) && (strstr(_gles3_ext_string, name) == NULL)) \
+          strcat(_gles3_ext_string, name" "); \
+     }
+#define _EVASGL_EXT_DRVNAME(name) \
+   if (_curext_supported) \
+      _EVASGL_EXT_DRVNAME_PRINT(#name)
+#define _EVASGL_EXT_DRVNAME_PRIVATE(name) \
+   if (_curext_supported && _gles3_ext_support_func_##name) \
+      _EVASGL_EXT_DRVNAME_PRINT(#name)
+#define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param)
+#define _EVASGL_EXT_FUNCTION_END()
+#define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
+#define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
+#define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
+#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
+
+#include "evas_gl_api_ext_def.h"
+
+#undef _EVASGL_EXT_CHECK_SUPPORT
+#undef _EVASGL_EXT_DISCARD_SUPPORT
+#undef _EVASGL_EXT_BEGIN
+#undef _EVASGL_EXT_END
+#undef _EVASGL_EXT_DRVNAME_PRINT
+#undef _EVASGL_EXT_DRVNAME
+#undef _EVASGL_EXT_DRVNAME_PRIVATE
+#undef _EVASGL_EXT_DRVNAME_DESKTOP
+#undef _EVASGL_EXT_FUNCTION_BEGIN
+#undef _EVASGL_EXT_FUNCTION_END
+#undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
+#undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
+#undef _EVASGL_EXT_FUNCTION_DRVFUNC
+#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
+
+   if (evgl_engine->api_debug_mode)
+     DBG("GLES3: List of supported extensions:\n%s", _gles3_ext_string);
+
+   // GLESv3 version has been initialized!
+   _evgl_api_ext_status |= 0x4;
+   return EINA_TRUE;
+}
+
+void
+evgl_api_gles3_ext_get(Evas_GL_API *gl_funcs)
+{
+   if (_evgl_api_ext_status < 1)
+     {
+        ERR("EVGL extension is not yet initialized.");
+        return;
+     }
+
+   if (!(_evgl_api_ext_status & 0x4))
+     {
+        DBG("Initializing GLESv3 extensions...");
+        if (!_evgl_api_gles3_ext_init())
+          {
+             ERR("GLESv3 extensions initialization failed");
+             return;
+          }
+     }
+
+#define ORD(f) EVAS_API_OVERRIDE(f, gl_funcs, gles3_ext_sym_)
+
+   /////////////////////////////////////////////////////////////////////////////////////////////////////
+   // Extension HEADER
+   /////////////////////////////////////////////////////////////////////////////////////////////////////
+#define _EVASGL_EXT_CHECK_SUPPORT(name)
+#define _EVASGL_EXT_DISCARD_SUPPORT()
+#define _EVASGL_EXT_BEGIN(name) \
+   if (_gles3_ext_support_##name != 0) \
+     {
+#define _EVASGL_EXT_END() \
+     }
+#define _EVASGL_EXT_DRVNAME(name)
+#define _EVASGL_EXT_DRVNAME_PRIVATE(name)
+#define _EVASGL_EXT_DRVNAME_DESKTOP(deskname)
+#define _EVASGL_EXT_FUNCTION_BEGIN(ret, name, param) \
+   ORD(name);
+#define _EVASGL_EXT_FUNCTION_END()
+#define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN()
+#define _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END()
+#define _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN(ret, name, param)
+#define _EVASGL_EXT_FUNCTION_PRIVATE_END()
+#define _EVASGL_EXT_FUNCTION_DRVFUNC(name)
+#define _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR(name)
+
+#undef _EVASGL_EXT_WHITELIST_ONLY
+#define _EVASGL_EXT_WHITELIST_ONLY 0
+
+#include "evas_gl_api_ext_def.h"
+
+#undef _EVASGL_EXT_CHECK_SUPPORT
+#undef _EVASGL_EXT_DISCARD_SUPPORT
+#undef _EVASGL_EXT_BEGIN
+#undef _EVASGL_EXT_END
+#undef _EVASGL_EXT_DRVNAME
+#undef _EVASGL_EXT_DRVNAME_PRIVATE
+#undef _EVASGL_EXT_DRVNAME_DESKTOP
+#undef _EVASGL_EXT_FUNCTION_BEGIN
+#undef _EVASGL_EXT_FUNCTION_END
+#undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_BEGIN
+#undef _EVASGL_EXT_FUNCTION_DISABLE_FOR_GLES1_END
+#undef _EVASGL_EXT_FUNCTION_PRIVATE_BEGIN
+#undef _EVASGL_EXT_FUNCTION_PRIVATE_END
+#undef _EVASGL_EXT_FUNCTION_DRVFUNC
+#undef _EVASGL_EXT_FUNCTION_DRVFUNC_PROCADDR
+   /////////////////////////////////////////////////////////////////////////////////////////////////////
+#undef ORD
+
+}
+
+
+
 const char *
-evgl_api_ext_string_get(Eina_Bool official, Eina_Bool gles1)
+evgl_api_ext_string_get(Eina_Bool official, int version)
 {
    if (_evgl_api_ext_status < 1)
      {
@@ -825,9 +1110,12 @@ evgl_api_ext_string_get(Eina_Bool official, Eina_Bool gles1)
         return NULL;
      }
 
-   if (gles1)
+   if (version == EVAS_GL_GLES_1_X)
      return _gles1_ext_string;
 
+   if (version == EVAS_GL_GLES_3_X)
+     return _gles3_ext_string;
+
    if (official)
      return _gl_ext_string_official;
 
index 4c969ff..2f10e4c 100644 (file)
@@ -51,6 +51,7 @@
 /////////////////////////////////////////////////////////////////////////////////////////////////////
 #define EXT_FUNC(fname) gl_ext_sym_##fname
 #define EXT_FUNC_GLES1(fname) gles1_ext_sym_##fname
+#define EXT_FUNC_GLES3(fname) gles3_ext_sym_##fname
 
 /////////////////////////////////////////////////////////////////////////////////////////////////////
 // Extension HEADER
@@ -59,7 +60,8 @@
 #define _EVASGL_EXT_DISCARD_SUPPORT()
 #define _EVASGL_EXT_BEGIN(name) \
    extern int _gl_ext_support_##name; \
-   extern int _gles1_ext_support_##name;
+   extern int _gles1_ext_support_##name; \
+   extern int _gles3_ext_support_##name;
 #define _EVASGL_EXT_END()
 #define _EVASGL_EXT_DRVNAME(name)
 #define _EVASGL_EXT_DRVNAME_PRIVATE(name)
 /////////////////////////////////////////////////////////////////////////////////////////////////////
 #define EXTENSION_SUPPORT(name) (_gl_ext_support_##name == 1)
 #define EXTENSION_SUPPORT_GLES1(name) (_gles1_ext_support_##name == 1)
+#define EXTENSION_SUPPORT_GLES3(name) (_gles3_ext_support_##name == 1)
 
 extern Eina_Bool evgl_api_ext_init(void *getproc, const char *glueexts);
 extern void evgl_api_ext_get(Evas_GL_API *gl_funcs);
 extern void evgl_api_gles1_ext_get(Evas_GL_API *gl_funcs);
-extern const char *evgl_api_ext_string_get(Eina_Bool official, Eina_Bool gles1);
+extern void evgl_api_gles3_ext_get(Evas_GL_API *gl_funcs);
+extern const char *evgl_api_ext_string_get(Eina_Bool official, int version);
 
 #endif //_EVAS_GL_API_EXT_H
 
index bc12efb..06a051b 100644 (file)
 #endif
 
 #ifndef GL_UNPACK_ROW_LENGTH
-# define GL_UNPACK_ROW_LENGTH 0x0cf2
+# define GL_UNPACK_ROW_LENGTH 0x0CF2
 #endif
 #ifndef EGL_NO_DISPLAY
 # define EGL_NO_DISPLAY 0
@@ -518,6 +518,7 @@ struct _Evas_Engine_GL_Context
 #endif
 
    GLuint preserve_bit;
+   int gles_version;
 };
 
 struct _Evas_GL_Texture_Pool
index ba984ee..9d667e1 100644 (file)
@@ -288,13 +288,14 @@ matrix_ortho(GLfloat *m,
 }
 
 static int
-_evas_gl_common_version_check()
+_evas_gl_common_version_check(int *gles_ver)
 {
    char *version;
    char *tmp;
    char *tmp2;
    int major = 0;
    int minor = 0;
+   *gles_ver = 0;
 
   /*
    * glGetString returns a string describing the current GL connection.
@@ -326,11 +327,21 @@ _evas_gl_common_version_check()
         return 0;
      }
 
+   /* OpenGL ES 3.*  */
+
+   if (strstr(version, "OpenGL ES 3"))
+     {
+        /* Supported */
+        *gles_ver = 3;
+        return 1;
+     }
+
    /* OpenGL ES 2.* ? */
 
    if (strstr(version, "OpenGL ES "))
      {
         /* Supported */
+        *gles_ver = 2;
         return 1;
      }
 
@@ -372,8 +383,16 @@ _evas_gl_common_version_check()
  fail:
    free(version);
 
-   if (((major == 1) && (minor >= 4)) || (major >= 2))
+   if (((major == 1) && (minor >= 4)) || (major >= 2)) {
+
+     /* Map GL to GLES version: Refer http://en.wikipedia.org/wiki/OpenGL_ES */
+     if ((major >=4 ) && (minor >= 3))
+       *gles_ver = 3;
+     else
+       *gles_ver = 2;
+
      return 1;
+   }
 
    return 0;
 }
@@ -537,6 +556,7 @@ evas_gl_common_context_new(void)
    Evas_Engine_GL_Context *gc;
    const char *s;
    int i;
+   int gles_version;
 
 #if 1
    if (_evas_gl_common_context)
@@ -545,10 +565,11 @@ evas_gl_common_context_new(void)
         return _evas_gl_common_context;
      }
 #endif
-   if (!_evas_gl_common_version_check())
+   if (!_evas_gl_common_version_check(&gles_version))
      return NULL;
    gc = calloc(1, sizeof(Evas_Engine_GL_Context));
    if (!gc) return NULL;
+   gc->gles_version = gles_version;
 
    gc->references = 1;
 
index 56603f0..17f21f7 100755 (executable)
@@ -12,6 +12,7 @@ typedef struct _GL_Format
 #define EVAS_GL_API_STRUCT_SIZE (sizeof(Evas_GL_API) + 300 * sizeof(void*))
 static Evas_GL_API *gl_funcs = NULL;
 static Evas_GL_API *gles1_funcs = NULL;
+static Evas_GL_API *gles3_funcs = NULL;
 
 EVGL_Engine *evgl_engine = NULL;
 int _evas_gl_log_dom   = -1;
@@ -176,7 +177,7 @@ _texture_allocate_2d(GLuint tex, GLint ifmt, GLenum fmt, GLenum type, int w, int
 {
    //if (!(*tex))
    //   glGenTextures(1, tex);
-   glBindTexture(GL_TEXTURE_2D, tex );
+   glBindTexture(GL_TEXTURE_2D, 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);
@@ -1650,7 +1651,6 @@ evgl_engine_init(void *eng_data, const EVGL_Interface *efunc)
 
    // Clear Function Pointers
    if (!gl_funcs) gl_funcs = calloc(1, EVAS_GL_API_STRUCT_SIZE);
-   if (!gles1_funcs) gles1_funcs = calloc(1, EVAS_GL_API_STRUCT_SIZE);
 
    // Direct surfaces map texid->Evas_GL_Surface
    evgl_engine->direct_surfaces = eina_hash_int32_new(NULL);
@@ -1811,15 +1811,15 @@ evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, int h)
 
    if (sfc->direct_fb_opt)
      {
-        if (!sfc->gles1_indirect)
+        if (!sfc->indirect)
           {
              eina_hash_add(evgl_engine->direct_surfaces, &sfc->color_buf, sfc);
              DBG("Added tex %d as direct surface: %p", sfc->color_buf, sfc);
           }
         else
           {
-             eina_hash_add(evgl_engine->direct_surfaces, &sfc->gles1_sfc_native, sfc);
-             DBG("Added tex %d as direct surface: %p", sfc->gles1_sfc_native, sfc);
+             eina_hash_add(evgl_engine->direct_surfaces, &sfc->indirect_sfc_native, sfc);
+             DBG("Added native %p as direct surface: %p", sfc->indirect_sfc_native, sfc);
           }
      }
 
@@ -2028,24 +2028,24 @@ evgl_surface_destroy(void *eng_data, EVGL_Surface *sfc)
           }
      }
 
-   // Destroy surface used for 1.1
-   if (sfc->gles1_indirect)
+   // Destroy indirect surface
+   if (sfc->indirect)
      {
         int ret;
-        if (dbg) DBG("sfc %p is used for GLES 1.x indirect rendering", sfc);
+        if (dbg) DBG("sfc %p is used for indirect rendering", sfc);
 
-        if (!evgl_engine->funcs->gles1_surface_destroy)
+        if (!evgl_engine->funcs->indirect_surface_destroy)
           {
-             ERR("Error destroying GLES 1.x surface");
+             ERR("Error destroying indirect surface");
              return 0;
           }
 
-        DBG("Destroying special surface used for GLES 1.x rendering");
-        ret = evgl_engine->funcs->gles1_surface_destroy(eng_data, sfc);
+        DBG("Destroying special surface used for indirect rendering");
+        ret = evgl_engine->funcs->indirect_surface_destroy(eng_data, sfc);
 
         if (!ret)
           {
-             ERR("Engine failed to destroy a GLES1.x Surface.");
+             ERR("Engine failed to destroy indirect surface.");
              return ret;
           }
      }
@@ -2087,15 +2087,15 @@ evgl_surface_destroy(void *eng_data, EVGL_Surface *sfc)
 
    if (sfc->direct_fb_opt)
      {
-        if (!sfc->gles1_indirect)
+        if (!sfc->indirect)
           {
              eina_hash_del(evgl_engine->direct_surfaces, &sfc->color_buf, sfc);
              DBG("Removed tex %d as direct surface: %p", sfc->color_buf, sfc);
           }
         else
           {
-             eina_hash_del(evgl_engine->direct_surfaces, &sfc->gles1_sfc_native, sfc);
-             DBG("Removed native %p as direct surface: %p", sfc->gles1_sfc_native, sfc);
+             eina_hash_del(evgl_engine->direct_surfaces, &sfc->indirect_sfc_native, sfc);
+             DBG("Removed native %p as direct surface: %p", sfc->indirect_sfc_native, sfc);
           }
      }
 
@@ -2234,11 +2234,11 @@ evgl_context_destroy(void *eng_data, EVGL_Context *ctx)
         return 0;
      }
 
-   // Destroy GLES1 indirect rendering context
-   if (ctx->gles1_context &&
-       !evgl_engine->funcs->context_destroy(eng_data, ctx->context))
+   // Destroy indirect rendering context
+   if (ctx->indirect_context &&
+       !evgl_engine->funcs->context_destroy(eng_data, ctx->indirect_context))
      {
-        ERR("Error destroying the GLES1 context.");
+        ERR("Error destroying the indirect context.");
         return 0;
      }
 
@@ -2289,7 +2289,7 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
 
    if (!rsc)
      {
-        DBG("Creating new TLS for this thread: %lu", eina_thread_self());
+        DBG("Creating new TLS for this thread: %lu", (unsigned long)eina_thread_self());
         rsc = _evgl_tls_resource_create(eng_data);
         if (!rsc) return 0;
      }
@@ -2433,7 +2433,7 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
 
    if (!ctx->fbo_image_supported)
      {
-        if (dbg) DBG("ctx %p is GLES 1", ctx);
+        if (dbg) DBG("ctx %p is GLES %d", ctx, ctx->version);
         if (_evgl_direct_renderable(rsc, sfc))
           {
              // Transition from indirect rendering to direct rendering
@@ -2449,20 +2449,21 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
           }
         else
           {
-             if (dbg) DBG("Calling make_current(%p, %p)", sfc->gles1_sfc, ctx->context);
-             if (!ctx->gles1_context)
+             if (dbg) DBG("Calling make_current(%p, %p)", sfc->indirect_sfc, ctx->context);
+             if (!ctx->indirect_context)
                {
-                  ctx->gles1_context =
-                        evgl_engine->funcs->gles1_context_create(eng_data, ctx, sfc);
+                  ctx->indirect_context =
+                        evgl_engine->funcs->gles_context_create(eng_data, ctx, sfc);
                }
-             if (!evgl_engine->funcs->make_current(eng_data, sfc->gles1_sfc,
-                                                   ctx->gles1_context, EINA_TRUE))
+             if (dbg) DBG("Calling make_current(%p, %p)", sfc->indirect_sfc, ctx->context);
+             if (!evgl_engine->funcs->make_current(eng_data, sfc->indirect_sfc,
+                                                   ctx->indirect_context, EINA_TRUE))
                {
-                  ERR("Failed to make current with GLES1 indirect surface.");
+                  ERR("Failed to make current with indirect surface.");
                   return 0;
                }
 
-             // Transition from direct rendering to pixmap surface rendering
+             // Transition from direct rendering to indirect rendering
              if (rsc->direct.rendered)
                {
                   glViewport(ctx->viewport_coord[0], ctx->viewport_coord[1], ctx->viewport_coord[2], ctx->viewport_coord[3]);
@@ -2474,7 +2475,7 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
              rsc->direct.rendered = 0;
           }
      }
-   else // gles 2.x and 3.x
+   else
      {
         Eina_Bool use_extension = EINA_FALSE;
         if ((ctx->version == EVAS_GL_GLES_1_X) && (gles1_funcs))
@@ -2594,10 +2595,17 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
 const char *
 evgl_string_query(int name)
 {
+   EVGL_Resource *rsc;
+   int ctx_version = EVAS_GL_GLES_2_X;
+
    switch(name)
      {
       case EVAS_GL_EXTENSIONS:
-         return evgl_api_ext_string_get(EINA_FALSE, EINA_FALSE);
+         rsc = _evgl_tls_resource_get();
+         if ((rsc) && (rsc->current_ctx))
+           ctx_version = rsc->current_ctx->version;
+         return evgl_api_ext_string_get(EINA_FALSE, ctx_version);
+
       default:
          return "";
      };
@@ -2672,7 +2680,7 @@ evgl_native_surface_get(EVGL_Surface *sfc, Evas_Native_Surface *ns)
         return 0;
      }
 
-   if (!sfc->gles1_indirect)
+   if (!sfc->indirect)
      {
         ns->type = EVAS_NATIVE_SURFACE_EVASGL;
         ns->version = EVAS_NATIVE_SURFACE_VERSION;
@@ -2682,8 +2690,8 @@ evgl_native_surface_get(EVGL_Surface *sfc, Evas_Native_Surface *ns)
      {
         ns->type = EVAS_NATIVE_SURFACE_X11;
         ns->version = EVAS_NATIVE_SURFACE_VERSION;
-        ns->data.x11.pixmap = (unsigned long)(intptr_t)sfc->gles1_sfc_native;
-        ns->data.x11.visual = sfc->gles1_sfc_visual;
+        ns->data.x11.pixmap = (unsigned long)(intptr_t)sfc->indirect_sfc_native;
+        ns->data.x11.visual = sfc->indirect_sfc_visual;
      }
 
    return 1;
@@ -2839,9 +2847,23 @@ evgl_api_get(Evas_GL_Context_Version version)
      }
    else if (version == EVAS_GL_GLES_1_X)
      {
+        if (!gles1_funcs) gles1_funcs = calloc(1, EVAS_GL_API_STRUCT_SIZE);
+
         _evgl_api_gles1_get(gles1_funcs, evgl_engine->api_debug_mode);
         return gles1_funcs;
      }
+   else if (version == EVAS_GL_GLES_3_X)
+     {
+        // Allocate gles3 funcs here, as this is called only if GLES_3 is supported
+        if (!gles3_funcs) gles3_funcs = calloc(1, EVAS_GL_API_STRUCT_SIZE);
+
+        if (!_evgl_api_gles3_get(gles3_funcs, evgl_engine->api_debug_mode))
+          {
+             free(gles3_funcs);
+             gles3_funcs = NULL;
+          }
+        return gles3_funcs;
+     }
    else return NULL;
 }
 
index db17e58..ae6ed63 100755 (executable)
@@ -69,14 +69,14 @@ struct _EVGL_Interface
    void       *(*pbuffer_surface_create)(void *data, EVGL_Surface *evgl_sfc, const int *attrib_list);
    int         (*pbuffer_surface_destroy)(void *data, void *surface);
 
-   // Create a surface for 1.x rendering (could be pbuffer or xpixmap for instance)
-   void       *(*gles1_surface_create)(void *data, EVGL_Surface *evgl_sfc, Evas_GL_Config *cfg, int w, int h);
+   // Create a surface for 1.x & 3.x rendering (could be pbuffer or xpixmap for instance)
+   void       *(*indirect_surface_create)(EVGL_Engine *evgl, void *data, EVGL_Surface *evgl_sfc, Evas_GL_Config *cfg, int w, int h);
 
-   // Destroy 1.x surface (could be pbuffer or xpixmap for instance)
-   int        (*gles1_surface_destroy)(void *data, EVGL_Surface *evgl_sfc);
+   // Destroy 1.x & 3.x surface (could be pbuffer or xpixmap for instance)
+   int        (*indirect_surface_destroy)(void *data, EVGL_Surface *evgl_sfc);
 
-   // Create an indirect rendering context for GLES 1.x
-   void      *(*gles1_context_create)(void *data, EVGL_Context *share_ctx, EVGL_Surface *evgl_sfc);
+   // Create an indirect rendering context for GLES 1.x and 3.x
+   void      *(*gles_context_create)(void *data, EVGL_Context *share_ctx, EVGL_Surface *evgl_sfc);
 
    // Check native window surface config for Evas GL Direct Rendering
    int        (*native_win_surface_config_check)(void *data, int evgl_depth, int evgl_stencil, int evgl_msaa);
@@ -115,9 +115,8 @@ struct _EVGL_Surface
    unsigned client_side_rotation : 1;
    unsigned alpha : 1;
 
-   // Flag indicating this surface is used for GLES 1 indirect rendering
-   unsigned gles1_indirect : 1;
-   unsigned xpixmap : 1;
+   // Flag indicating this surface is used for indirect rendering
+   unsigned indirect : 1;
 
    // Moved from evgl_engine
    unsigned direct_override : 1;
@@ -135,11 +134,11 @@ struct _EVGL_Surface
    int     buffer_mem[4];
 
    //-------------------------//
-   // Used if gles1_indirect == 1
-   EVGLNative_Surface gles1_sfc;
-   void              *gles1_sfc_native;
-   void              *gles1_sfc_visual;
-   void              *gles1_sfc_config;
+   // Used if indirect == 1
+   EVGLNative_Surface indirect_sfc;
+   void              *indirect_sfc_native;
+   void              *indirect_sfc_visual;
+   void              *indirect_sfc_config;
    void              *egl_image;
 
    //-------------------------//
@@ -182,8 +181,8 @@ struct _EVGL_Context
    int          viewport_coord[4];
    int          viewport_direct[4];
 
-   // For GLES1 with indirect rendering
-   EVGLNative_Context gles1_context;
+   // For GLES1/GLES3 with indirect rendering
+   EVGLNative_Context indirect_context;
 
    // Partial Rendering
    int          partial_render;
@@ -342,6 +341,7 @@ extern EVGL_Engine   *evgl_engine;
 // Internally used functions
 extern void           _evgl_api_get(Evas_GL_API *api, int debug);
 extern void           _evgl_api_gles1_get(Evas_GL_API *api, Eina_Bool debug);
+extern Eina_Bool      _evgl_api_gles3_get(Evas_GL_API *api, Eina_Bool debug);
 extern EVGL_Resource *_evgl_tls_resource_get(void);
 extern EVGL_Resource *_evgl_tls_resource_create(void *data);
 extern void           _evgl_tls_resource_destroy(void *data);
@@ -351,5 +351,6 @@ extern int            _evgl_direct_enabled(void);
 extern EVGLNative_Context _evgl_native_context_get(Evas_GL_Context *ctx);
 Eina_Bool             _evgl_api_gles1_ext_init(void);
 Evas_GL_API*          _evgl_api_gles1_internal_get(void);
+Evas_GL_API*          _evgl_api_gles3_internal_get(void);
 
 #endif //_EVAS_GL_CORE_PRIVATE_H
index 929eb06..2b6c24a 100755 (executable)
@@ -1251,8 +1251,29 @@ eng_gl_native_surface_get(void *data EINA_UNUSED, void *surface, void *native_su
 static void *
 eng_gl_api_get(void *data, int version)
 {
-   EVGLINIT(data, NULL);
-   return evgl_api_get(version);
+   Render_Engine_GL_Generic *re = data;
+   void *ret;
+   Evas_Engine_GL_Context *gl_context;
+   EVGLINIT(re, NULL);
+
+   gl_context = re->window_gl_context_get(re->software.ob);
+   if (!gl_context)
+     {
+        ERR("Invalid context!");
+        return NULL;
+     }
+   if ((version == EVAS_GL_GLES_3_X) && (gl_context->gles_version != EVAS_GL_GLES_3_X))
+     {
+        ERR("Version not supported!");
+        return NULL;
+     }
+   ret = evgl_api_get(version);
+
+   //Disable GLES3 support if symbols not present
+   if ((!ret) && (version == EVAS_GL_GLES_3_X))
+     gl_context->gles_version--;
+
+   return ret;
 }
 
 
index 164d59a..1977bde 100755 (executable)
@@ -87,6 +87,9 @@ glsym_func_void_ptr glsym_evas_gl_common_current_context_get = NULL;
 # define EGL_Y_INVERTED_NOK 0x307F
 #endif
 
+#ifndef EGL_OPENGL_ES3_BIT
+# define EGL_OPENGL_ES3_BIT 0x00000040
+#endif
 _eng_fn  (*glsym_eglGetProcAddress)            (const char *a) = NULL;
 void    *(*glsym_eglCreateImage)               (EGLDisplay a, EGLContext b, EGLenum c, EGLClientBuffer d, const int *e) = NULL;
 void     (*glsym_eglDestroyImage)              (EGLDisplay a, void *b) = NULL;
@@ -477,6 +480,13 @@ evgl_eng_context_create(void *data, void *share_ctx, Evas_GL_Context_Version ver
      }
 
 #ifdef GL_GLES
+   if ((version == EVAS_GL_GLES_3_X) &&
+       ((!eng_get_ob(re)->gl_context) || (eng_get_ob(re)->gl_context->gles_version != EVAS_GL_GLES_3_X)))
+     {
+        ERR("GLES 3 version not supported!");
+        glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_ATTRIBUTE);
+        return NULL;
+     }
    EGLContext context = EGL_NO_CONTEXT;
    int context_attrs[3];
 
@@ -492,7 +502,7 @@ evgl_eng_context_create(void *data, void *share_ctx, Evas_GL_Context_Version ver
                                    (EGLContext)share_ctx,
                                    context_attrs);
      }
-   else if (version == EVAS_GL_GLES_1_X)
+   else if ((version == EVAS_GL_GLES_1_X) || (version == EVAS_GL_GLES_3_X))
      {
         //This context will be used for DR only
         context = eglCreateContext(eng_get_ob(re)->egl_disp,
@@ -528,7 +538,7 @@ evgl_eng_context_create(void *data, void *share_ctx, Evas_GL_Context_Version ver
                                    (GLXContext)share_ctx,
                                    1);
      }
-   else if (version == EVAS_GL_GLES_1_X)
+   else if ((version == EVAS_GL_GLES_1_X) || (version == EVAS_GL_GLES_3_X))
      {
         context = glXCreateContext(eng_get_ob(re)->info->info.display,
                                    eng_get_ob(re)->visualinfo,
@@ -862,13 +872,14 @@ evgl_eng_pbuffer_surface_destroy(void *data, void *surface)
 }
 
 // This function should create a surface that can be used for offscreen rendering
-// with GLES 1.x, and still be bindable to a texture in Evas main GL context.
+// and still be bindable to a texture in Evas main GL context.
 // For now, this will create an X pixmap... Ideally it should be able to create
 // a bindable pbuffer surface or just an FBO if that is supported and it can
 // be shared with Evas.
 // FIXME: Avoid passing evgl_engine around like that.
 static void *
-evgl_eng_gles1_surface_create(void *data, EVGL_Surface *evgl_sfc,
+evgl_eng_indirect_surface_create(EVGL_Engine *evgl EINA_UNUSED, void *data,
+                              EVGL_Surface *evgl_sfc,
                               Evas_GL_Config *cfg, int w, int h)
 {
    Render_Engine *re = (Render_Engine *)data;
@@ -882,7 +893,8 @@ evgl_eng_gles1_surface_create(void *data, EVGL_Surface *evgl_sfc,
         return NULL;
      }
 
-   if ((cfg->gles_version != EVAS_GL_GLES_1_X) || (w < 1) || (h < 1))
+   if (((cfg->gles_version != EVAS_GL_GLES_3_X) && (cfg->gles_version != EVAS_GL_GLES_1_X))
+       || (w < 1) || (h < 1))
      {
         ERR("Inconsistent parameters, not creating any surface!");
         glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_PARAMETER);
@@ -942,7 +954,10 @@ try_again:
    config_attrs[i++] = EGL_SURFACE_TYPE;
    config_attrs[i++] = EGL_PIXMAP_BIT;
    config_attrs[i++] = EGL_RENDERABLE_TYPE;
-   config_attrs[i++] = EGL_OPENGL_ES_BIT;
+   if (cfg->gles_version == EVAS_GL_GLES_3_X)
+     config_attrs[i++] = EGL_OPENGL_ES3_BIT;
+   else
+     config_attrs[i++] = EGL_OPENGL_ES_BIT;
    if (alpha)
      {
         config_attrs[i++] = EGL_ALPHA_SIZE;
@@ -1070,32 +1085,29 @@ try_again:
         return NULL;
      }
 
-   evgl_sfc->gles1_indirect = EINA_TRUE;
-   evgl_sfc->xpixmap = EINA_TRUE;
-   evgl_sfc->gles1_sfc = egl_sfc;
-   evgl_sfc->gles1_sfc_native = (void *)(intptr_t) px;
-   evgl_sfc->gles1_sfc_visual = visual;
-   evgl_sfc->gles1_sfc_config = egl_cfg;
-   DBG("Successfully created GLES1 surface: Pixmap %p EGLSurface %p", px, egl_sfc);
+   evgl_sfc->indirect = EINA_TRUE;
+   evgl_sfc->indirect_sfc = egl_sfc;
+   evgl_sfc->indirect_sfc_native = (void *)(intptr_t) px;
+   evgl_sfc->indirect_sfc_visual = visual;
+   evgl_sfc->indirect_sfc_config = egl_cfg;
+   DBG("Successfully created indirect surface: Pixmap %lu EGLSurface %p", px, egl_sfc);
    return evgl_sfc;
 
 #else
    // TODO/FIXME: do the same as with EGL above...
-   ERR("GLX support is not fully implemented for GLES 1.x");
+   ERR("GLX support is not fully implemented for indirect surface");
 
-   evgl_sfc->gles1_indirect = EINA_TRUE;
-   evgl_sfc->xpixmap = EINA_TRUE;
-   evgl_sfc->gles1_sfc_native = (void *)(intptr_t) px;
-   evgl_sfc->gles1_sfc = (void *)(intptr_t) px;
-   evgl_sfc->gles1_sfc_visual = eng_get_ob(re)->info->info.visual; // FIXME: Check this!
+   evgl_sfc->indirect = EINA_TRUE;
+   evgl_sfc->indirect_sfc_native = (void *)(intptr_t) px;
+   evgl_sfc->indirect_sfc = (void *)(intptr_t) px;
+   evgl_sfc->indirect_sfc_visual = eng_get_ob(re)->info->info.visual; // FIXME: Check this!
    return evgl_sfc;
 #endif
 }
 
-// This function should destroy the surface used for offscreen rendering
-// with GLES 1.x.This will also destroy the X pixmap...
+// This function should destroy the indirect surface as well as the X pixmap
 static int
-evgl_eng_gles1_surface_destroy(void *data, EVGL_Surface *evgl_sfc)
+evgl_eng_indirect_surface_destroy(void *data, EVGL_Surface *evgl_sfc)
 {
    Render_Engine *re = (Render_Engine *)data;
 
@@ -1107,30 +1119,30 @@ evgl_eng_gles1_surface_destroy(void *data, EVGL_Surface *evgl_sfc)
      }
 
 #ifdef GL_GLES
-   if ((!evgl_sfc) || (!evgl_sfc->gles1_sfc))
+   if ((!evgl_sfc) || (!evgl_sfc->indirect_sfc))
      {
-        ERR("Invalid surface.");
+        ERR("Invalid surface");
         glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_SURFACE);
         return 0;
      }
 
-   eglDestroySurface(eng_get_ob(re)->egl_disp, (EGLSurface)evgl_sfc->gles1_sfc);
+   eglDestroySurface(eng_get_ob(re)->egl_disp, (EGLSurface)evgl_sfc->indirect_sfc);
 #endif
 
-   if (!evgl_sfc->gles1_sfc_native)
+   if (!evgl_sfc->indirect_sfc_native)
      {
-        ERR("Inconsistent parameters, not freeing XPixmap for gles1 surface!");
+        ERR("Inconsistent parameters, not freeing XPixmap for indirect surface!");
         glsym_evas_gl_common_error_set(data, EVAS_GL_BAD_PARAMETER);
         return 0;
      }
 
-   XFreePixmap(eng_get_ob(re)->disp, (Pixmap)evgl_sfc->gles1_sfc_native);
+   XFreePixmap(eng_get_ob(re)->disp, (Pixmap)evgl_sfc->indirect_sfc_native);
 
    return 1;
 }
 
 static void *
-evgl_eng_gles1_context_create(void *data,
+evgl_eng_gles_context_create(void *data,
                               EVGL_Context *share_ctx, EVGL_Surface *sfc)
 {
    Render_Engine *re = data;
@@ -1141,17 +1153,23 @@ evgl_eng_gles1_context_create(void *data,
    int context_attrs[3];
    EGLConfig config;
 
+   if (!share_ctx)
+     {
+        ERR("Share context not set, Unable to retrieve GLES version");
+        return NULL;
+     }
+
    context_attrs[0] = EGL_CONTEXT_CLIENT_VERSION;
-   context_attrs[1] = 1;
+   context_attrs[1] = share_ctx->version;
    context_attrs[2] = EGL_NONE;
 
-   if (!sfc || !sfc->gles1_sfc_config)
+   if (!sfc || !sfc->indirect_sfc_config)
      {
         ERR("Surface is not set! Creating context anyways but eglMakeCurrent "
             "might very well fail with EGL_BAD_MATCH (0x3009)");
         config = eng_get_ob(re)->egl_config;
      }
-   else config = sfc->gles1_sfc_config;
+   else config = sfc->indirect_sfc_config;
 
    context = eglCreateContext(eng_get_ob(re)->egl_disp, config,
                               share_ctx ? share_ctx->context : NULL,
@@ -1164,7 +1182,7 @@ evgl_eng_gles1_context_create(void *data,
         return NULL;
      }
 
-   DBG("Successfully created context for GLES1 indirect rendering.");
+   DBG("Successfully created context for indirect rendering.");
    return context;
 #else
    CRIT("Support for GLES1 indirect rendering contexts is not implemented for GLX");
@@ -1207,9 +1225,9 @@ static const EVGL_Interface evgl_funcs =
    evgl_eng_rotation_angle_get,
    evgl_eng_pbuffer_surface_create,
    evgl_eng_pbuffer_surface_destroy,
-   evgl_eng_gles1_surface_create,
-   evgl_eng_gles1_surface_destroy,
-   evgl_eng_gles1_context_create,
+   evgl_eng_indirect_surface_create,
+   evgl_eng_indirect_surface_destroy,
+   evgl_eng_gles_context_create,
    evgl_eng_native_win_surface_config_check,
 };