forked from enlightenment/efl
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:
parent
bb134a5cc3
commit
4d1a45627f
|
@ -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
|
||||
|
|
|
@ -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
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue