Evas GL: Add support for Evas GL 3.0

Summary:
This should enable applications to use GLES 3.0 through evas gl.
Todo: Fix indirect rendering issue occuring because texture objects
cannot be shared between different version of GLES contexts.
Todo: extension pointers need to be updated for GLES 3.0

Reviewers: wonsik, spacegrapher, jpeg

Subscribers: cedric

Differential Revision: https://phab.enlightenment.org/D2017

@feature
This commit is contained in:
mythri.venugopal 2015-03-05 15:36:35 +09:00 committed by Jean-Philippe Andre
parent bb134a5cc3
commit 4d1a45627f
11 changed files with 3836 additions and 64 deletions

View File

@ -3375,6 +3375,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
@ -3516,8 +3829,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
@ -3527,7 +3841,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;
@ -4173,6 +4487,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

View 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);

File diff suppressed because it is too large Load Diff

View File

@ -9,6 +9,8 @@ static char *_gl_ext_string = NULL;
static char *_gl_ext_string_official = NULL;
// 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 *);
@ -34,7 +36,8 @@ struct wl_resource;
#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()
@ -65,12 +68,14 @@ struct wl_resource;
#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()
@ -299,7 +304,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
@ -534,7 +543,8 @@ 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 & 2)
return EINA_TRUE;
#ifdef GL_GLES
@ -732,8 +742,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 |= 2;
return EINA_TRUE;
#else
ERR("GLESv1 support is not implemented for GLX");
@ -750,7 +760,7 @@ evgl_api_gles1_ext_get(Evas_GL_API *gl_funcs)
return;
}
if (_evgl_api_ext_status < 2)
if (!(_evgl_api_ext_status&2))
{
DBG("Initializing GLESv1 extensions...");
if (!_evgl_api_gles1_ext_init())
@ -810,8 +820,276 @@ evgl_api_gles1_ext_get(Evas_GL_API *gl_funcs)
}
Eina_Bool
_evgl_api_gles3_ext_init(void)
{
if (_evgl_api_ext_status & 4)
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 |=4;
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&4))
{
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)
{
@ -819,9 +1097,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;

View File

@ -90,7 +90,8 @@
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

View File

@ -1064,7 +1064,7 @@ _evgl_gles1_glGetString(GLenum name)
#endif
case GL_EXTENSIONS:
return (GLubyte *) evgl_api_ext_string_get(EINA_TRUE, EINA_TRUE);
return (GLubyte *) evgl_api_ext_string_get(EINA_TRUE, EVAS_GL_GLES_1_X);
default:
WRN("Unknown string requested: %x", (unsigned int) name);

View File

@ -435,7 +435,7 @@ _evas_gl_common_version_check(int *gles_ver)
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))
if ((major >= 4) && (minor >= 3))
*gles_ver = 3;
else
*gles_ver = 2;

View File

@ -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;
@ -1493,7 +1494,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);
@ -1624,18 +1624,19 @@ evgl_surface_create(void *eng_data, Evas_GL_Config *cfg, int w, int h)
goto error;
}
// Allocate a special surface for 1.1
if (cfg->gles_version == EVAS_GL_GLES_1_X)
// Allocate a special surface for 1.1 and 3.x
if ((cfg->gles_version == EVAS_GL_GLES_1_X) ||
(cfg->gles_version == EVAS_GL_GLES_3_X))
{
if (!evgl_engine->funcs->gles1_surface_create)
if (!evgl_engine->funcs->gles_pixmap_surface_create)
{
ERR("Can't create GLES 1.1 surfaces");
ERR("Can't create %s surfaces",(cfg->gles_version == EVAS_GL_GLES_1_X)?"GLES 1.1":"GLES 3");
evas_gl_common_error_set(eng_data, EVAS_GL_NOT_INITIALIZED);
goto error;
}
INF("Creating special surface for GLES 1.x rendering");
evgl_engine->funcs->gles1_surface_create(evgl_engine, eng_data, sfc, cfg, w, h);
INF("Creating special surface for GLES 1.x/3.x rendering");
evgl_engine->funcs->gles_pixmap_surface_create(evgl_engine, eng_data, sfc, cfg, w, h);
}
// Create internal buffers
@ -1870,18 +1871,18 @@ evgl_surface_destroy(void *eng_data, EVGL_Surface *sfc)
int ret;
if (dbg) DBG("sfc %p is used for GLES 1.x indirect rendering", sfc);
if (!evgl_engine->funcs->gles1_surface_destroy)
if (!evgl_engine->funcs->gles_pixmap_surface_destroy)
{
ERR("Error destroying GLES 1.x surface");
ERR("Error destroying GLES 1.x/3.x 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 GLES 1.x/3.x rendering");
ret = evgl_engine->funcs->gles_pixmap_surface_destroy(eng_data, sfc);
if (!ret)
{
ERR("Engine failed to destroy a GLES1.x Surface.");
ERR("Engine failed to destroy a GLES1.x/3.x Surface.");
return ret;
}
}
@ -2040,8 +2041,8 @@ evgl_context_destroy(void *eng_data, EVGL_Context *ctx)
return 0;
}
// Destroy GLES1 indirect rendering context
if (ctx->gles1_context &&
// Destroy GLES1/GLES3 indirect rendering context
if (ctx->gles_ir_context &&
!evgl_engine->funcs->context_destroy(eng_data, ctx->context))
{
ERR("Error destroying the GLES1 context.");
@ -2195,7 +2196,8 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
return 0;
}
if (ctx->version == EVAS_GL_GLES_1_X)
// GLES 1.x and 3.x
if ((ctx->version == EVAS_GL_GLES_1_X) || (ctx->version == EVAS_GL_GLES_3_X))
{
if (dbg) DBG("ctx %p is GLES 1", ctx);
if (_evgl_direct_renderable(rsc, sfc))
@ -2213,14 +2215,14 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
}
else
{
if (!ctx->gles1_context)
if (!ctx->gles_ir_context)
{
ctx->gles1_context =
evgl_engine->funcs->gles1_context_create(eng_data, ctx, sfc);
ctx->gles_ir_context =
evgl_engine->funcs->gles_context_create(eng_data, ctx, sfc);
}
if (dbg) DBG("Calling make_current(%p, %p)", sfc->gles1_sfc, ctx->context);
if (!evgl_engine->funcs->make_current(eng_data, sfc->gles1_sfc,
ctx->gles1_context, EINA_TRUE))
ctx->gles_ir_context, EINA_TRUE))
{
ERR("Failed to make current with GLES1 indirect surface.");
return 0;
@ -2242,8 +2244,15 @@ evgl_make_current(void *eng_data, EVGL_Surface *sfc, EVGL_Context *ctx)
rsc->current_ctx = ctx;
rsc->current_eng = eng_data;
// Update extensions after GLESv1 context is bound
evgl_api_gles1_ext_get(gles1_funcs);
// Update GLESv1 extension functions after GLESv1 context is bound
if (ctx->version == EVAS_GL_GLES_1_X)
{
evgl_api_gles1_ext_get(gles1_funcs);
}
else if (ctx->version == EVAS_GL_GLES_3_X)
{
evgl_api_gles3_ext_get(gles3_funcs);
}
_surface_context_list_print();
@ -2361,10 +2370,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 "";
};
@ -2617,9 +2633,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;
}

View File

@ -69,18 +69,17 @@ 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)(EVGL_Engine *evgl, 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 *(*gles_pixmap_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 (*gles_pixmap_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);
void *(*gles_context_create)(void *data, EVGL_Context *share_ctx, EVGL_Surface *evgl_sfc);
// Check native window surface config for Evas GL Direct Rendering
Eina_Bool (*native_win_surface_config_check)(void *data, int evgl_depth, int evgl_stencil, int evgl_msaa);
Eina_Bool (*native_win_surface_config_check)(void *data, int evgl_depth, int evgl_stencil, int evgl_msaa);
};
struct _EVGL_Surface
@ -178,8 +177,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 gles_ir_context;
// Partial Rendering
int partial_render;
@ -338,6 +337,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);
@ -347,5 +347,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

View File

@ -1309,8 +1309,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;
}

View File

@ -86,6 +86,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;
@ -476,6 +479,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];
@ -494,7 +504,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))
{
context = eglCreateContext(eng_get_ob(re)->egl_disp,
eng_get_ob(re)->egl_config,
@ -529,7 +539,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,
@ -866,13 +876,13 @@ 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.
// with GLES 1.x, and GLES 3.x nd 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(EVGL_Engine *evgl EINA_UNUSED, void *data,
evgl_eng_gles_pixmap_surface_create(EVGL_Engine *evgl EINA_UNUSED, void *data,
EVGL_Surface *evgl_sfc,
Evas_GL_Config *cfg, int w, int h)
{
@ -889,7 +899,8 @@ evgl_eng_gles1_surface_create(EVGL_Engine *evgl EINA_UNUSED, void *data,
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);
@ -948,7 +959,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;
@ -1099,9 +1113,9 @@ try_again:
}
// This function should destroy the surface used for offscreen rendering
// with GLES 1.x.This will also destroy the X pixmap...
// with GLES 1.x and GLES 3.x .This will also destroy the X pixmap...
static int
evgl_eng_gles1_surface_destroy(void *data, EVGL_Surface *evgl_sfc)
evgl_eng_gles_pixmap_surface_destroy(void *data, EVGL_Surface *evgl_sfc)
{
Render_Engine *re = (Render_Engine *)data;
@ -1136,7 +1150,7 @@ evgl_eng_gles1_surface_destroy(void *data, EVGL_Surface *evgl_sfc)
}
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;
@ -1147,8 +1161,14 @@ 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)
@ -1173,7 +1193,7 @@ evgl_eng_gles1_context_create(void *data,
DBG("Successfully created context for GLES1 indirect rendering.");
return context;
#else
CRI("Support for GLES1 indirect rendering contexts is not implemented for GLX");
CRI("Support for GLES1/GLES3 indirect rendering contexts is not implemented for GLX");
(void) share_ctx; (void) sfc;
return NULL;
#endif