1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 // libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
18 #include "utilities.h"
22 #include "Framebuffer.h"
24 #include "Renderbuffer.h"
28 #include "TransformFeedback.h"
29 #include "common/debug.h"
30 #include "Common/Version.h"
32 #include <GLES2/gl2.h>
33 #include <GLES2/gl2ext.h>
34 #include <GLES3/gl3.h>
39 #include <cutils/log.h>
45 static bool validImageSize(GLint level, GLsizei width, GLsizei height)
47 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || width < 0 || height < 0)
55 static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFormat)
57 GLenum validationError = ValidateCompressedFormat(textureFormat, egl::getClientVersion(), false);
58 if(validationError != GL_NONE)
60 return error(validationError, false);
63 // [OpenGL ES 2.0.24] table 3.9
67 if(colorbufferFormat != GL_ALPHA &&
68 colorbufferFormat != GL_RGBA &&
69 colorbufferFormat != GL_RGBA4 &&
70 colorbufferFormat != GL_RGB5_A1 &&
71 colorbufferFormat != GL_RGBA8_OES &&
72 colorbufferFormat != GL_BGRA8_EXT &&
73 colorbufferFormat != GL_RGBA16F_EXT &&
74 colorbufferFormat != GL_RGBA32F_EXT)
76 return error(GL_INVALID_OPERATION, false);
81 if(colorbufferFormat != GL_RGB &&
82 colorbufferFormat != GL_RGB565 &&
83 colorbufferFormat != GL_RGB8_OES &&
84 colorbufferFormat != GL_RGBA &&
85 colorbufferFormat != GL_RGBA4 &&
86 colorbufferFormat != GL_RGB5_A1 &&
87 colorbufferFormat != GL_RGBA8_OES &&
88 colorbufferFormat != GL_RGB16F_EXT &&
89 colorbufferFormat != GL_RGB32F_EXT &&
90 colorbufferFormat != GL_BGRA8_EXT &&
91 colorbufferFormat != GL_RGBA16F_EXT &&
92 colorbufferFormat != GL_RGBA32F_EXT)
94 return error(GL_INVALID_OPERATION, false);
97 case GL_LUMINANCE_ALPHA:
99 if(colorbufferFormat != GL_RGBA &&
100 colorbufferFormat != GL_RGBA4 &&
101 colorbufferFormat != GL_RGB5_A1 &&
102 colorbufferFormat != GL_RGBA8_OES &&
103 colorbufferFormat != GL_BGRA8_EXT &&
104 colorbufferFormat != GL_RGBA16F_EXT &&
105 colorbufferFormat != GL_RGBA32F_EXT)
107 return error(GL_INVALID_OPERATION, false);
110 case GL_DEPTH_COMPONENT:
111 case GL_DEPTH_STENCIL_OES:
112 return error(GL_INVALID_OPERATION, false);
114 return error(GL_INVALID_ENUM, false);
119 void ActiveTexture(GLenum texture)
121 TRACE("(GLenum texture = 0x%X)", texture);
123 es2::Context *context = es2::getContext();
127 if(texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + es2::MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
129 return error(GL_INVALID_ENUM);
132 context->setActiveSampler(texture - GL_TEXTURE0);
136 void AttachShader(GLuint program, GLuint shader)
138 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
140 es2::Context *context = es2::getContext();
144 es2::Program *programObject = context->getProgram(program);
145 es2::Shader *shaderObject = context->getShader(shader);
149 if(context->getShader(program))
151 return error(GL_INVALID_OPERATION);
155 return error(GL_INVALID_VALUE);
161 if(context->getProgram(shader))
163 return error(GL_INVALID_OPERATION);
167 return error(GL_INVALID_VALUE);
171 if(!programObject->attachShader(shaderObject))
173 return error(GL_INVALID_OPERATION);
178 void BeginQueryEXT(GLenum target, GLuint name)
180 TRACE("(GLenum target = 0x%X, GLuint name = %d)", target, name);
184 case GL_ANY_SAMPLES_PASSED_EXT:
185 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
188 return error(GL_INVALID_ENUM);
193 return error(GL_INVALID_OPERATION);
196 es2::Context *context = es2::getContext();
200 context->beginQuery(target, name);
204 void BindAttribLocation(GLuint program, GLuint index, const GLchar* name)
206 TRACE("(GLuint program = %d, GLuint index = %d, const GLchar* name = %s)", program, index, name);
208 if(index >= es2::MAX_VERTEX_ATTRIBS)
210 return error(GL_INVALID_VALUE);
213 es2::Context *context = es2::getContext();
217 es2::Program *programObject = context->getProgram(program);
221 if(context->getShader(program))
223 return error(GL_INVALID_OPERATION);
227 return error(GL_INVALID_VALUE);
231 if(strncmp(name, "gl_", 3) == 0)
233 return error(GL_INVALID_OPERATION);
236 programObject->bindAttributeLocation(index, name);
240 void BindBuffer(GLenum target, GLuint buffer)
242 TRACE("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
244 es2::Context *context = es2::getContext();
248 GLint clientVersion = egl::getClientVersion();
252 case GL_ARRAY_BUFFER:
253 context->bindArrayBuffer(buffer);
255 case GL_ELEMENT_ARRAY_BUFFER:
256 context->bindElementArrayBuffer(buffer);
258 case GL_COPY_READ_BUFFER:
259 if(clientVersion >= 3)
261 context->bindCopyReadBuffer(buffer);
264 else return error(GL_INVALID_ENUM);
265 case GL_COPY_WRITE_BUFFER:
266 if(clientVersion >= 3)
268 context->bindCopyWriteBuffer(buffer);
271 else return error(GL_INVALID_ENUM);
272 case GL_PIXEL_PACK_BUFFER:
273 if(clientVersion >= 3)
275 context->bindPixelPackBuffer(buffer);
278 else return error(GL_INVALID_ENUM);
279 case GL_PIXEL_UNPACK_BUFFER:
280 if(clientVersion >= 3)
282 context->bindPixelUnpackBuffer(buffer);
285 else return error(GL_INVALID_ENUM);
286 case GL_TRANSFORM_FEEDBACK_BUFFER:
287 if(clientVersion >= 3)
289 context->bindTransformFeedbackBuffer(buffer);
292 else return error(GL_INVALID_ENUM);
293 case GL_UNIFORM_BUFFER:
294 if(clientVersion >= 3)
296 context->bindGenericUniformBuffer(buffer);
299 else return error(GL_INVALID_ENUM);
301 return error(GL_INVALID_ENUM);
306 void BindFramebuffer(GLenum target, GLuint framebuffer)
308 TRACE("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
310 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
312 return error(GL_INVALID_ENUM);
315 es2::Context *context = es2::getContext();
319 if(target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
321 context->bindReadFramebuffer(framebuffer);
324 if(target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
326 context->bindDrawFramebuffer(framebuffer);
331 void BindRenderbuffer(GLenum target, GLuint renderbuffer)
333 TRACE("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
335 if(target != GL_RENDERBUFFER)
337 return error(GL_INVALID_ENUM);
340 es2::Context *context = es2::getContext();
344 // [OpenGL ES 2.0.25] Section 4.4.3 page 110
345 // [OpenGL ES 3.0.4] Section 4.4.2 page 204
346 // If renderbuffer is not zero, then the resulting renderbuffer object
347 // is a new state vector, initialized with a zero-sized memory buffer.
348 context->bindRenderbuffer(renderbuffer);
352 void BindTexture(GLenum target, GLuint texture)
354 TRACE("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
356 es2::Context *context = es2::getContext();
360 es2::Texture *textureObject = context->getTexture(texture);
362 if(textureObject && textureObject->getTarget() != target && texture != 0)
364 return error(GL_INVALID_OPERATION);
367 GLint clientVersion = context->getClientVersion();
372 context->bindTexture2D(texture);
374 case GL_TEXTURE_CUBE_MAP:
375 context->bindTextureCubeMap(texture);
377 case GL_TEXTURE_EXTERNAL_OES:
378 context->bindTextureExternal(texture);
380 case GL_TEXTURE_2D_ARRAY:
381 if(clientVersion < 3)
383 return error(GL_INVALID_ENUM);
385 context->bindTexture2DArray(texture);
387 case GL_TEXTURE_3D_OES:
388 context->bindTexture3D(texture);
391 return error(GL_INVALID_ENUM);
396 void BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
398 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
399 red, green, blue, alpha);
401 es2::Context* context = es2::getContext();
405 context->setBlendColor(es2::clamp01(red), es2::clamp01(green), es2::clamp01(blue), es2::clamp01(alpha));
409 void BlendEquation(GLenum mode)
411 glBlendEquationSeparate(mode, mode);
414 void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
416 TRACE("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
421 case GL_FUNC_SUBTRACT:
422 case GL_FUNC_REVERSE_SUBTRACT:
427 return error(GL_INVALID_ENUM);
433 case GL_FUNC_SUBTRACT:
434 case GL_FUNC_REVERSE_SUBTRACT:
439 return error(GL_INVALID_ENUM);
442 es2::Context *context = es2::getContext();
446 context->setBlendEquation(modeRGB, modeAlpha);
450 void BlendFunc(GLenum sfactor, GLenum dfactor)
452 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
455 void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
457 TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
458 srcRGB, dstRGB, srcAlpha, dstAlpha);
460 GLint clientVersion = egl::getClientVersion();
467 case GL_ONE_MINUS_SRC_COLOR:
469 case GL_ONE_MINUS_DST_COLOR:
471 case GL_ONE_MINUS_SRC_ALPHA:
473 case GL_ONE_MINUS_DST_ALPHA:
474 case GL_CONSTANT_COLOR:
475 case GL_ONE_MINUS_CONSTANT_COLOR:
476 case GL_CONSTANT_ALPHA:
477 case GL_ONE_MINUS_CONSTANT_ALPHA:
478 case GL_SRC_ALPHA_SATURATE:
481 return error(GL_INVALID_ENUM);
489 case GL_ONE_MINUS_SRC_COLOR:
491 case GL_ONE_MINUS_DST_COLOR:
493 case GL_ONE_MINUS_SRC_ALPHA:
495 case GL_ONE_MINUS_DST_ALPHA:
496 case GL_CONSTANT_COLOR:
497 case GL_ONE_MINUS_CONSTANT_COLOR:
498 case GL_CONSTANT_ALPHA:
499 case GL_ONE_MINUS_CONSTANT_ALPHA:
501 case GL_SRC_ALPHA_SATURATE:
502 if(clientVersion < 3)
504 return error(GL_INVALID_ENUM);
508 return error(GL_INVALID_ENUM);
516 case GL_ONE_MINUS_SRC_COLOR:
518 case GL_ONE_MINUS_DST_COLOR:
520 case GL_ONE_MINUS_SRC_ALPHA:
522 case GL_ONE_MINUS_DST_ALPHA:
523 case GL_CONSTANT_COLOR:
524 case GL_ONE_MINUS_CONSTANT_COLOR:
525 case GL_CONSTANT_ALPHA:
526 case GL_ONE_MINUS_CONSTANT_ALPHA:
527 case GL_SRC_ALPHA_SATURATE:
530 return error(GL_INVALID_ENUM);
538 case GL_ONE_MINUS_SRC_COLOR:
540 case GL_ONE_MINUS_DST_COLOR:
542 case GL_ONE_MINUS_SRC_ALPHA:
544 case GL_ONE_MINUS_DST_ALPHA:
545 case GL_CONSTANT_COLOR:
546 case GL_ONE_MINUS_CONSTANT_COLOR:
547 case GL_CONSTANT_ALPHA:
548 case GL_ONE_MINUS_CONSTANT_ALPHA:
550 case GL_SRC_ALPHA_SATURATE:
551 if(clientVersion < 3)
553 return error(GL_INVALID_ENUM);
557 return error(GL_INVALID_ENUM);
560 es2::Context *context = es2::getContext();
564 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
568 void BufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
570 size = static_cast<GLint>(size); // Work around issues with some 64-bit applications
572 TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = %p, GLenum usage = %d)",
573 target, size, data, usage);
577 return error(GL_INVALID_VALUE);
580 GLint clientVersion = egl::getClientVersion();
586 case GL_DYNAMIC_DRAW:
592 case GL_DYNAMIC_READ:
593 case GL_DYNAMIC_COPY:
594 if(clientVersion < 3)
596 return error(GL_INVALID_ENUM);
600 return error(GL_INVALID_ENUM);
603 es2::Context *context = es2::getContext();
607 es2::Buffer *buffer = nullptr;
608 if(!context->getBuffer(target, &buffer))
610 return error(GL_INVALID_ENUM);
615 // A null buffer means that "0" is bound to the requested buffer target
616 return error(GL_INVALID_OPERATION);
619 buffer->bufferData(data, size, usage);
623 void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
625 size = static_cast<GLint>(size); // Work around issues with some 64-bit applications
626 offset = static_cast<GLint>(offset);
628 TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = %p)",
629 target, offset, size, data);
631 if(size < 0 || offset < 0)
633 return error(GL_INVALID_VALUE);
636 es2::Context *context = es2::getContext();
640 es2::Buffer *buffer = nullptr;
641 if(!context->getBuffer(target, &buffer))
643 return error(GL_INVALID_ENUM);
648 // A null buffer means that "0" is bound to the requested buffer target
649 return error(GL_INVALID_OPERATION);
652 if((size_t)size + offset > buffer->size())
654 return error(GL_INVALID_VALUE);
657 buffer->bufferSubData(data, size, offset);
661 GLenum CheckFramebufferStatus(GLenum target)
663 TRACE("(GLenum target = 0x%X)", target);
665 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
667 return error(GL_INVALID_ENUM, 0);
670 es2::Context *context = es2::getContext();
674 es2::Framebuffer *framebuffer = nullptr;
675 if(target == GL_READ_FRAMEBUFFER_ANGLE)
677 framebuffer = context->getReadFramebuffer();
681 framebuffer = context->getDrawFramebuffer();
684 return framebuffer->completeness();
690 void Clear(GLbitfield mask)
692 TRACE("(GLbitfield mask = %X)", mask);
694 if((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
696 return error(GL_INVALID_VALUE);
699 es2::Context *context = es2::getContext();
703 context->clear(mask);
707 void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
709 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
710 red, green, blue, alpha);
712 es2::Context *context = es2::getContext();
716 context->setClearColor(red, green, blue, alpha);
720 void ClearDepthf(GLclampf depth)
722 TRACE("(GLclampf depth = %f)", depth);
724 es2::Context *context = es2::getContext();
728 context->setClearDepth(depth);
732 void ClearStencil(GLint s)
734 TRACE("(GLint s = %d)", s);
736 es2::Context *context = es2::getContext();
740 context->setClearStencil(s);
744 void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
746 TRACE("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
747 red, green, blue, alpha);
749 es2::Context *context = es2::getContext();
753 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
757 void CompileShader(GLuint shader)
759 TRACE("(GLuint shader = %d)", shader);
761 es2::Context *context = es2::getContext();
765 es2::Shader *shaderObject = context->getShader(shader);
769 if(context->getProgram(shader))
771 return error(GL_INVALID_OPERATION);
775 return error(GL_INVALID_VALUE);
779 shaderObject->compile();
783 void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
784 GLint border, GLsizei imageSize, const GLvoid* data)
786 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
787 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = %p)",
788 target, level, internalformat, width, height, border, imageSize, data);
790 if(!validImageSize(level, width, height) || border != 0 || imageSize < 0)
792 return error(GL_INVALID_VALUE);
795 switch(internalformat)
797 case GL_DEPTH_COMPONENT:
798 case GL_DEPTH_COMPONENT16:
799 case GL_DEPTH_COMPONENT32_OES:
800 case GL_DEPTH_STENCIL_OES:
801 case GL_DEPTH24_STENCIL8_OES:
802 return error(GL_INVALID_OPERATION);
805 GLenum validationError = ValidateCompressedFormat(internalformat, egl::getClientVersion(), true);
806 if(validationError != GL_NONE)
808 return error(validationError);
816 return error(GL_INVALID_VALUE);
819 es2::Context *context = es2::getContext();
823 if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
825 return error(GL_INVALID_VALUE);
831 if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
832 height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
834 return error(GL_INVALID_VALUE);
837 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
838 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
839 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
840 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
841 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
842 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
845 return error(GL_INVALID_VALUE);
848 if(width > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||
849 height > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))
851 return error(GL_INVALID_VALUE);
855 return error(GL_INVALID_ENUM);
858 if(imageSize != egl::ComputeCompressedSize(width, height, internalformat))
860 return error(GL_INVALID_VALUE);
863 if(target == GL_TEXTURE_2D)
865 es2::Texture2D *texture = context->getTexture2D();
869 return error(GL_INVALID_OPERATION);
872 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
876 es2::TextureCubeMap *texture = context->getTextureCubeMap();
880 return error(GL_INVALID_OPERATION);
885 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
886 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
887 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
888 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
889 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
890 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
891 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
893 default: UNREACHABLE(target);
899 void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
900 GLenum format, GLsizei imageSize, const GLvoid* data)
902 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
903 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
904 "GLsizei imageSize = %d, const GLvoid* data = %p)",
905 target, level, xoffset, yoffset, width, height, format, imageSize, data);
907 if(!es2::IsTextureTarget(target))
909 return error(GL_INVALID_ENUM);
912 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
914 return error(GL_INVALID_VALUE);
917 if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
919 return error(GL_INVALID_VALUE);
922 GLenum validationError = ValidateCompressedFormat(format, egl::getClientVersion(), true);
923 if(validationError != GL_NONE)
925 return error(validationError);
928 if(width == 0 || height == 0 || !data)
933 es2::Context *context = es2::getContext();
937 if(imageSize != egl::ComputeCompressedSize(width, height, format))
939 return error(GL_INVALID_VALUE);
942 if(xoffset % 4 != 0 || yoffset % 4 != 0)
944 // We wait to check the offsets until this point, because the multiple-of-four restriction does not exist unless DXT1 textures are supported
945 return error(GL_INVALID_OPERATION);
948 GLenum sizedInternalFormat = GetSizedInternalFormat(format, GL_NONE);
950 if(target == GL_TEXTURE_2D)
952 es2::Texture2D *texture = context->getTexture2D();
954 GLenum validationError = ValidateSubImageParams(true, width, height, xoffset, yoffset, target, level, sizedInternalFormat, texture);
956 if(validationError == GL_NONE)
958 texture->subImageCompressed(level, xoffset, yoffset, width, height, sizedInternalFormat, imageSize, context->getPixels(data));
962 return error(validationError);
965 else if(es2::IsCubemapTextureTarget(target))
967 es2::TextureCubeMap *texture = context->getTextureCubeMap();
969 GLenum validationError = ValidateSubImageParams(true, width, height, xoffset, yoffset, target, level, sizedInternalFormat, texture);
971 if(validationError == GL_NONE)
973 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, sizedInternalFormat, imageSize, context->getPixels(data));
977 return error(validationError);
980 else UNREACHABLE(target);
984 void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
986 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
987 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
988 target, level, internalformat, x, y, width, height, border);
990 if(!validImageSize(level, width, height))
992 return error(GL_INVALID_VALUE);
997 return error(GL_INVALID_VALUE);
1000 es2::Context *context = es2::getContext();
1007 if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
1008 height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
1010 return error(GL_INVALID_VALUE);
1013 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1014 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1015 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1016 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1017 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1018 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1021 return error(GL_INVALID_VALUE);
1024 if(width > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||
1025 height > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))
1027 return error(GL_INVALID_VALUE);
1031 return error(GL_INVALID_ENUM);
1034 es2::Framebuffer *framebuffer = context->getReadFramebuffer();
1036 if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1038 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
1041 es2::Renderbuffer *source = framebuffer->getReadColorbuffer();
1043 if(context->getReadFramebufferName() != 0 && (!source || source->getSamples() > 1))
1045 return error(GL_INVALID_OPERATION);
1048 GLenum colorbufferFormat = source->getFormat();
1050 if(!validateColorBufferFormat(internalformat, colorbufferFormat))
1055 if(target == GL_TEXTURE_2D)
1057 es2::Texture2D *texture = context->getTexture2D();
1061 return error(GL_INVALID_OPERATION);
1064 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
1066 else if(es2::IsCubemapTextureTarget(target))
1068 es2::TextureCubeMap *texture = context->getTextureCubeMap();
1072 return error(GL_INVALID_OPERATION);
1075 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
1077 else UNREACHABLE(target);
1081 void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1083 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
1084 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
1085 target, level, xoffset, yoffset, x, y, width, height);
1087 if(!es2::IsTextureTarget(target))
1089 return error(GL_INVALID_ENUM);
1092 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
1094 return error(GL_INVALID_VALUE);
1097 if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
1099 return error(GL_INVALID_VALUE);
1102 if(std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
1104 return error(GL_INVALID_VALUE);
1107 if(width == 0 || height == 0)
1112 es2::Context *context = es2::getContext();
1116 es2::Framebuffer *framebuffer = context->getReadFramebuffer();
1118 if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
1120 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
1123 es2::Renderbuffer *source = framebuffer->getReadColorbuffer();
1125 if(context->getReadFramebufferName() != 0 && (!source || source->getSamples() > 1))
1127 return error(GL_INVALID_OPERATION);
1130 es2::Texture *texture = nullptr;
1132 if(target == GL_TEXTURE_2D)
1134 texture = context->getTexture2D();
1136 else if(es2::IsCubemapTextureTarget(target))
1138 texture = context->getTextureCubeMap();
1140 else UNREACHABLE(target);
1142 GLenum validationError = ValidateSubImageParams(false, width, height, xoffset, yoffset, target, level, GL_NONE, texture);
1143 if(validationError != GL_NONE)
1145 return error(validationError);
1148 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
1152 GLuint CreateProgram(void)
1156 es2::Context *context = es2::getContext();
1160 return context->createProgram();
1166 GLuint CreateShader(GLenum type)
1168 TRACE("(GLenum type = 0x%X)", type);
1170 es2::Context *context = es2::getContext();
1176 case GL_FRAGMENT_SHADER:
1177 case GL_VERTEX_SHADER:
1178 return context->createShader(type);
1180 return error(GL_INVALID_ENUM, 0);
1187 void CullFace(GLenum mode)
1189 TRACE("(GLenum mode = 0x%X)", mode);
1195 case GL_FRONT_AND_BACK:
1197 es2::Context *context = es2::getContext();
1201 context->setCullMode(mode);
1206 return error(GL_INVALID_ENUM);
1210 void DeleteBuffers(GLsizei n, const GLuint* buffers)
1212 TRACE("(GLsizei n = %d, const GLuint* buffers = %p)", n, buffers);
1216 return error(GL_INVALID_VALUE);
1219 es2::Context *context = es2::getContext();
1223 for(int i = 0; i < n; i++)
1225 context->deleteBuffer(buffers[i]);
1230 void DeleteFencesNV(GLsizei n, const GLuint* fences)
1232 TRACE("(GLsizei n = %d, const GLuint* fences = %p)", n, fences);
1236 return error(GL_INVALID_VALUE);
1239 es2::Context *context = es2::getContext();
1243 for(int i = 0; i < n; i++)
1245 context->deleteFence(fences[i]);
1250 void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1252 TRACE("(GLsizei n = %d, const GLuint* framebuffers = %p)", n, framebuffers);
1256 return error(GL_INVALID_VALUE);
1259 es2::Context *context = es2::getContext();
1263 for(int i = 0; i < n; i++)
1265 if(framebuffers[i] != 0)
1267 context->deleteFramebuffer(framebuffers[i]);
1273 void DeleteProgram(GLuint program)
1275 TRACE("(GLuint program = %d)", program);
1282 es2::Context *context = es2::getContext();
1286 if(!context->getProgram(program))
1288 if(context->getShader(program))
1290 return error(GL_INVALID_OPERATION);
1294 return error(GL_INVALID_VALUE);
1298 context->deleteProgram(program);
1302 void DeleteQueriesEXT(GLsizei n, const GLuint *ids)
1304 TRACE("(GLsizei n = %d, const GLuint *ids = %p)", n, ids);
1308 return error(GL_INVALID_VALUE);
1311 es2::Context *context = es2::getContext();
1315 for(int i = 0; i < n; i++)
1317 context->deleteQuery(ids[i]);
1322 void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1324 TRACE("(GLsizei n = %d, const GLuint* renderbuffers = %p)", n, renderbuffers);
1328 return error(GL_INVALID_VALUE);
1331 es2::Context *context = es2::getContext();
1335 for(int i = 0; i < n; i++)
1337 context->deleteRenderbuffer(renderbuffers[i]);
1342 void DeleteShader(GLuint shader)
1344 TRACE("(GLuint shader = %d)", shader);
1351 es2::Context *context = es2::getContext();
1355 if(!context->getShader(shader))
1357 if(context->getProgram(shader))
1359 return error(GL_INVALID_OPERATION);
1363 return error(GL_INVALID_VALUE);
1367 context->deleteShader(shader);
1371 void DeleteTextures(GLsizei n, const GLuint* textures)
1373 TRACE("(GLsizei n = %d, const GLuint* textures = %p)", n, textures);
1377 return error(GL_INVALID_VALUE);
1380 es2::Context *context = es2::getContext();
1384 for(int i = 0; i < n; i++)
1386 if(textures[i] != 0)
1388 context->deleteTexture(textures[i]);
1394 void DepthFunc(GLenum func)
1396 TRACE("(GLenum func = 0x%X)", func);
1410 return error(GL_INVALID_ENUM);
1413 es2::Context *context = es2::getContext();
1417 context->setDepthFunc(func);
1421 void DepthMask(GLboolean flag)
1423 TRACE("(GLboolean flag = %d)", flag);
1425 es2::Context *context = es2::getContext();
1429 context->setDepthMask(flag != GL_FALSE);
1433 void DepthRangef(GLclampf zNear, GLclampf zFar)
1435 TRACE("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
1437 es2::Context *context = es2::getContext();
1441 context->setDepthRange(zNear, zFar);
1445 void DetachShader(GLuint program, GLuint shader)
1447 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
1449 es2::Context *context = es2::getContext();
1454 es2::Program *programObject = context->getProgram(program);
1455 es2::Shader *shaderObject = context->getShader(shader);
1459 es2::Shader *shaderByProgramHandle;
1460 shaderByProgramHandle = context->getShader(program);
1461 if(!shaderByProgramHandle)
1463 return error(GL_INVALID_VALUE);
1467 return error(GL_INVALID_OPERATION);
1473 es2::Program *programByShaderHandle = context->getProgram(shader);
1474 if(!programByShaderHandle)
1476 return error(GL_INVALID_VALUE);
1480 return error(GL_INVALID_OPERATION);
1484 if(!programObject->detachShader(shaderObject))
1486 return error(GL_INVALID_OPERATION);
1491 void Disable(GLenum cap)
1493 TRACE("(GLenum cap = 0x%X)", cap);
1495 es2::Context *context = es2::getContext();
1501 case GL_CULL_FACE: context->setCullFaceEnabled(false); break;
1502 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFillEnabled(false); break;
1503 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverageEnabled(false); break;
1504 case GL_SAMPLE_COVERAGE: context->setSampleCoverageEnabled(false); break;
1505 case GL_SCISSOR_TEST: context->setScissorTestEnabled(false); break;
1506 case GL_STENCIL_TEST: context->setStencilTestEnabled(false); break;
1507 case GL_DEPTH_TEST: context->setDepthTestEnabled(false); break;
1508 case GL_BLEND: context->setBlendEnabled(false); break;
1509 case GL_DITHER: context->setDitherEnabled(false); break;
1510 case GL_PRIMITIVE_RESTART_FIXED_INDEX: context->setPrimitiveRestartFixedIndexEnabled(false); break;
1511 case GL_RASTERIZER_DISCARD: context->setRasterizerDiscardEnabled(false); break;
1513 return error(GL_INVALID_ENUM);
1518 void DisableVertexAttribArray(GLuint index)
1520 TRACE("(GLuint index = %d)", index);
1522 if(index >= es2::MAX_VERTEX_ATTRIBS)
1524 return error(GL_INVALID_VALUE);
1527 es2::Context *context = es2::getContext();
1531 context->setVertexAttribArrayEnabled(index, false);
1535 void DrawArrays(GLenum mode, GLint first, GLsizei count)
1537 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
1546 case GL_TRIANGLE_FAN:
1547 case GL_TRIANGLE_STRIP:
1550 return error(GL_INVALID_ENUM);
1553 if(count < 0 || first < 0)
1555 return error(GL_INVALID_VALUE);
1558 es2::Context *context = es2::getContext();
1562 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
1563 if(transformFeedback && transformFeedback->isActive() && (mode != transformFeedback->primitiveMode()))
1565 return error(GL_INVALID_OPERATION);
1568 context->drawArrays(mode, first, count);
1572 void DrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
1574 TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = %p)",
1575 mode, count, type, indices);
1584 case GL_TRIANGLE_FAN:
1585 case GL_TRIANGLE_STRIP:
1588 return error(GL_INVALID_ENUM);
1593 return error(GL_INVALID_VALUE);
1596 es2::Context *context = es2::getContext();
1600 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
1601 if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
1603 return error(GL_INVALID_OPERATION);
1608 case GL_UNSIGNED_BYTE:
1609 case GL_UNSIGNED_SHORT:
1610 case GL_UNSIGNED_INT:
1613 return error(GL_INVALID_ENUM);
1616 context->drawElements(mode, 0, MAX_ELEMENT_INDEX, count, type, indices);
1620 void DrawArraysInstancedEXT(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1622 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
1623 mode, first, count, instanceCount);
1632 case GL_TRIANGLE_FAN:
1633 case GL_TRIANGLE_STRIP:
1636 return error(GL_INVALID_ENUM);
1639 if(count < 0 || instanceCount < 0)
1641 return error(GL_INVALID_VALUE);
1644 es2::Context *context = es2::getContext();
1648 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
1649 if(transformFeedback && transformFeedback->isActive() && (mode != transformFeedback->primitiveMode()))
1651 return error(GL_INVALID_OPERATION);
1654 context->drawArrays(mode, first, count, instanceCount);
1658 void DrawElementsInstancedEXT(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount)
1660 TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const void *indices = %p, GLsizei instanceCount = %d)",
1661 mode, count, type, indices, instanceCount);
1670 case GL_TRIANGLE_FAN:
1671 case GL_TRIANGLE_STRIP:
1674 return error(GL_INVALID_ENUM);
1679 case GL_UNSIGNED_BYTE:
1680 case GL_UNSIGNED_SHORT:
1681 case GL_UNSIGNED_INT:
1684 return error(GL_INVALID_ENUM);
1687 if(count < 0 || instanceCount < 0)
1689 return error(GL_INVALID_VALUE);
1692 es2::Context *context = es2::getContext();
1696 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
1697 if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
1699 return error(GL_INVALID_OPERATION);
1702 context->drawElements(mode, 0, MAX_ELEMENT_INDEX, count, type, indices, instanceCount);
1706 void VertexAttribDivisorEXT(GLuint index, GLuint divisor)
1708 TRACE("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
1710 es2::Context *context = es2::getContext();
1714 if(index >= es2::MAX_VERTEX_ATTRIBS)
1716 return error(GL_INVALID_VALUE);
1719 context->setVertexAttribDivisor(index, divisor);
1723 void DrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
1725 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
1726 mode, first, count, instanceCount);
1735 case GL_TRIANGLE_FAN:
1736 case GL_TRIANGLE_STRIP:
1739 return error(GL_INVALID_ENUM);
1742 if(count < 0 || instanceCount < 0)
1744 return error(GL_INVALID_VALUE);
1747 es2::Context *context = es2::getContext();
1751 if(!context->hasZeroDivisor())
1753 return error(GL_INVALID_OPERATION);
1756 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
1757 if(transformFeedback && transformFeedback->isActive() && (mode != transformFeedback->primitiveMode()))
1759 return error(GL_INVALID_OPERATION);
1762 context->drawArrays(mode, first, count, instanceCount);
1766 void DrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount)
1768 TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const void *indices = %p, GLsizei instanceCount = %d)",
1769 mode, count, type, indices, instanceCount);
1778 case GL_TRIANGLE_FAN:
1779 case GL_TRIANGLE_STRIP:
1782 return error(GL_INVALID_ENUM);
1787 case GL_UNSIGNED_BYTE:
1788 case GL_UNSIGNED_SHORT:
1789 case GL_UNSIGNED_INT:
1792 return error(GL_INVALID_ENUM);
1795 if(count < 0 || instanceCount < 0)
1797 return error(GL_INVALID_VALUE);
1800 es2::Context *context = es2::getContext();
1804 if(!context->hasZeroDivisor())
1806 return error(GL_INVALID_OPERATION);
1809 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
1810 if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
1812 return error(GL_INVALID_OPERATION);
1815 context->drawElements(mode, 0, MAX_ELEMENT_INDEX, count, type, indices, instanceCount);
1819 void VertexAttribDivisorANGLE(GLuint index, GLuint divisor)
1821 TRACE("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
1823 es2::Context *context = es2::getContext();
1827 if(index >= MAX_VERTEX_ATTRIBS)
1829 return error(GL_INVALID_VALUE);
1832 context->setVertexAttribDivisor(index, divisor);
1836 void Enable(GLenum cap)
1838 TRACE("(GLenum cap = 0x%X)", cap);
1840 es2::Context *context = es2::getContext();
1846 case GL_CULL_FACE: context->setCullFaceEnabled(true); break;
1847 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFillEnabled(true); break;
1848 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverageEnabled(true); break;
1849 case GL_SAMPLE_COVERAGE: context->setSampleCoverageEnabled(true); break;
1850 case GL_SCISSOR_TEST: context->setScissorTestEnabled(true); break;
1851 case GL_STENCIL_TEST: context->setStencilTestEnabled(true); break;
1852 case GL_DEPTH_TEST: context->setDepthTestEnabled(true); break;
1853 case GL_BLEND: context->setBlendEnabled(true); break;
1854 case GL_DITHER: context->setDitherEnabled(true); break;
1855 case GL_PRIMITIVE_RESTART_FIXED_INDEX: context->setPrimitiveRestartFixedIndexEnabled(true); break;
1856 case GL_RASTERIZER_DISCARD: context->setRasterizerDiscardEnabled(true); break;
1858 return error(GL_INVALID_ENUM);
1863 void EnableVertexAttribArray(GLuint index)
1865 TRACE("(GLuint index = %d)", index);
1867 if(index >= es2::MAX_VERTEX_ATTRIBS)
1869 return error(GL_INVALID_VALUE);
1872 es2::Context *context = es2::getContext();
1876 context->setVertexAttribArrayEnabled(index, true);
1880 void EndQueryEXT(GLenum target)
1882 TRACE("GLenum target = 0x%X)", target);
1886 case GL_ANY_SAMPLES_PASSED_EXT:
1887 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
1890 return error(GL_INVALID_ENUM);
1893 es2::Context *context = es2::getContext();
1897 context->endQuery(target);
1901 void FinishFenceNV(GLuint fence)
1903 TRACE("(GLuint fence = %d)", fence);
1905 es2::Context *context = es2::getContext();
1909 es2::Fence *fenceObject = context->getFence(fence);
1913 return error(GL_INVALID_OPERATION);
1916 fenceObject->finishFence();
1924 es2::Context *context = es2::getContext();
1936 es2::Context *context = es2::getContext();
1944 void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1946 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
1947 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
1949 if((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE) ||
1950 (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
1952 return error(GL_INVALID_ENUM);
1955 es2::Context *context = es2::getContext();
1959 es2::Framebuffer *framebuffer = nullptr;
1960 GLuint framebufferName = 0;
1961 if(target == GL_READ_FRAMEBUFFER_ANGLE)
1963 framebuffer = context->getReadFramebuffer();
1964 framebufferName = context->getReadFramebufferName();
1968 framebuffer = context->getDrawFramebuffer();
1969 framebufferName = context->getDrawFramebufferName();
1972 if(!framebuffer || framebufferName == 0)
1974 return error(GL_INVALID_OPERATION);
1977 // [OpenGL ES 2.0.25] Section 4.4.3 page 112
1978 // [OpenGL ES 3.0.2] Section 4.4.2 page 201
1979 // 'renderbuffer' must be either zero or the name of an existing renderbuffer object of
1980 // type 'renderbuffertarget', otherwise an INVALID_OPERATION error is generated.
1981 if(renderbuffer != 0)
1983 if(!context->getRenderbuffer(renderbuffer))
1985 return error(GL_INVALID_OPERATION);
1989 GLint clientVersion = context->getClientVersion();
1993 case GL_COLOR_ATTACHMENT0:
1994 case GL_COLOR_ATTACHMENT1:
1995 case GL_COLOR_ATTACHMENT2:
1996 case GL_COLOR_ATTACHMENT3:
1997 case GL_COLOR_ATTACHMENT4:
1998 case GL_COLOR_ATTACHMENT5:
1999 case GL_COLOR_ATTACHMENT6:
2000 case GL_COLOR_ATTACHMENT7:
2001 case GL_COLOR_ATTACHMENT8:
2002 case GL_COLOR_ATTACHMENT9:
2003 case GL_COLOR_ATTACHMENT10:
2004 case GL_COLOR_ATTACHMENT11:
2005 case GL_COLOR_ATTACHMENT12:
2006 case GL_COLOR_ATTACHMENT13:
2007 case GL_COLOR_ATTACHMENT14:
2008 case GL_COLOR_ATTACHMENT15:
2009 case GL_COLOR_ATTACHMENT16:
2010 case GL_COLOR_ATTACHMENT17:
2011 case GL_COLOR_ATTACHMENT18:
2012 case GL_COLOR_ATTACHMENT19:
2013 case GL_COLOR_ATTACHMENT20:
2014 case GL_COLOR_ATTACHMENT21:
2015 case GL_COLOR_ATTACHMENT22:
2016 case GL_COLOR_ATTACHMENT23:
2017 case GL_COLOR_ATTACHMENT24:
2018 case GL_COLOR_ATTACHMENT25:
2019 case GL_COLOR_ATTACHMENT26:
2020 case GL_COLOR_ATTACHMENT27:
2021 case GL_COLOR_ATTACHMENT28:
2022 case GL_COLOR_ATTACHMENT29:
2023 case GL_COLOR_ATTACHMENT30:
2024 case GL_COLOR_ATTACHMENT31:
2025 if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
2027 return error(GL_INVALID_ENUM);
2029 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer, attachment - GL_COLOR_ATTACHMENT0);
2031 case GL_DEPTH_ATTACHMENT:
2032 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2034 case GL_STENCIL_ATTACHMENT:
2035 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2037 case GL_DEPTH_STENCIL_ATTACHMENT:
2038 if(clientVersion >= 3)
2040 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
2041 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
2044 else return error(GL_INVALID_ENUM);
2046 return error(GL_INVALID_ENUM);
2051 void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
2053 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
2054 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
2056 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
2058 return error(GL_INVALID_ENUM);
2061 es2::Context *context = es2::getContext();
2065 GLint clientVersion = context->getClientVersion();
2069 textarget = GL_NONE;
2073 es2::Texture *tex = context->getTexture(texture);
2077 return error(GL_INVALID_OPERATION);
2083 if(tex->getTarget() != GL_TEXTURE_2D)
2085 return error(GL_INVALID_OPERATION);
2088 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
2089 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
2090 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
2091 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
2092 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
2093 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
2094 if(tex->getTarget() != GL_TEXTURE_CUBE_MAP)
2096 return error(GL_INVALID_OPERATION);
2100 return error(GL_INVALID_ENUM);
2103 if((level != 0) && (clientVersion < 3))
2105 return error(GL_INVALID_VALUE);
2108 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
2110 return error(GL_INVALID_VALUE);
2113 if(tex->isCompressed(textarget, level))
2115 return error(GL_INVALID_OPERATION);
2119 es2::Framebuffer *framebuffer = nullptr;
2120 GLuint framebufferName = 0;
2121 if(target == GL_READ_FRAMEBUFFER_ANGLE)
2123 framebuffer = context->getReadFramebuffer();
2124 framebufferName = context->getReadFramebufferName();
2128 framebuffer = context->getDrawFramebuffer();
2129 framebufferName = context->getDrawFramebufferName();
2132 if(framebufferName == 0 || !framebuffer)
2134 return error(GL_INVALID_OPERATION);
2139 case GL_COLOR_ATTACHMENT0:
2140 case GL_COLOR_ATTACHMENT1:
2141 case GL_COLOR_ATTACHMENT2:
2142 case GL_COLOR_ATTACHMENT3:
2143 case GL_COLOR_ATTACHMENT4:
2144 case GL_COLOR_ATTACHMENT5:
2145 case GL_COLOR_ATTACHMENT6:
2146 case GL_COLOR_ATTACHMENT7:
2147 case GL_COLOR_ATTACHMENT8:
2148 case GL_COLOR_ATTACHMENT9:
2149 case GL_COLOR_ATTACHMENT10:
2150 case GL_COLOR_ATTACHMENT11:
2151 case GL_COLOR_ATTACHMENT12:
2152 case GL_COLOR_ATTACHMENT13:
2153 case GL_COLOR_ATTACHMENT14:
2154 case GL_COLOR_ATTACHMENT15:
2155 case GL_COLOR_ATTACHMENT16:
2156 case GL_COLOR_ATTACHMENT17:
2157 case GL_COLOR_ATTACHMENT18:
2158 case GL_COLOR_ATTACHMENT19:
2159 case GL_COLOR_ATTACHMENT20:
2160 case GL_COLOR_ATTACHMENT21:
2161 case GL_COLOR_ATTACHMENT22:
2162 case GL_COLOR_ATTACHMENT23:
2163 case GL_COLOR_ATTACHMENT24:
2164 case GL_COLOR_ATTACHMENT25:
2165 case GL_COLOR_ATTACHMENT26:
2166 case GL_COLOR_ATTACHMENT27:
2167 case GL_COLOR_ATTACHMENT28:
2168 case GL_COLOR_ATTACHMENT29:
2169 case GL_COLOR_ATTACHMENT30:
2170 case GL_COLOR_ATTACHMENT31:
2171 if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
2173 return error(GL_INVALID_ENUM);
2175 framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0, level);
2177 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level); break;
2178 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level); break;
2179 case GL_DEPTH_STENCIL_ATTACHMENT:
2180 if(clientVersion >= 3)
2182 framebuffer->setDepthbuffer(textarget, texture, level);
2183 framebuffer->setStencilbuffer(textarget, texture, level);
2186 else return error(GL_INVALID_ENUM);
2188 return error(GL_INVALID_ENUM);
2193 void FrontFace(GLenum mode)
2195 TRACE("(GLenum mode = 0x%X)", mode);
2202 es2::Context *context = es2::getContext();
2206 context->setFrontFace(mode);
2211 return error(GL_INVALID_ENUM);
2215 void GenBuffers(GLsizei n, GLuint* buffers)
2217 TRACE("(GLsizei n = %d, GLuint* buffers = %p)", n, buffers);
2221 return error(GL_INVALID_VALUE);
2224 es2::Context *context = es2::getContext();
2228 for(int i = 0; i < n; i++)
2230 buffers[i] = context->createBuffer();
2235 void GenerateMipmap(GLenum target)
2237 TRACE("(GLenum target = 0x%X)", target);
2239 es2::Context *context = es2::getContext();
2243 es2::Texture *texture = nullptr;
2245 GLint clientVersion = context->getClientVersion();
2250 texture = context->getTexture2D();
2252 case GL_TEXTURE_CUBE_MAP:
2253 texture = context->getTextureCubeMap();
2255 case GL_TEXTURE_2D_ARRAY:
2256 if(clientVersion < 3)
2258 return error(GL_INVALID_ENUM);
2262 texture = context->getTexture2DArray();
2265 case GL_TEXTURE_3D_OES:
2266 texture = context->getTexture3D();
2269 return error(GL_INVALID_ENUM);
2272 if(texture->isCompressed(target, 0) || texture->isDepth(target, 0))
2274 return error(GL_INVALID_OPERATION);
2277 texture->generateMipmaps();
2281 void GenFencesNV(GLsizei n, GLuint* fences)
2283 TRACE("(GLsizei n = %d, GLuint* fences = %p)", n, fences);
2287 return error(GL_INVALID_VALUE);
2290 es2::Context *context = es2::getContext();
2294 for(int i = 0; i < n; i++)
2296 fences[i] = context->createFence();
2301 void GenFramebuffers(GLsizei n, GLuint* framebuffers)
2303 TRACE("(GLsizei n = %d, GLuint* framebuffers = %p)", n, framebuffers);
2307 return error(GL_INVALID_VALUE);
2310 es2::Context *context = es2::getContext();
2314 for(int i = 0; i < n; i++)
2316 framebuffers[i] = context->createFramebuffer();
2321 void GenQueriesEXT(GLsizei n, GLuint* ids)
2323 TRACE("(GLsizei n = %d, GLuint* ids = %p)", n, ids);
2327 return error(GL_INVALID_VALUE);
2330 es2::Context *context = es2::getContext();
2334 for(int i = 0; i < n; i++)
2336 ids[i] = context->createQuery();
2341 void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2343 TRACE("(GLsizei n = %d, GLuint* renderbuffers = %p)", n, renderbuffers);
2347 return error(GL_INVALID_VALUE);
2350 es2::Context *context = es2::getContext();
2354 for(int i = 0; i < n; i++)
2356 renderbuffers[i] = context->createRenderbuffer();
2361 void GenTextures(GLsizei n, GLuint* textures)
2363 TRACE("(GLsizei n = %d, GLuint* textures = %p)", n, textures);
2367 return error(GL_INVALID_VALUE);
2370 es2::Context *context = es2::getContext();
2374 for(int i = 0; i < n; i++)
2376 textures[i] = context->createTexture();
2381 void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
2383 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = %p, "
2384 "GLint *size = %p, GLenum *type = %p, GLchar *name = %p)",
2385 program, index, bufsize, length, size, type, name);
2389 return error(GL_INVALID_VALUE);
2392 es2::Context *context = es2::getContext();
2396 es2::Program *programObject = context->getProgram(program);
2400 if(context->getShader(program))
2402 return error(GL_INVALID_OPERATION);
2406 return error(GL_INVALID_VALUE);
2410 if(index >= programObject->getActiveAttributeCount())
2412 return error(GL_INVALID_VALUE);
2415 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2419 void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
2421 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
2422 "GLsizei* length = %p, GLint* size = %p, GLenum* type = %p, GLchar* name = %s)",
2423 program, index, bufsize, length, size, type, name);
2427 return error(GL_INVALID_VALUE);
2430 es2::Context *context = es2::getContext();
2434 es2::Program *programObject = context->getProgram(program);
2438 if(context->getShader(program))
2440 return error(GL_INVALID_OPERATION);
2444 return error(GL_INVALID_VALUE);
2448 if(index >= programObject->getActiveUniformCount())
2450 return error(GL_INVALID_VALUE);
2453 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2457 void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2459 TRACE("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = %p, GLuint* shaders = %p)",
2460 program, maxcount, count, shaders);
2464 return error(GL_INVALID_VALUE);
2467 es2::Context *context = es2::getContext();
2471 es2::Program *programObject = context->getProgram(program);
2475 if(context->getShader(program))
2477 return error(GL_INVALID_OPERATION);
2481 return error(GL_INVALID_VALUE);
2485 return programObject->getAttachedShaders(maxcount, count, shaders);
2489 int GetAttribLocation(GLuint program, const GLchar* name)
2491 TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name);
2493 es2::Context *context = es2::getContext();
2498 es2::Program *programObject = context->getProgram(program);
2502 if(context->getShader(program))
2504 return error(GL_INVALID_OPERATION, -1);
2508 return error(GL_INVALID_VALUE, -1);
2512 if(!programObject->isLinked())
2514 return error(GL_INVALID_OPERATION, -1);
2517 return programObject->getAttributeLocation(name);
2523 void GetBooleanv(GLenum pname, GLboolean* params)
2525 TRACE("(GLenum pname = 0x%X, GLboolean* params = %p)", pname, params);
2527 es2::Context *context = es2::getContext();
2531 if(!(context->getBooleanv(pname, params)))
2534 unsigned int numParams = 0;
2535 if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2536 return error(GL_INVALID_ENUM);
2539 return; // it is known that the pname is valid, but there are no parameters to return
2541 if(nativeType == GL_FLOAT)
2543 GLfloat *floatParams = nullptr;
2544 floatParams = new GLfloat[numParams];
2546 context->getFloatv(pname, floatParams);
2548 for(unsigned int i = 0; i < numParams; ++i)
2550 if(floatParams[i] == 0.0f)
2551 params[i] = GL_FALSE;
2553 params[i] = GL_TRUE;
2556 delete [] floatParams;
2558 else if(nativeType == GL_INT)
2560 GLint *intParams = nullptr;
2561 intParams = new GLint[numParams];
2563 context->getIntegerv(pname, intParams);
2565 for(unsigned int i = 0; i < numParams; ++i)
2567 if(intParams[i] == 0)
2568 params[i] = GL_FALSE;
2570 params[i] = GL_TRUE;
2573 delete [] intParams;
2579 void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2581 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = %p)", target, pname, params);
2583 es2::Context *context = es2::getContext();
2587 es2::Buffer *buffer;
2588 if(!context->getBuffer(target, &buffer))
2590 return error(GL_INVALID_ENUM);
2595 // A null buffer means that "0" is bound to the requested buffer target
2596 return error(GL_INVALID_OPERATION);
2599 GLint clientVersion = context->getClientVersion();
2603 case GL_BUFFER_USAGE:
2604 *params = buffer->usage();
2606 case GL_BUFFER_SIZE:
2607 *params = (GLint)buffer->size();
2609 case GL_BUFFER_ACCESS_FLAGS:
2610 if(clientVersion >= 3)
2612 *params = buffer->access();
2615 else return error(GL_INVALID_ENUM);
2616 case GL_BUFFER_MAPPED:
2617 if(clientVersion >= 3)
2619 *params = buffer->isMapped();
2622 else return error(GL_INVALID_ENUM);
2623 case GL_BUFFER_MAP_LENGTH:
2624 if(clientVersion >= 3)
2626 *params = (GLint)buffer->length();
2629 else return error(GL_INVALID_ENUM);
2630 case GL_BUFFER_MAP_OFFSET:
2631 if(clientVersion >= 3)
2633 *params = (GLint)buffer->offset();
2636 else return error(GL_INVALID_ENUM);
2638 return error(GL_INVALID_ENUM);
2643 GLenum GetError(void)
2647 es2::Context *context = es2::getContext();
2651 return context->getError();
2657 void GetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2659 TRACE("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = %p)", fence, pname, params);
2661 es2::Context *context = es2::getContext();
2665 es2::Fence *fenceObject = context->getFence(fence);
2669 return error(GL_INVALID_OPERATION);
2672 fenceObject->getFenceiv(pname, params);
2676 void GetFloatv(GLenum pname, GLfloat* params)
2678 TRACE("(GLenum pname = 0x%X, GLfloat* params = %p)", pname, params);
2680 es2::Context *context = es2::getContext();
2684 if(!(context->getFloatv(pname, params)))
2687 unsigned int numParams = 0;
2688 if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))
2689 return error(GL_INVALID_ENUM);
2692 return; // it is known that the pname is valid, but that there are no parameters to return.
2694 if(nativeType == GL_BOOL)
2696 GLboolean *boolParams = nullptr;
2697 boolParams = new GLboolean[numParams];
2699 context->getBooleanv(pname, boolParams);
2701 for(unsigned int i = 0; i < numParams; ++i)
2703 if(boolParams[i] == GL_FALSE)
2709 delete [] boolParams;
2711 else if(nativeType == GL_INT)
2713 GLint *intParams = nullptr;
2714 intParams = new GLint[numParams];
2716 context->getIntegerv(pname, intParams);
2718 for(unsigned int i = 0; i < numParams; ++i)
2720 params[i] = (GLfloat)intParams[i];
2723 delete [] intParams;
2729 void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2731 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = %p)",
2732 target, attachment, pname, params);
2734 es2::Context *context = es2::getContext();
2738 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
2740 return error(GL_INVALID_ENUM);
2743 GLint clientVersion = context->getClientVersion();
2745 es2::Framebuffer *framebuffer = nullptr;
2746 if(target == GL_READ_FRAMEBUFFER)
2748 if(context->getReadFramebufferName() == 0)
2750 if(clientVersion < 3)
2752 return error(GL_INVALID_OPERATION);
2763 return error(GL_INVALID_ENUM);
2768 framebuffer = context->getReadFramebuffer();
2772 if(context->getDrawFramebufferName() == 0)
2774 if(clientVersion < 3)
2776 return error(GL_INVALID_OPERATION);
2787 return error(GL_INVALID_ENUM);
2792 framebuffer = context->getDrawFramebuffer();
2795 GLenum attachmentType;
2796 GLuint attachmentHandle;
2797 GLint attachmentLayer;
2798 Renderbuffer* renderbuffer = nullptr;
2802 if(clientVersion >= 3)
2804 attachmentType = framebuffer->getColorbufferType(0);
2805 attachmentHandle = framebuffer->getColorbufferName(0);
2806 attachmentLayer = framebuffer->getColorbufferLayer(0);
2807 renderbuffer = framebuffer->getColorbuffer(0);
2809 else return error(GL_INVALID_ENUM);
2811 case GL_COLOR_ATTACHMENT0:
2812 case GL_COLOR_ATTACHMENT1:
2813 case GL_COLOR_ATTACHMENT2:
2814 case GL_COLOR_ATTACHMENT3:
2815 case GL_COLOR_ATTACHMENT4:
2816 case GL_COLOR_ATTACHMENT5:
2817 case GL_COLOR_ATTACHMENT6:
2818 case GL_COLOR_ATTACHMENT7:
2819 case GL_COLOR_ATTACHMENT8:
2820 case GL_COLOR_ATTACHMENT9:
2821 case GL_COLOR_ATTACHMENT10:
2822 case GL_COLOR_ATTACHMENT11:
2823 case GL_COLOR_ATTACHMENT12:
2824 case GL_COLOR_ATTACHMENT13:
2825 case GL_COLOR_ATTACHMENT14:
2826 case GL_COLOR_ATTACHMENT15:
2827 case GL_COLOR_ATTACHMENT16:
2828 case GL_COLOR_ATTACHMENT17:
2829 case GL_COLOR_ATTACHMENT18:
2830 case GL_COLOR_ATTACHMENT19:
2831 case GL_COLOR_ATTACHMENT20:
2832 case GL_COLOR_ATTACHMENT21:
2833 case GL_COLOR_ATTACHMENT22:
2834 case GL_COLOR_ATTACHMENT23:
2835 case GL_COLOR_ATTACHMENT24:
2836 case GL_COLOR_ATTACHMENT25:
2837 case GL_COLOR_ATTACHMENT26:
2838 case GL_COLOR_ATTACHMENT27:
2839 case GL_COLOR_ATTACHMENT28:
2840 case GL_COLOR_ATTACHMENT29:
2841 case GL_COLOR_ATTACHMENT30:
2842 case GL_COLOR_ATTACHMENT31:
2843 if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
2845 return error(GL_INVALID_ENUM);
2847 attachmentType = framebuffer->getColorbufferType(attachment - GL_COLOR_ATTACHMENT0);
2848 attachmentHandle = framebuffer->getColorbufferName(attachment - GL_COLOR_ATTACHMENT0);
2849 attachmentLayer = framebuffer->getColorbufferLayer(attachment - GL_COLOR_ATTACHMENT0);
2850 renderbuffer = framebuffer->getColorbuffer(attachment - GL_COLOR_ATTACHMENT0);
2853 if(clientVersion < 3)
2855 return error(GL_INVALID_ENUM);
2858 case GL_DEPTH_ATTACHMENT:
2859 attachmentType = framebuffer->getDepthbufferType();
2860 attachmentHandle = framebuffer->getDepthbufferName();
2861 attachmentLayer = framebuffer->getDepthbufferLayer();
2862 renderbuffer = framebuffer->getDepthbuffer();
2865 if(clientVersion < 3)
2867 return error(GL_INVALID_ENUM);
2870 case GL_STENCIL_ATTACHMENT:
2871 attachmentType = framebuffer->getStencilbufferType();
2872 attachmentHandle = framebuffer->getStencilbufferName();
2873 attachmentLayer = framebuffer->getStencilbufferLayer();
2874 renderbuffer = framebuffer->getStencilbuffer();
2876 case GL_DEPTH_STENCIL_ATTACHMENT:
2877 if(clientVersion >= 3)
2879 attachmentType = framebuffer->getDepthbufferType();
2880 attachmentHandle = framebuffer->getDepthbufferName();
2881 attachmentLayer = framebuffer->getDepthbufferLayer();
2882 if(attachmentHandle != framebuffer->getStencilbufferName())
2884 // Different attachments to DEPTH and STENCIL, query fails
2885 return error(GL_INVALID_OPERATION);
2887 renderbuffer = framebuffer->getDepthbuffer();
2889 else return error(GL_INVALID_ENUM);
2892 return error(GL_INVALID_ENUM);
2895 GLenum attachmentObjectType = GL_NONE; // Type category
2896 if(attachmentType == GL_NONE || Framebuffer::IsRenderbuffer(attachmentType))
2898 attachmentObjectType = attachmentType;
2900 else if(es2::IsTextureTarget(attachmentType))
2902 attachmentObjectType = GL_TEXTURE;
2904 else UNREACHABLE(attachmentType);
2906 if(attachmentObjectType != GL_NONE)
2910 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2911 *params = attachmentObjectType;
2913 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2914 if(Framebuffer::IsRenderbuffer(attachmentObjectType) || attachmentObjectType == GL_TEXTURE)
2916 *params = attachmentHandle;
2920 return error(GL_INVALID_ENUM);
2923 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2924 if(attachmentObjectType == GL_TEXTURE)
2926 *params = clientVersion < 3 ? 0 : renderbuffer->getLevel(); // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
2930 return error(GL_INVALID_ENUM);
2933 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2934 if(attachmentObjectType == GL_TEXTURE)
2936 if(es2::IsCubemapTextureTarget(attachmentType))
2938 *params = attachmentType;
2947 return error(GL_INVALID_ENUM);
2950 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2951 if(clientVersion >= 3)
2953 *params = attachmentLayer;
2955 else return error(GL_INVALID_ENUM);
2957 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2958 if(clientVersion >= 3)
2960 *params = renderbuffer->getRedSize();
2962 else return error(GL_INVALID_ENUM);
2964 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2965 if(clientVersion >= 3)
2967 *params = renderbuffer->getGreenSize();
2969 else return error(GL_INVALID_ENUM);
2971 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2972 if(clientVersion >= 3)
2974 *params = renderbuffer->getBlueSize();
2976 else return error(GL_INVALID_ENUM);
2978 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2979 if(clientVersion >= 3)
2981 *params = renderbuffer->getAlphaSize();
2983 else return error(GL_INVALID_ENUM);
2985 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2986 if(clientVersion >= 3)
2988 *params = renderbuffer->getDepthSize();
2990 else return error(GL_INVALID_ENUM);
2992 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2993 if(clientVersion >= 3)
2995 *params = renderbuffer->getStencilSize();
2997 else return error(GL_INVALID_ENUM);
2999 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
3000 // case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: // GL_EXT_color_buffer_half_float
3001 if(attachment == GL_DEPTH_STENCIL_ATTACHMENT)
3003 return error(GL_INVALID_OPERATION);
3006 *params = sw2es::GetComponentType(renderbuffer->getInternalFormat(), attachment);
3008 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
3009 if(clientVersion >= 3)
3011 *params = GL_LINEAR; // FIXME: GL_SRGB will also be possible, when sRGB is added
3013 else return error(GL_INVALID_ENUM);
3016 return error(GL_INVALID_ENUM);
3021 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
3022 // is NONE, then querying any other pname will generate INVALID_ENUM.
3024 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
3025 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
3026 // INVALID_OPERATION for all other pnames
3030 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
3034 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
3035 if(clientVersion < 3)
3037 return error(GL_INVALID_ENUM);
3043 if(clientVersion < 3)
3045 return error(GL_INVALID_ENUM);
3049 return error(GL_INVALID_OPERATION);
3056 GLenum GetGraphicsResetStatusEXT(void)
3063 void GetIntegerv(GLenum pname, GLint* params)
3065 TRACE("(GLenum pname = 0x%X, GLint* params = %p)", pname, params);
3067 es2::Context *context = es2::getContext();
3071 // Not strictly an error, but probably unintended or attempting to rely on non-compliant behavior
3073 ALOGI("expected_badness glGetIntegerv() called without current context.");
3075 ERR("glGetIntegerv() called without current context.");
3078 // This is not spec compliant! When there is no current GL context, functions should
3079 // have no side effects. Google Maps queries these values before creating a context,
3080 // so we need this as a bug-compatible workaround.
3083 case GL_MAX_TEXTURE_SIZE: *params = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE; return;
3084 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = es2::MAX_VERTEX_TEXTURE_IMAGE_UNITS; return;
3085 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = es2::MAX_COMBINED_TEXTURE_IMAGE_UNITS; return;
3086 case GL_STENCIL_BITS: *params = 8; return;
3087 case GL_ALIASED_LINE_WIDTH_RANGE:
3088 params[0] = (GLint)es2::ALIASED_LINE_WIDTH_RANGE_MIN;
3089 params[1] = (GLint)es2::ALIASED_LINE_WIDTH_RANGE_MAX;
3096 if(!(context->getIntegerv(pname, params)))
3099 unsigned int numParams = 0;
3100 if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))
3101 return error(GL_INVALID_ENUM);
3104 return; // it is known that pname is valid, but there are no parameters to return
3106 if(nativeType == GL_BOOL)
3108 GLboolean *boolParams = nullptr;
3109 boolParams = new GLboolean[numParams];
3111 context->getBooleanv(pname, boolParams);
3113 for(unsigned int i = 0; i < numParams; ++i)
3115 params[i] = (boolParams[i] == GL_FALSE) ? 0 : 1;
3118 delete [] boolParams;
3120 else if(nativeType == GL_FLOAT)
3122 GLfloat *floatParams = nullptr;
3123 floatParams = new GLfloat[numParams];
3125 context->getFloatv(pname, floatParams);
3127 for(unsigned int i = 0; i < numParams; ++i)
3129 if(pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
3131 params[i] = convert_float_int(floatParams[i]);
3135 params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));
3139 delete [] floatParams;
3145 void GetProgramiv(GLuint program, GLenum pname, GLint* params)
3147 TRACE("(GLuint program = %d, GLenum pname = 0x%X, GLint* params = %p)", program, pname, params);
3149 es2::Context *context = es2::getContext();
3153 es2::Program *programObject = context->getProgram(program);
3157 if(context->getShader(program))
3159 return error(GL_INVALID_OPERATION);
3163 return error(GL_INVALID_VALUE);
3167 GLint clientVersion = egl::getClientVersion();
3171 case GL_DELETE_STATUS:
3172 *params = programObject->isFlaggedForDeletion();
3174 case GL_LINK_STATUS:
3175 *params = programObject->isLinked();
3177 case GL_VALIDATE_STATUS:
3178 *params = programObject->isValidated();
3180 case GL_INFO_LOG_LENGTH:
3181 *params = (GLint)programObject->getInfoLogLength();
3183 case GL_ATTACHED_SHADERS:
3184 *params = programObject->getAttachedShadersCount();
3186 case GL_ACTIVE_ATTRIBUTES:
3187 *params = (GLint)programObject->getActiveAttributeCount();
3189 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
3190 *params = programObject->getActiveAttributeMaxLength();
3192 case GL_ACTIVE_UNIFORMS:
3193 *params = (GLint)programObject->getActiveUniformCount();
3195 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
3196 *params = programObject->getActiveUniformMaxLength();
3198 case GL_ACTIVE_UNIFORM_BLOCKS:
3199 if(clientVersion >= 3)
3201 *params = (GLint)programObject->getActiveUniformBlockCount();
3204 else return error(GL_INVALID_ENUM);
3205 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3206 if(clientVersion >= 3)
3208 *params = programObject->getActiveUniformBlockMaxLength();
3211 else return error(GL_INVALID_ENUM);
3212 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3213 if(clientVersion >= 3)
3215 *params = programObject->getTransformFeedbackBufferMode();
3218 else return error(GL_INVALID_ENUM);
3219 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3220 if(clientVersion >= 3)
3222 *params = programObject->getTransformFeedbackVaryingCount();
3225 else return error(GL_INVALID_ENUM);
3226 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
3227 if(clientVersion >= 3)
3229 *params = programObject->getTransformFeedbackVaryingMaxLength();
3232 else return error(GL_INVALID_ENUM);
3233 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
3234 if(clientVersion >= 3)
3236 *params = programObject->getBinaryRetrievableHint();
3239 else return error(GL_INVALID_ENUM);
3240 case GL_PROGRAM_BINARY_LENGTH:
3241 if(clientVersion >= 3)
3243 *params = programObject->getBinaryLength();
3246 else return error(GL_INVALID_ENUM);
3248 return error(GL_INVALID_ENUM);
3253 void GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
3255 TRACE("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = %p, GLchar* infolog = %p)",
3256 program, bufsize, length, infolog);
3260 return error(GL_INVALID_VALUE);
3263 es2::Context *context = es2::getContext();
3267 es2::Program *programObject = context->getProgram(program);
3271 if(context->getShader(program))
3273 return error(GL_INVALID_OPERATION);
3277 return error(GL_INVALID_VALUE);
3281 programObject->getInfoLog(bufsize, length, infolog);
3285 void GetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3287 TRACE("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = %p)", target, pname, params);
3291 case GL_CURRENT_QUERY_EXT:
3294 return error(GL_INVALID_ENUM);
3297 es2::Context *context = es2::getContext();
3301 params[0] = context->getActiveQuery(target);
3305 void GetQueryObjectuivEXT(GLuint name, GLenum pname, GLuint *params)
3307 TRACE("(GLuint name = %d, GLenum pname = 0x%X, GLuint *params = %p)", name, pname, params);
3311 case GL_QUERY_RESULT_EXT:
3312 case GL_QUERY_RESULT_AVAILABLE_EXT:
3315 return error(GL_INVALID_ENUM);
3318 es2::Context *context = es2::getContext();
3322 es2::Query *queryObject = context->getQuery(name);
3326 return error(GL_INVALID_OPERATION);
3329 if(context->getActiveQuery(queryObject->getType()) == name)
3331 return error(GL_INVALID_OPERATION);
3336 case GL_QUERY_RESULT_EXT:
3337 params[0] = queryObject->getResult();
3339 case GL_QUERY_RESULT_AVAILABLE_EXT:
3340 params[0] = queryObject->isResultAvailable();
3348 void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3350 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = %p)", target, pname, params);
3352 es2::Context *context = es2::getContext();
3356 if(target != GL_RENDERBUFFER)
3358 return error(GL_INVALID_ENUM);
3361 if(context->getRenderbufferName() == 0)
3363 return error(GL_INVALID_OPERATION);
3366 es2::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferName());
3370 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
3371 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
3372 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getFormat(); break;
3373 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
3374 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
3375 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
3376 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
3377 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
3378 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
3379 case GL_RENDERBUFFER_SAMPLES_ANGLE: *params = renderbuffer->getSamples(); break;
3381 return error(GL_INVALID_ENUM);
3386 void GetShaderiv(GLuint shader, GLenum pname, GLint* params)
3388 TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = %p)", shader, pname, params);
3390 es2::Context *context = es2::getContext();
3394 es2::Shader *shaderObject = context->getShader(shader);
3398 if(context->getProgram(shader))
3400 return error(GL_INVALID_OPERATION);
3404 return error(GL_INVALID_VALUE);
3410 case GL_SHADER_TYPE:
3411 *params = shaderObject->getType();
3413 case GL_DELETE_STATUS:
3414 *params = shaderObject->isFlaggedForDeletion();
3416 case GL_COMPILE_STATUS:
3417 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3419 case GL_INFO_LOG_LENGTH:
3420 *params = (GLint)shaderObject->getInfoLogLength();
3422 case GL_SHADER_SOURCE_LENGTH:
3423 *params = (GLint)shaderObject->getSourceLength();
3426 return error(GL_INVALID_ENUM);
3431 void GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
3433 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = %p, GLchar* infolog = %p)",
3434 shader, bufsize, length, infolog);
3438 return error(GL_INVALID_VALUE);
3441 es2::Context *context = es2::getContext();
3445 es2::Shader *shaderObject = context->getShader(shader);
3449 if(context->getProgram(shader))
3451 return error(GL_INVALID_OPERATION);
3455 return error(GL_INVALID_VALUE);
3459 shaderObject->getInfoLog(bufsize, length, infolog);
3463 void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3465 TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = %p, GLint* precision = %p)",
3466 shadertype, precisiontype, range, precision);
3470 case GL_VERTEX_SHADER:
3471 case GL_FRAGMENT_SHADER:
3474 return error(GL_INVALID_ENUM);
3477 switch(precisiontype)
3480 case GL_MEDIUM_FLOAT:
3482 // IEEE 754 single-precision
3490 // Full integer precision is supported
3496 return error(GL_INVALID_ENUM);
3500 void GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3502 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = %p, GLchar* source = %p)",
3503 shader, bufsize, length, source);
3507 return error(GL_INVALID_VALUE);
3510 es2::Context *context = es2::getContext();
3514 es2::Shader *shaderObject = context->getShader(shader);
3518 if(context->getProgram(shader))
3520 return error(GL_INVALID_OPERATION);
3524 return error(GL_INVALID_VALUE);
3528 shaderObject->getSource(bufsize, length, source);
3532 const GLubyte* GetString(GLenum name)
3534 TRACE("(GLenum name = 0x%X)", name);
3539 return (GLubyte*)"Google Inc.";
3541 return (GLubyte*)"Google SwiftShader";
3544 es2::Context *context = es2::getContext();
3545 return (context && (context->getClientVersion() >= 3)) ?
3546 (GLubyte*)"OpenGL ES 3.0 SwiftShader " VERSION_STRING :
3547 (GLubyte*)"OpenGL ES 2.0 SwiftShader " VERSION_STRING;
3549 case GL_SHADING_LANGUAGE_VERSION:
3551 es2::Context *context = es2::getContext();
3552 return (context && (context->getClientVersion() >= 3)) ?
3553 (GLubyte*)"OpenGL ES GLSL ES 3.00 SwiftShader " VERSION_STRING :
3554 (GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader " VERSION_STRING;
3558 es2::Context *context = es2::getContext();
3559 return context ? context->getExtensions(GL_INVALID_INDEX) : (GLubyte*)nullptr;
3562 return error(GL_INVALID_ENUM, (GLubyte*)nullptr);
3566 void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3568 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = %p)", target, pname, params);
3570 es2::Context *context = es2::getContext();
3574 es2::Texture *texture;
3576 GLint clientVersion = context->getClientVersion();
3581 texture = context->getTexture2D();
3583 case GL_TEXTURE_CUBE_MAP:
3584 texture = context->getTextureCubeMap();
3586 case GL_TEXTURE_EXTERNAL_OES:
3587 texture = context->getTextureExternal();
3589 case GL_TEXTURE_2D_ARRAY:
3590 if(clientVersion < 3)
3592 return error(GL_INVALID_ENUM);
3596 texture = context->getTexture2DArray();
3599 case GL_TEXTURE_3D_OES:
3600 texture = context->getTexture3D();
3603 return error(GL_INVALID_ENUM);
3608 case GL_TEXTURE_MAG_FILTER:
3609 *params = (GLfloat)texture->getMagFilter();
3611 case GL_TEXTURE_MIN_FILTER:
3612 *params = (GLfloat)texture->getMinFilter();
3614 case GL_TEXTURE_WRAP_S:
3615 *params = (GLfloat)texture->getWrapS();
3617 case GL_TEXTURE_WRAP_T:
3618 *params = (GLfloat)texture->getWrapT();
3620 case GL_TEXTURE_WRAP_R_OES:
3621 *params = (GLfloat)texture->getWrapR();
3623 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3624 *params = texture->getMaxAnisotropy();
3626 case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
3627 *params = (GLfloat)1;
3629 case GL_TEXTURE_BASE_LEVEL:
3630 if(clientVersion >= 3)
3632 *params = (GLfloat)texture->getBaseLevel();
3635 else return error(GL_INVALID_ENUM);
3636 case GL_TEXTURE_COMPARE_FUNC:
3637 if(clientVersion >= 3)
3639 *params = (GLfloat)texture->getCompareFunc();
3642 else return error(GL_INVALID_ENUM);
3643 case GL_TEXTURE_COMPARE_MODE:
3644 if(clientVersion >= 3)
3646 *params = (GLfloat)texture->getCompareMode();
3649 else return error(GL_INVALID_ENUM);
3650 case GL_TEXTURE_IMMUTABLE_FORMAT:
3651 if(clientVersion >= 3)
3653 *params = (GLfloat)texture->getImmutableFormat();
3656 else return error(GL_INVALID_ENUM);
3657 case GL_TEXTURE_IMMUTABLE_LEVELS:
3658 if(clientVersion >= 3)
3660 *params = (GLfloat)texture->getImmutableLevels();
3663 else return error(GL_INVALID_ENUM);
3664 case GL_TEXTURE_MAX_LEVEL:
3665 if(clientVersion >= 3)
3667 *params = (GLfloat)texture->getMaxLevel();
3670 else return error(GL_INVALID_ENUM);
3671 case GL_TEXTURE_MAX_LOD:
3672 if(clientVersion >= 3)
3674 *params = texture->getMaxLOD();
3677 else return error(GL_INVALID_ENUM);
3678 case GL_TEXTURE_MIN_LOD:
3679 if(clientVersion >= 3)
3681 *params = texture->getMinLOD();
3684 else return error(GL_INVALID_ENUM);
3685 case GL_TEXTURE_SWIZZLE_R:
3686 if(clientVersion >= 3)
3688 *params = (GLfloat)texture->getSwizzleR();
3691 else return error(GL_INVALID_ENUM);
3692 case GL_TEXTURE_SWIZZLE_G:
3693 if(clientVersion >= 3)
3695 *params = (GLfloat)texture->getSwizzleG();
3698 else return error(GL_INVALID_ENUM);
3699 case GL_TEXTURE_SWIZZLE_B:
3700 if(clientVersion >= 3)
3702 *params = (GLfloat)texture->getSwizzleB();
3705 else return error(GL_INVALID_ENUM);
3706 case GL_TEXTURE_SWIZZLE_A:
3707 if(clientVersion >= 3)
3709 *params = (GLfloat)texture->getSwizzleA();
3712 else return error(GL_INVALID_ENUM);
3714 return error(GL_INVALID_ENUM);
3719 void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3721 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = %p)", target, pname, params);
3723 es2::Context *context = es2::getContext();
3727 es2::Texture *texture;
3729 GLint clientVersion = context->getClientVersion();
3734 texture = context->getTexture2D();
3736 case GL_TEXTURE_CUBE_MAP:
3737 texture = context->getTextureCubeMap();
3739 case GL_TEXTURE_EXTERNAL_OES:
3740 texture = context->getTextureExternal();
3742 case GL_TEXTURE_2D_ARRAY:
3743 if(clientVersion < 3)
3745 return error(GL_INVALID_ENUM);
3749 texture = context->getTexture2DArray();
3752 case GL_TEXTURE_3D_OES:
3753 texture = context->getTexture3D();
3756 return error(GL_INVALID_ENUM);
3761 case GL_TEXTURE_MAG_FILTER:
3762 *params = texture->getMagFilter();
3764 case GL_TEXTURE_MIN_FILTER:
3765 *params = texture->getMinFilter();
3767 case GL_TEXTURE_WRAP_S:
3768 *params = texture->getWrapS();
3770 case GL_TEXTURE_WRAP_T:
3771 *params = texture->getWrapT();
3773 case GL_TEXTURE_WRAP_R_OES:
3774 *params = texture->getWrapR();
3776 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3777 *params = (GLint)texture->getMaxAnisotropy();
3779 case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
3782 case GL_TEXTURE_BASE_LEVEL:
3783 if(clientVersion >= 3)
3785 *params = texture->getBaseLevel();
3788 else return error(GL_INVALID_ENUM);
3789 case GL_TEXTURE_COMPARE_FUNC:
3790 if(clientVersion >= 3)
3792 *params = (GLint)texture->getCompareFunc();
3795 else return error(GL_INVALID_ENUM);
3796 case GL_TEXTURE_COMPARE_MODE:
3797 if(clientVersion >= 3)
3799 *params = (GLint)texture->getCompareMode();
3802 else return error(GL_INVALID_ENUM);
3803 case GL_TEXTURE_IMMUTABLE_FORMAT:
3804 if(clientVersion >= 3)
3806 *params = (GLint)texture->getImmutableFormat();
3809 else return error(GL_INVALID_ENUM);
3810 case GL_TEXTURE_IMMUTABLE_LEVELS:
3811 if(clientVersion >= 3)
3813 *params = (GLint)texture->getImmutableLevels();
3816 else return error(GL_INVALID_ENUM);
3817 case GL_TEXTURE_MAX_LEVEL:
3818 if(clientVersion >= 3)
3820 *params = texture->getMaxLevel();
3823 else return error(GL_INVALID_ENUM);
3824 case GL_TEXTURE_MAX_LOD:
3825 if(clientVersion >= 3)
3827 *params = (GLint)roundf(texture->getMaxLOD());
3830 else return error(GL_INVALID_ENUM);
3831 case GL_TEXTURE_MIN_LOD:
3832 if(clientVersion >= 3)
3834 *params = (GLint)roundf(texture->getMinLOD());
3837 else return error(GL_INVALID_ENUM);
3838 case GL_TEXTURE_SWIZZLE_R:
3839 if(clientVersion >= 3)
3841 *params = (GLint)texture->getSwizzleR();
3844 else return error(GL_INVALID_ENUM);
3845 case GL_TEXTURE_SWIZZLE_G:
3846 if(clientVersion >= 3)
3848 *params = (GLint)texture->getSwizzleG();
3851 else return error(GL_INVALID_ENUM);
3852 case GL_TEXTURE_SWIZZLE_B:
3853 if(clientVersion >= 3)
3855 *params = (GLint)texture->getSwizzleB();
3858 else return error(GL_INVALID_ENUM);
3859 case GL_TEXTURE_SWIZZLE_A:
3860 if(clientVersion >= 3)
3862 *params = (GLint)texture->getSwizzleA();
3865 else return error(GL_INVALID_ENUM);
3867 return error(GL_INVALID_ENUM);
3872 void GetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3874 TRACE("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = %p)",
3875 program, location, bufSize, params);
3879 return error(GL_INVALID_VALUE);
3882 es2::Context *context = es2::getContext();
3886 es2::Program *programObject = context->getProgram(program);
3890 if(context->getShader(program))
3892 return error(GL_INVALID_OPERATION);
3896 return error(GL_INVALID_VALUE);
3900 if(!programObject->isLinked())
3902 return error(GL_INVALID_OPERATION);
3905 if(!programObject->getUniformfv(location, &bufSize, params))
3907 return error(GL_INVALID_OPERATION);
3912 void GetUniformfv(GLuint program, GLint location, GLfloat* params)
3914 TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = %p)", program, location, params);
3916 es2::Context *context = es2::getContext();
3920 es2::Program *programObject = context->getProgram(program);
3924 if(context->getShader(program))
3926 return error(GL_INVALID_OPERATION);
3930 return error(GL_INVALID_VALUE);
3934 if(!programObject->isLinked())
3936 return error(GL_INVALID_OPERATION);
3939 if(!programObject->getUniformfv(location, nullptr, params))
3941 return error(GL_INVALID_OPERATION);
3946 void GetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3948 TRACE("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = %p)",
3949 program, location, bufSize, params);
3953 return error(GL_INVALID_VALUE);
3956 es2::Context *context = es2::getContext();
3960 es2::Program *programObject = context->getProgram(program);
3964 if(context->getShader(program))
3966 return error(GL_INVALID_OPERATION);
3970 return error(GL_INVALID_VALUE);
3974 if(!programObject->isLinked())
3976 return error(GL_INVALID_OPERATION);
3979 if(!programObject->getUniformiv(location, &bufSize, params))
3981 return error(GL_INVALID_OPERATION);
3986 void GetUniformiv(GLuint program, GLint location, GLint* params)
3988 TRACE("(GLuint program = %d, GLint location = %d, GLint* params = %p)", program, location, params);
3990 es2::Context *context = es2::getContext();
3994 es2::Program *programObject = context->getProgram(program);
3998 if(context->getShader(program))
4000 return error(GL_INVALID_OPERATION);
4004 return error(GL_INVALID_VALUE);
4008 if(!programObject->isLinked())
4010 return error(GL_INVALID_OPERATION);
4013 if(!programObject->getUniformiv(location, nullptr, params))
4015 return error(GL_INVALID_OPERATION);
4020 int GetUniformLocation(GLuint program, const GLchar* name)
4022 TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name);
4024 es2::Context *context = es2::getContext();
4026 if(strstr(name, "gl_") == name)
4033 es2::Program *programObject = context->getProgram(program);
4037 if(context->getShader(program))
4039 return error(GL_INVALID_OPERATION, -1);
4043 return error(GL_INVALID_VALUE, -1);
4047 if(!programObject->isLinked())
4049 return error(GL_INVALID_OPERATION, -1);
4052 return programObject->getUniformLocation(name);
4058 void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
4060 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = %p)", index, pname, params);
4062 es2::Context *context = es2::getContext();
4066 if(index >= es2::MAX_VERTEX_ATTRIBS)
4068 return error(GL_INVALID_VALUE);
4071 const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
4073 GLint clientVersion = context->getClientVersion();
4077 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
4078 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
4080 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
4081 *params = (GLfloat)attribState.mSize;
4083 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
4084 *params = (GLfloat)attribState.mStride;
4086 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
4087 *params = (GLfloat)attribState.mType;
4089 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
4090 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
4092 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
4093 *params = (GLfloat)attribState.mBoundBuffer.name();
4095 case GL_CURRENT_VERTEX_ATTRIB:
4097 const VertexAttribute& attrib = context->getCurrentVertexAttributes()[index];
4098 for(int i = 0; i < 4; ++i)
4100 params[i] = attrib.getCurrentValueF(i);
4104 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
4105 if(clientVersion >= 3)
4107 switch(attribState.mType)
4110 case GL_UNSIGNED_BYTE:
4112 case GL_UNSIGNED_SHORT:
4114 case GL_INT_2_10_10_10_REV:
4115 case GL_UNSIGNED_INT:
4117 *params = (GLfloat)GL_TRUE;
4120 *params = (GLfloat)GL_FALSE;
4125 else return error(GL_INVALID_ENUM);
4126 default: return error(GL_INVALID_ENUM);
4131 void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
4133 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = %p)", index, pname, params);
4135 es2::Context *context = es2::getContext();
4139 if(index >= es2::MAX_VERTEX_ATTRIBS)
4141 return error(GL_INVALID_VALUE);
4144 const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
4146 GLint clientVersion = context->getClientVersion();
4150 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
4151 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
4153 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
4154 *params = attribState.mSize;
4156 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
4157 *params = attribState.mStride;
4159 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
4160 *params = attribState.mType;
4162 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
4163 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
4165 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
4166 *params = attribState.mBoundBuffer.name();
4168 case GL_CURRENT_VERTEX_ATTRIB:
4170 const VertexAttribute& attrib = context->getCurrentVertexAttributes()[index];
4171 for(int i = 0; i < 4; ++i)
4173 float currentValue = attrib.getCurrentValueF(i);
4174 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
4178 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
4179 if(clientVersion >= 3)
4181 switch(attribState.mType)
4184 case GL_UNSIGNED_BYTE:
4186 case GL_UNSIGNED_SHORT:
4188 case GL_INT_2_10_10_10_REV:
4189 case GL_UNSIGNED_INT:
4199 else return error(GL_INVALID_ENUM);
4200 default: return error(GL_INVALID_ENUM);
4205 void GetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
4207 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = %p)", index, pname, pointer);
4209 es2::Context *context = es2::getContext();
4213 if(index >= es2::MAX_VERTEX_ATTRIBS)
4215 return error(GL_INVALID_VALUE);
4218 if(pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4220 return error(GL_INVALID_ENUM);
4223 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
4227 void Hint(GLenum target, GLenum mode)
4229 TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
4238 return error(GL_INVALID_ENUM);
4241 es2::Context *context = es2::getContext();
4244 case GL_GENERATE_MIPMAP_HINT:
4245 if(context) context->setGenerateMipmapHint(mode);
4247 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4248 if(context) context->setFragmentShaderDerivativeHint(mode);
4251 return error(GL_INVALID_ENUM);
4255 GLboolean IsBuffer(GLuint buffer)
4257 TRACE("(GLuint buffer = %d)", buffer);
4259 es2::Context *context = es2::getContext();
4261 if(context && buffer)
4263 es2::Buffer *bufferObject = context->getBuffer(buffer);
4274 GLboolean IsEnabled(GLenum cap)
4276 TRACE("(GLenum cap = 0x%X)", cap);
4278 es2::Context *context = es2::getContext();
4282 GLint clientVersion = context->getClientVersion();
4286 case GL_CULL_FACE: return context->isCullFaceEnabled();
4287 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
4288 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
4289 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
4290 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
4291 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
4292 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
4293 case GL_BLEND: return context->isBlendEnabled();
4294 case GL_DITHER: return context->isDitherEnabled();
4295 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
4296 if(clientVersion >= 3)
4298 return context->isPrimitiveRestartFixedIndexEnabled();
4300 else return error(GL_INVALID_ENUM, false);
4301 case GL_RASTERIZER_DISCARD:
4302 if(clientVersion >= 3)
4304 return context->isRasterizerDiscardEnabled();
4306 else return error(GL_INVALID_ENUM, false);
4308 return error(GL_INVALID_ENUM, false);
4315 GLboolean IsFenceNV(GLuint fence)
4317 TRACE("(GLuint fence = %d)", fence);
4319 es2::Context *context = es2::getContext();
4323 es2::Fence *fenceObject = context->getFence(fence);
4330 return fenceObject->isFence();
4336 GLboolean IsFramebuffer(GLuint framebuffer)
4338 TRACE("(GLuint framebuffer = %d)", framebuffer);
4340 es2::Context *context = es2::getContext();
4342 if(context && framebuffer)
4344 es2::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4346 if(framebufferObject)
4355 GLboolean IsProgram(GLuint program)
4357 TRACE("(GLuint program = %d)", program);
4359 es2::Context *context = es2::getContext();
4361 if(context && program)
4363 es2::Program *programObject = context->getProgram(program);
4374 GLboolean IsQueryEXT(GLuint name)
4376 TRACE("(GLuint name = %d)", name);
4383 es2::Context *context = es2::getContext();
4387 es2::Query *queryObject = context->getQuery(name);
4398 GLboolean IsRenderbuffer(GLuint renderbuffer)
4400 TRACE("(GLuint renderbuffer = %d)", renderbuffer);
4402 es2::Context *context = es2::getContext();
4404 if(context && renderbuffer)
4406 es2::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
4408 if(renderbufferObject)
4417 GLboolean IsShader(GLuint shader)
4419 TRACE("(GLuint shader = %d)", shader);
4421 es2::Context *context = es2::getContext();
4423 if(context && shader)
4425 es2::Shader *shaderObject = context->getShader(shader);
4436 GLboolean IsTexture(GLuint texture)
4438 TRACE("(GLuint texture = %d)", texture);
4440 es2::Context *context = es2::getContext();
4442 if(context && texture)
4444 es2::Texture *textureObject = context->getTexture(texture);
4455 void LineWidth(GLfloat width)
4457 TRACE("(GLfloat width = %f)", width);
4461 return error(GL_INVALID_VALUE);
4464 es2::Context *context = es2::getContext();
4468 context->setLineWidth(width);
4472 void LinkProgram(GLuint program)
4474 TRACE("(GLuint program = %d)", program);
4476 es2::Context *context = es2::getContext();
4480 es2::Program *programObject = context->getProgram(program);
4484 if(context->getShader(program))
4486 return error(GL_INVALID_OPERATION);
4490 return error(GL_INVALID_VALUE);
4494 programObject->link();
4498 void PixelStorei(GLenum pname, GLint param)
4500 TRACE("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
4502 es2::Context *context = es2::getContext();
4506 GLint clientVersion = context->getClientVersion();
4510 case GL_UNPACK_ALIGNMENT:
4511 if(param != 1 && param != 2 && param != 4 && param != 8)
4513 return error(GL_INVALID_VALUE);
4515 context->setUnpackAlignment(param);
4517 case GL_PACK_ALIGNMENT:
4518 if(param != 1 && param != 2 && param != 4 && param != 8)
4520 return error(GL_INVALID_VALUE);
4522 context->setPackAlignment(param);
4524 case GL_PACK_ROW_LENGTH:
4525 if(clientVersion >= 3)
4529 return error(GL_INVALID_VALUE);
4531 context->setPackRowLength(param);
4534 else return error(GL_INVALID_ENUM);
4535 case GL_PACK_SKIP_PIXELS:
4536 if(clientVersion >= 3)
4540 return error(GL_INVALID_VALUE);
4542 context->setPackSkipPixels(param);
4545 else return error(GL_INVALID_ENUM);
4546 case GL_PACK_SKIP_ROWS:
4547 if(clientVersion >= 3)
4551 return error(GL_INVALID_VALUE);
4553 context->setPackSkipRows(param);
4556 else return error(GL_INVALID_ENUM);
4557 case GL_UNPACK_ROW_LENGTH:
4558 if(clientVersion >= 3)
4562 return error(GL_INVALID_VALUE);
4564 context->setUnpackRowLength(param);
4567 else return error(GL_INVALID_ENUM);
4568 case GL_UNPACK_IMAGE_HEIGHT:
4569 if(clientVersion >= 3)
4573 return error(GL_INVALID_VALUE);
4575 context->setUnpackImageHeight(param);
4578 else return error(GL_INVALID_ENUM);
4579 case GL_UNPACK_SKIP_PIXELS:
4580 if(clientVersion >= 3)
4584 return error(GL_INVALID_VALUE);
4586 context->setUnpackSkipPixels(param);
4589 else return error(GL_INVALID_ENUM);
4590 case GL_UNPACK_SKIP_ROWS:
4591 if(clientVersion >= 3)
4595 return error(GL_INVALID_VALUE);
4597 context->setUnpackSkipRows(param);
4600 else return error(GL_INVALID_ENUM);
4601 case GL_UNPACK_SKIP_IMAGES:
4602 if(clientVersion >= 3) {
4605 return error(GL_INVALID_VALUE);
4607 context->setUnpackSkipImages(param);
4610 else return error(GL_INVALID_ENUM);
4612 return error(GL_INVALID_ENUM);
4617 void PolygonOffset(GLfloat factor, GLfloat units)
4619 TRACE("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
4621 es2::Context *context = es2::getContext();
4625 context->setPolygonOffsetParams(factor, units);
4629 void ReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4630 GLenum format, GLenum type, GLsizei bufSize, GLvoid *data)
4632 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4633 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = %p)",
4634 x, y, width, height, format, type, bufSize, data);
4636 if(width < 0 || height < 0 || bufSize < 0)
4638 return error(GL_INVALID_VALUE);
4641 es2::Context *context = es2::getContext();
4645 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4649 void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
4651 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4652 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = %p)",
4653 x, y, width, height, format, type, pixels);
4655 if(width < 0 || height < 0)
4657 return error(GL_INVALID_VALUE);
4660 es2::Context *context = es2::getContext();
4664 context->readPixels(x, y, width, height, format, type, nullptr, pixels);
4668 void ReleaseShaderCompiler(void)
4672 es2::Shader::releaseCompiler();
4675 void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
4677 TRACE("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
4678 target, samples, internalformat, width, height);
4682 case GL_RENDERBUFFER:
4685 return error(GL_INVALID_ENUM);
4688 if(width < 0 || height < 0 || samples < 0)
4690 return error(GL_INVALID_VALUE);
4693 es2::Context *context = es2::getContext();
4697 if(width > es2::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE ||
4698 height > es2::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE ||
4699 samples > es2::IMPLEMENTATION_MAX_SAMPLES)
4701 return error(GL_INVALID_VALUE);
4704 GLuint handle = context->getRenderbufferName();
4707 return error(GL_INVALID_OPERATION);
4710 GLint clientVersion = context->getClientVersion();
4712 if(IsColorRenderable(internalformat, clientVersion, false))
4714 context->setRenderbufferStorage(new es2::Colorbuffer(width, height, internalformat, samples));
4716 else if(IsDepthRenderable(internalformat, clientVersion) && IsStencilRenderable(internalformat, clientVersion))
4718 context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, internalformat, samples));
4720 else if(IsDepthRenderable(internalformat, clientVersion))
4722 context->setRenderbufferStorage(new es2::Depthbuffer(width, height, internalformat, samples));
4724 else if(IsStencilRenderable(internalformat, clientVersion))
4726 context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples));
4728 else error(GL_INVALID_ENUM);
4732 void RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
4734 RenderbufferStorageMultisample(target, samples, internalformat, width, height);
4737 void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4739 RenderbufferStorageMultisample(target, 0, internalformat, width, height);
4742 void SampleCoverage(GLclampf value, GLboolean invert)
4744 TRACE("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
4746 es2::Context* context = es2::getContext();
4750 context->setSampleCoverageParams(es2::clamp01(value), invert == GL_TRUE);
4754 void SetFenceNV(GLuint fence, GLenum condition)
4756 TRACE("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
4758 if(condition != GL_ALL_COMPLETED_NV)
4760 return error(GL_INVALID_ENUM);
4763 es2::Context *context = es2::getContext();
4767 es2::Fence *fenceObject = context->getFence(fence);
4771 return error(GL_INVALID_OPERATION);
4774 fenceObject->setFence(condition);
4778 void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
4780 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
4782 if(width < 0 || height < 0)
4784 return error(GL_INVALID_VALUE);
4787 es2::Context* context = es2::getContext();
4791 context->setScissorParams(x, y, width, height);
4795 void ShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
4797 TRACE("(GLsizei n = %d, const GLuint* shaders = %p, GLenum binaryformat = 0x%X, "
4798 "const GLvoid* binary = %p, GLsizei length = %d)",
4799 n, shaders, binaryformat, binary, length);
4801 // No binary shader formats are supported.
4802 return error(GL_INVALID_ENUM);
4805 void ShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
4807 TRACE("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = %p, const GLint* length = %p)",
4808 shader, count, string, length);
4812 return error(GL_INVALID_VALUE);
4815 es2::Context *context = es2::getContext();
4819 es2::Shader *shaderObject = context->getShader(shader);
4823 if(context->getProgram(shader))
4825 return error(GL_INVALID_OPERATION);
4829 return error(GL_INVALID_VALUE);
4833 shaderObject->setSource(count, string, length);
4837 void StencilFunc(GLenum func, GLint ref, GLuint mask)
4839 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
4842 void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4844 TRACE("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
4850 case GL_FRONT_AND_BACK:
4853 return error(GL_INVALID_ENUM);
4868 return error(GL_INVALID_ENUM);
4871 es2::Context *context = es2::getContext();
4875 if(face == GL_FRONT || face == GL_FRONT_AND_BACK)
4877 context->setStencilParams(func, ref, mask);
4880 if(face == GL_BACK || face == GL_FRONT_AND_BACK)
4882 context->setStencilBackParams(func, ref, mask);
4887 void StencilMask(GLuint mask)
4889 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4892 void StencilMaskSeparate(GLenum face, GLuint mask)
4894 TRACE("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
4900 case GL_FRONT_AND_BACK:
4903 return error(GL_INVALID_ENUM);
4906 es2::Context *context = es2::getContext();
4910 if(face == GL_FRONT || face == GL_FRONT_AND_BACK)
4912 context->setStencilWritemask(mask);
4915 if(face == GL_BACK || face == GL_FRONT_AND_BACK)
4917 context->setStencilBackWritemask(mask);
4922 void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4924 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4927 void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4929 TRACE("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
4930 face, fail, zfail, zpass);
4936 case GL_FRONT_AND_BACK:
4939 return error(GL_INVALID_ENUM);
4954 return error(GL_INVALID_ENUM);
4969 return error(GL_INVALID_ENUM);
4984 return error(GL_INVALID_ENUM);
4987 es2::Context *context = es2::getContext();
4991 if(face == GL_FRONT || face == GL_FRONT_AND_BACK)
4993 context->setStencilOperations(fail, zfail, zpass);
4996 if(face == GL_BACK || face == GL_FRONT_AND_BACK)
4998 context->setStencilBackOperations(fail, zfail, zpass);
5003 GLboolean TestFenceNV(GLuint fence)
5005 TRACE("(GLuint fence = %d)", fence);
5007 es2::Context *context = es2::getContext();
5011 es2::Fence *fenceObject = context->getFence(fence);
5015 return error(GL_INVALID_OPERATION, GL_TRUE);
5018 return fenceObject->testFence();
5024 void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
5025 GLint border, GLenum format, GLenum type, const GLvoid* data)
5027 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
5028 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* data = %p)",
5029 target, level, internalformat, width, height, border, format, type, data);
5031 if(!validImageSize(level, width, height))
5033 return error(GL_INVALID_VALUE);
5036 es2::Context *context = es2::getContext();
5040 GLint clientVersion = context->getClientVersion();
5041 if(clientVersion < 3)
5043 if(internalformat != (GLint)format)
5045 return error(GL_INVALID_OPERATION);
5049 GLenum validationError = ValidateCompressedFormat(format, clientVersion, false);
5050 if(validationError != GL_NONE)
5052 return error(validationError);
5055 if(!ValidateTextureFormatType(format, type, internalformat, egl::getClientVersion()))
5062 return error(GL_INVALID_VALUE);
5068 if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
5069 height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
5071 return error(GL_INVALID_VALUE);
5074 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5075 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5076 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5077 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5078 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5079 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5082 return error(GL_INVALID_VALUE);
5085 if(width > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||
5086 height > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))
5088 return error(GL_INVALID_VALUE);
5092 return error(GL_INVALID_ENUM);
5095 GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);
5097 if(target == GL_TEXTURE_2D)
5099 es2::Texture2D *texture = context->getTexture2D();
5103 return error(GL_INVALID_OPERATION);
5106 texture->setImage(context, level, width, height, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
5110 es2::TextureCubeMap *texture = context->getTextureCubeMap();
5114 return error(GL_INVALID_OPERATION);
5117 texture->setImage(context, target, level, width, height, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
5122 void TexParameterf(GLenum target, GLenum pname, GLfloat param)
5124 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat param = %f)", target, pname, param);
5126 es2::Context *context = es2::getContext();
5130 es2::Texture *texture;
5132 GLint clientVersion = context->getClientVersion();
5137 texture = context->getTexture2D();
5139 case GL_TEXTURE_2D_ARRAY:
5140 if(clientVersion < 3)
5142 return error(GL_INVALID_ENUM);
5146 texture = context->getTexture2DArray();
5149 case GL_TEXTURE_3D_OES:
5150 texture = context->getTexture3D();
5152 case GL_TEXTURE_CUBE_MAP:
5153 texture = context->getTextureCubeMap();
5155 case GL_TEXTURE_EXTERNAL_OES:
5156 texture = context->getTextureExternal();
5159 return error(GL_INVALID_ENUM);
5164 case GL_TEXTURE_WRAP_S:
5165 if(!texture->setWrapS((GLenum)param))
5167 return error(GL_INVALID_ENUM);
5170 case GL_TEXTURE_WRAP_T:
5171 if(!texture->setWrapT((GLenum)param))
5173 return error(GL_INVALID_ENUM);
5176 case GL_TEXTURE_WRAP_R_OES:
5177 if(!texture->setWrapR((GLenum)param))
5179 return error(GL_INVALID_ENUM);
5182 case GL_TEXTURE_MIN_FILTER:
5183 if(!texture->setMinFilter((GLenum)param))
5185 return error(GL_INVALID_ENUM);
5188 case GL_TEXTURE_MAG_FILTER:
5189 if(!texture->setMagFilter((GLenum)param))
5191 return error(GL_INVALID_ENUM);
5194 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5195 if(!texture->setMaxAnisotropy(param))
5197 return error(GL_INVALID_VALUE);
5200 case GL_TEXTURE_BASE_LEVEL:
5201 if(clientVersion < 3 || !texture->setBaseLevel((GLint)(roundf(param))))
5203 return error(GL_INVALID_VALUE);
5206 case GL_TEXTURE_COMPARE_FUNC:
5207 if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param))
5209 return error(GL_INVALID_VALUE);
5212 case GL_TEXTURE_COMPARE_MODE:
5213 if(clientVersion < 3 || !texture->setCompareMode((GLenum)param))
5215 return error(GL_INVALID_VALUE);
5218 case GL_TEXTURE_MAX_LEVEL:
5219 if(clientVersion < 3 || !texture->setMaxLevel((GLint)(roundf(param))))
5221 return error(GL_INVALID_VALUE);
5224 case GL_TEXTURE_MAX_LOD:
5225 if(clientVersion < 3 || !texture->setMaxLOD(param))
5227 return error(GL_INVALID_VALUE);
5230 case GL_TEXTURE_MIN_LOD:
5231 if(clientVersion < 3 || !texture->setMinLOD(param))
5233 return error(GL_INVALID_VALUE);
5236 case GL_TEXTURE_SWIZZLE_R:
5237 if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param))
5239 return error(GL_INVALID_VALUE);
5242 case GL_TEXTURE_SWIZZLE_G:
5243 if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param))
5245 return error(GL_INVALID_VALUE);
5248 case GL_TEXTURE_SWIZZLE_B:
5249 if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param))
5251 return error(GL_INVALID_VALUE);
5254 case GL_TEXTURE_SWIZZLE_A:
5255 if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param))
5257 return error(GL_INVALID_VALUE);
5261 return error(GL_INVALID_ENUM);
5266 void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5268 glTexParameterf(target, pname, *params);
5271 void TexParameteri(GLenum target, GLenum pname, GLint param)
5273 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
5275 es2::Context *context = es2::getContext();
5279 es2::Texture *texture;
5281 GLint clientVersion = context->getClientVersion();
5286 texture = context->getTexture2D();
5288 case GL_TEXTURE_2D_ARRAY:
5289 if(clientVersion < 3)
5291 return error(GL_INVALID_ENUM);
5295 texture = context->getTexture2DArray();
5298 case GL_TEXTURE_3D_OES:
5299 texture = context->getTexture3D();
5301 case GL_TEXTURE_CUBE_MAP:
5302 texture = context->getTextureCubeMap();
5304 case GL_TEXTURE_EXTERNAL_OES:
5305 texture = context->getTextureExternal();
5308 return error(GL_INVALID_ENUM);
5313 case GL_TEXTURE_WRAP_S:
5314 if(!texture->setWrapS((GLenum)param))
5316 return error(GL_INVALID_ENUM);
5319 case GL_TEXTURE_WRAP_T:
5320 if(!texture->setWrapT((GLenum)param))
5322 return error(GL_INVALID_ENUM);
5325 case GL_TEXTURE_WRAP_R_OES:
5326 if(!texture->setWrapR((GLenum)param))
5328 return error(GL_INVALID_ENUM);
5331 case GL_TEXTURE_MIN_FILTER:
5332 if(!texture->setMinFilter((GLenum)param))
5334 return error(GL_INVALID_ENUM);
5337 case GL_TEXTURE_MAG_FILTER:
5338 if(!texture->setMagFilter((GLenum)param))
5340 return error(GL_INVALID_ENUM);
5343 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
5344 if(!texture->setMaxAnisotropy((GLfloat)param))
5346 return error(GL_INVALID_VALUE);
5349 case GL_TEXTURE_BASE_LEVEL:
5350 if(clientVersion < 3 || !texture->setBaseLevel(param))
5352 return error(GL_INVALID_VALUE);
5355 case GL_TEXTURE_COMPARE_FUNC:
5356 if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param))
5358 return error(GL_INVALID_VALUE);
5361 case GL_TEXTURE_COMPARE_MODE:
5362 if(clientVersion < 3 || !texture->setCompareMode((GLenum)param))
5364 return error(GL_INVALID_VALUE);
5367 case GL_TEXTURE_MAX_LEVEL:
5368 if(clientVersion < 3 || !texture->setMaxLevel(param))
5370 return error(GL_INVALID_VALUE);
5373 case GL_TEXTURE_MAX_LOD:
5374 if(clientVersion < 3 || !texture->setMaxLOD((GLfloat)param))
5376 return error(GL_INVALID_VALUE);
5379 case GL_TEXTURE_MIN_LOD:
5380 if(clientVersion < 3 || !texture->setMinLOD((GLfloat)param))
5382 return error(GL_INVALID_VALUE);
5385 case GL_TEXTURE_SWIZZLE_R:
5386 if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param))
5388 return error(GL_INVALID_VALUE);
5391 case GL_TEXTURE_SWIZZLE_G:
5392 if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param))
5394 return error(GL_INVALID_VALUE);
5397 case GL_TEXTURE_SWIZZLE_B:
5398 if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param))
5400 return error(GL_INVALID_VALUE);
5403 case GL_TEXTURE_SWIZZLE_A:
5404 if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param))
5406 return error(GL_INVALID_VALUE);
5410 return error(GL_INVALID_ENUM);
5415 void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
5417 glTexParameteri(target, pname, *params);
5420 void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5421 GLenum format, GLenum type, const GLvoid* data)
5423 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5424 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
5425 "const GLvoid* data = %p)",
5426 target, level, xoffset, yoffset, width, height, format, type, data);
5428 if(!es2::IsTextureTarget(target))
5430 return error(GL_INVALID_ENUM);
5433 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
5435 return error(GL_INVALID_VALUE);
5438 if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
5440 return error(GL_INVALID_VALUE);
5443 if(std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
5445 return error(GL_INVALID_VALUE);
5448 if(!ValidateTextureFormatType(format, type, format, egl::getClientVersion()))
5453 if(width == 0 || height == 0)
5458 es2::Context *context = es2::getContext();
5462 GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);
5464 if(target == GL_TEXTURE_2D)
5466 es2::Texture2D *texture = context->getTexture2D();
5468 GLenum validationError = ValidateSubImageParams(false, width, height, xoffset, yoffset, target, level, sizedInternalFormat, texture);
5470 if(validationError == GL_NONE)
5472 texture->subImage(context, level, xoffset, yoffset, width, height, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
5476 return error(validationError);
5479 else if(es2::IsCubemapTextureTarget(target))
5481 es2::TextureCubeMap *texture = context->getTextureCubeMap();
5483 GLenum validationError = ValidateSubImageParams(false, width, height, xoffset, yoffset, target, level, sizedInternalFormat, texture);
5485 if(validationError == GL_NONE)
5487 texture->subImage(context, target, level, xoffset, yoffset, width, height, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
5491 return error(validationError);
5494 else UNREACHABLE(target);
5498 void Uniform1f(GLint location, GLfloat x)
5500 glUniform1fv(location, 1, &x);
5503 void Uniform1fv(GLint location, GLsizei count, const GLfloat* v)
5505 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = %p)", location, count, v);
5509 return error(GL_INVALID_VALUE);
5517 es2::Context *context = es2::getContext();
5521 es2::Program *program = context->getCurrentProgram();
5525 return error(GL_INVALID_OPERATION);
5528 if(!program->setUniform1fv(location, count, v))
5530 return error(GL_INVALID_OPERATION);
5535 void Uniform1i(GLint location, GLint x)
5537 glUniform1iv(location, 1, &x);
5540 void Uniform1iv(GLint location, GLsizei count, const GLint* v)
5542 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = %p)", location, count, v);
5546 return error(GL_INVALID_VALUE);
5554 es2::Context *context = es2::getContext();
5558 es2::Program *program = context->getCurrentProgram();
5562 return error(GL_INVALID_OPERATION);
5565 if(!program->setUniform1iv(location, count, v))
5567 return error(GL_INVALID_OPERATION);
5572 void Uniform2f(GLint location, GLfloat x, GLfloat y)
5574 GLfloat xy[2] = {x, y};
5576 glUniform2fv(location, 1, (GLfloat*)&xy);
5579 void Uniform2fv(GLint location, GLsizei count, const GLfloat* v)
5581 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = %p)", location, count, v);
5585 return error(GL_INVALID_VALUE);
5593 es2::Context *context = es2::getContext();
5597 es2::Program *program = context->getCurrentProgram();
5601 return error(GL_INVALID_OPERATION);
5604 if(!program->setUniform2fv(location, count, v))
5606 return error(GL_INVALID_OPERATION);
5611 void Uniform2i(GLint location, GLint x, GLint y)
5613 GLint xy[4] = {x, y};
5615 glUniform2iv(location, 1, (GLint*)&xy);
5618 void Uniform2iv(GLint location, GLsizei count, const GLint* v)
5620 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = %p)", location, count, v);
5624 return error(GL_INVALID_VALUE);
5632 es2::Context *context = es2::getContext();
5636 es2::Program *program = context->getCurrentProgram();
5640 return error(GL_INVALID_OPERATION);
5643 if(!program->setUniform2iv(location, count, v))
5645 return error(GL_INVALID_OPERATION);
5650 void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5652 GLfloat xyz[3] = {x, y, z};
5654 glUniform3fv(location, 1, (GLfloat*)&xyz);
5657 void Uniform3fv(GLint location, GLsizei count, const GLfloat* v)
5659 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = %p)", location, count, v);
5663 return error(GL_INVALID_VALUE);
5671 es2::Context *context = es2::getContext();
5675 es2::Program *program = context->getCurrentProgram();
5679 return error(GL_INVALID_OPERATION);
5682 if(!program->setUniform3fv(location, count, v))
5684 return error(GL_INVALID_OPERATION);
5689 void Uniform3i(GLint location, GLint x, GLint y, GLint z)
5691 GLint xyz[3] = {x, y, z};
5693 glUniform3iv(location, 1, (GLint*)&xyz);
5696 void Uniform3iv(GLint location, GLsizei count, const GLint* v)
5698 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = %p)", location, count, v);
5702 return error(GL_INVALID_VALUE);
5710 es2::Context *context = es2::getContext();
5714 es2::Program *program = context->getCurrentProgram();
5718 return error(GL_INVALID_OPERATION);
5721 if(!program->setUniform3iv(location, count, v))
5723 return error(GL_INVALID_OPERATION);
5728 void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5730 GLfloat xyzw[4] = {x, y, z, w};
5732 glUniform4fv(location, 1, (GLfloat*)&xyzw);
5735 void Uniform4fv(GLint location, GLsizei count, const GLfloat* v)
5737 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = %p)", location, count, v);
5741 return error(GL_INVALID_VALUE);
5749 es2::Context *context = es2::getContext();
5753 es2::Program *program = context->getCurrentProgram();
5757 return error(GL_INVALID_OPERATION);
5760 if(!program->setUniform4fv(location, count, v))
5762 return error(GL_INVALID_OPERATION);
5767 void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5769 GLint xyzw[4] = {x, y, z, w};
5771 glUniform4iv(location, 1, (GLint*)&xyzw);
5774 void Uniform4iv(GLint location, GLsizei count, const GLint* v)
5776 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = %p)", location, count, v);
5780 return error(GL_INVALID_VALUE);
5788 es2::Context *context = es2::getContext();
5792 es2::Program *program = context->getCurrentProgram();
5796 return error(GL_INVALID_OPERATION);
5799 if(!program->setUniform4iv(location, count, v))
5801 return error(GL_INVALID_OPERATION);
5806 void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5808 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",
5809 location, count, transpose, value);
5813 return error(GL_INVALID_VALUE);
5821 es2::Context *context = es2::getContext();
5825 if(context->getClientVersion() < 3 && transpose != GL_FALSE)
5827 return error(GL_INVALID_VALUE);
5830 es2::Program *program = context->getCurrentProgram();
5834 return error(GL_INVALID_OPERATION);
5837 if(!program->setUniformMatrix2fv(location, count, transpose, value))
5839 return error(GL_INVALID_OPERATION);
5844 void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5846 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",
5847 location, count, transpose, value);
5851 return error(GL_INVALID_VALUE);
5859 es2::Context *context = es2::getContext();
5863 if(context->getClientVersion() < 3 && transpose != GL_FALSE)
5865 return error(GL_INVALID_VALUE);
5868 es2::Program *program = context->getCurrentProgram();
5872 return error(GL_INVALID_OPERATION);
5875 if(!program->setUniformMatrix3fv(location, count, transpose, value))
5877 return error(GL_INVALID_OPERATION);
5882 void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5884 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",
5885 location, count, transpose, value);
5889 return error(GL_INVALID_VALUE);
5897 es2::Context *context = es2::getContext();
5901 if(context->getClientVersion() < 3 && transpose != GL_FALSE)
5903 return error(GL_INVALID_VALUE);
5906 es2::Program *program = context->getCurrentProgram();
5910 return error(GL_INVALID_OPERATION);
5913 if(!program->setUniformMatrix4fv(location, count, transpose, value))
5915 return error(GL_INVALID_OPERATION);
5920 void UseProgram(GLuint program)
5922 TRACE("(GLuint program = %d)", program);
5924 es2::Context *context = es2::getContext();
5928 es2::Program *programObject = context->getProgram(program);
5930 if(!programObject && program != 0)
5932 if(context->getShader(program))
5934 return error(GL_INVALID_OPERATION);
5938 return error(GL_INVALID_VALUE);
5942 if(program != 0 && !programObject->isLinked())
5944 return error(GL_INVALID_OPERATION);
5947 context->useProgram(program);
5951 void ValidateProgram(GLuint program)
5953 TRACE("(GLuint program = %d)", program);
5955 es2::Context *context = es2::getContext();
5959 es2::Program *programObject = context->getProgram(program);
5963 if(context->getShader(program))
5965 return error(GL_INVALID_OPERATION);
5969 return error(GL_INVALID_VALUE);
5973 programObject->validate(context->getDevice());
5977 void VertexAttrib1f(GLuint index, GLfloat x)
5979 TRACE("(GLuint index = %d, GLfloat x = %f)", index, x);
5981 if(index >= es2::MAX_VERTEX_ATTRIBS)
5983 return error(GL_INVALID_VALUE);
5986 es2::Context *context = es2::getContext();
5990 GLfloat vals[4] = { x, 0, 0, 1 };
5991 context->setVertexAttrib(index, vals);
5995 void VertexAttrib1fv(GLuint index, const GLfloat* values)
5997 TRACE("(GLuint index = %d, const GLfloat* values = %p)", index, values);
5999 if(index >= es2::MAX_VERTEX_ATTRIBS)
6001 return error(GL_INVALID_VALUE);
6004 es2::Context *context = es2::getContext();
6008 GLfloat vals[4] = { values[0], 0, 0, 1 };
6009 context->setVertexAttrib(index, vals);
6013 void VertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
6015 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
6017 if(index >= es2::MAX_VERTEX_ATTRIBS)
6019 return error(GL_INVALID_VALUE);
6022 es2::Context *context = es2::getContext();
6026 GLfloat vals[4] = { x, y, 0, 1 };
6027 context->setVertexAttrib(index, vals);
6031 void VertexAttrib2fv(GLuint index, const GLfloat* values)
6033 TRACE("(GLuint index = %d, const GLfloat* values = %p)", index, values);
6035 if(index >= es2::MAX_VERTEX_ATTRIBS)
6037 return error(GL_INVALID_VALUE);
6040 es2::Context *context = es2::getContext();
6044 GLfloat vals[4] = { values[0], values[1], 0, 1 };
6045 context->setVertexAttrib(index, vals);
6049 void VertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
6051 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
6053 if(index >= es2::MAX_VERTEX_ATTRIBS)
6055 return error(GL_INVALID_VALUE);
6058 es2::Context *context = es2::getContext();
6062 GLfloat vals[4] = { x, y, z, 1 };
6063 context->setVertexAttrib(index, vals);
6067 void VertexAttrib3fv(GLuint index, const GLfloat* values)
6069 TRACE("(GLuint index = %d, const GLfloat* values = %p)", index, values);
6071 if(index >= es2::MAX_VERTEX_ATTRIBS)
6073 return error(GL_INVALID_VALUE);
6076 es2::Context *context = es2::getContext();
6080 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
6081 context->setVertexAttrib(index, vals);
6085 void VertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6087 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
6089 if(index >= es2::MAX_VERTEX_ATTRIBS)
6091 return error(GL_INVALID_VALUE);
6094 es2::Context *context = es2::getContext();
6098 GLfloat vals[4] = { x, y, z, w };
6099 context->setVertexAttrib(index, vals);
6103 void VertexAttrib4fv(GLuint index, const GLfloat* values)
6105 TRACE("(GLuint index = %d, const GLfloat* values = %p)", index, values);
6107 if(index >= es2::MAX_VERTEX_ATTRIBS)
6109 return error(GL_INVALID_VALUE);
6112 es2::Context *context = es2::getContext();
6116 context->setVertexAttrib(index, values);
6120 void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
6122 TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
6123 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = %p)",
6124 index, size, type, normalized, stride, ptr);
6126 if(index >= es2::MAX_VERTEX_ATTRIBS)
6128 return error(GL_INVALID_VALUE);
6131 if(size < 1 || size > 4)
6133 return error(GL_INVALID_VALUE);
6136 GLint clientVersion = egl::getClientVersion();
6141 case GL_UNSIGNED_BYTE:
6143 case GL_UNSIGNED_SHORT:
6147 case GL_INT_2_10_10_10_REV:
6148 case GL_UNSIGNED_INT_2_10_10_10_REV:
6149 if(clientVersion >= 3)
6153 return error(GL_INVALID_OPERATION);
6157 else return error(GL_INVALID_ENUM);
6159 case GL_UNSIGNED_INT:
6161 if(clientVersion >= 3)
6165 else return error(GL_INVALID_ENUM);
6167 return error(GL_INVALID_ENUM);
6172 return error(GL_INVALID_VALUE);
6175 es2::Context *context = es2::getContext();
6179 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
6183 void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
6185 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
6187 if(width < 0 || height < 0)
6189 return error(GL_INVALID_VALUE);
6192 es2::Context *context = es2::getContext();
6196 context->setViewportParams(x, y, width, height);
6200 static void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter, bool allowPartialDepthStencilBlit)
6202 TRACE("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
6203 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
6204 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6205 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6212 return error(GL_INVALID_ENUM);
6215 if((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
6217 return error(GL_INVALID_VALUE);
6220 es2::Context *context = es2::getContext();
6224 if(context->getReadFramebufferName() == context->getDrawFramebufferName())
6226 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
6227 return error(GL_INVALID_OPERATION);
6230 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, false, allowPartialDepthStencilBlit);
6234 void BlitFramebufferNV(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6236 BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter, true);
6239 void BlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
6240 GLbitfield mask, GLenum filter)
6242 if(srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
6244 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
6245 return error(GL_INVALID_OPERATION);
6248 BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter, false);
6251 void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
6252 GLint border, GLenum format, GLenum type, const GLvoid* data)
6254 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
6255 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
6256 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* data = %p)",
6257 target, level, internalformat, width, height, depth, border, format, type, data);
6261 case GL_TEXTURE_3D_OES:
6264 case GL_DEPTH_COMPONENT:
6265 case GL_DEPTH_STENCIL_OES:
6266 return error(GL_INVALID_OPERATION);
6272 return error(GL_INVALID_ENUM);
6275 if(!ValidateTextureFormatType(format, type, internalformat, egl::getClientVersion()))
6280 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
6282 return error(GL_INVALID_VALUE);
6285 const GLsizei maxSize3D = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level;
6286 if((width < 0) || (height < 0) || (depth < 0) || (width > maxSize3D) || (height > maxSize3D) || (depth > maxSize3D))
6288 return error(GL_INVALID_VALUE);
6293 return error(GL_INVALID_VALUE);
6296 es2::Context *context = es2::getContext();
6300 es2::Texture3D *texture = context->getTexture3D();
6304 return error(GL_INVALID_OPERATION);
6307 texture->setImage(context, level, width, height, depth, GetSizedInternalFormat(internalformat, type), type, context->getUnpackInfo(), context->getPixels(data));
6311 void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data)
6313 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6314 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6315 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* data = %p)",
6316 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
6320 case GL_TEXTURE_3D_OES:
6323 return error(GL_INVALID_ENUM);
6326 if(!ValidateTextureFormatType(format, type, format, egl::getClientVersion()))
6331 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
6333 return error(GL_INVALID_VALUE);
6336 if((width < 0) || (height < 0) || (depth < 0))
6338 return error(GL_INVALID_VALUE);
6341 es2::Context *context = es2::getContext();
6345 es2::Texture3D *texture = context->getTexture3D();
6347 GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);
6349 GLenum validationError = ValidateSubImageParams(false, width, height, depth, xoffset, yoffset, zoffset, target, level, sizedInternalFormat, texture);
6350 if(validationError == GL_NONE)
6352 texture->subImage(context, level, xoffset, yoffset, zoffset, width, height, depth, sizedInternalFormat, type, context->getUnpackInfo(), context->getPixels(data));
6356 return error(validationError);
6361 void CopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6363 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6364 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6365 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6369 case GL_TEXTURE_3D_OES:
6372 return error(GL_INVALID_ENUM);
6375 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
6377 return error(GL_INVALID_VALUE);
6380 es2::Context *context = es2::getContext();
6384 es2::Framebuffer *framebuffer = context->getReadFramebuffer();
6386 if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
6388 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
6391 es2::Renderbuffer *source = framebuffer->getReadColorbuffer();
6393 if(context->getReadFramebufferName() != 0 && (!source || source->getSamples() > 1))
6395 return error(GL_INVALID_OPERATION);
6398 es2::Texture3D *texture = context->getTexture3D();
6400 GLenum validationError = ValidateSubImageParams(false, width, height, 1, xoffset, yoffset, zoffset, target, level, GL_NONE, texture);
6402 if(validationError != GL_NONE)
6404 return error(validationError);
6407 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6411 void CompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
6413 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
6414 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = %p)",
6415 target, level, internalformat, width, height, depth, border, imageSize, data);
6419 case GL_TEXTURE_3D_OES:
6422 return error(GL_INVALID_ENUM);
6425 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
6427 return error(GL_INVALID_VALUE);
6430 const GLsizei maxSize3D = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level;
6431 if((width < 0) || (height < 0) || (depth < 0) || (width > maxSize3D) || (height > maxSize3D) || (depth > maxSize3D) ||(border != 0) || (imageSize < 0))
6433 return error(GL_INVALID_VALUE);
6436 switch(internalformat)
6438 case GL_DEPTH_COMPONENT:
6439 case GL_DEPTH_COMPONENT16:
6440 case GL_DEPTH_COMPONENT32_OES:
6441 case GL_DEPTH_STENCIL_OES:
6442 case GL_DEPTH24_STENCIL8_OES:
6443 return error(GL_INVALID_OPERATION);
6446 GLenum validationError = ValidateCompressedFormat(internalformat, egl::getClientVersion(), true);
6447 if(validationError != GL_NONE)
6449 return error(validationError);
6454 if(imageSize != egl::ComputeCompressedSize(width, height, internalformat) * depth)
6456 return error(GL_INVALID_VALUE);
6459 es2::Context *context = es2::getContext();
6463 es2::Texture3D *texture = context->getTexture3D();
6467 return error(GL_INVALID_OPERATION);
6470 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6474 void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data)
6476 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6477 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6478 "GLenum format = 0x%X, GLsizei imageSize = %d, const void *data = %p)",
6479 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6483 case GL_TEXTURE_3D_OES:
6486 return error(GL_INVALID_ENUM);
6489 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
6491 return error(GL_INVALID_VALUE);
6494 if(xoffset < 0 || yoffset < 0 || zoffset < 0 || !validImageSize(level, width, height) || depth < 0 || imageSize < 0)
6496 return error(GL_INVALID_VALUE);
6499 GLenum validationError = ValidateCompressedFormat(format, egl::getClientVersion(), true);
6500 if(validationError != GL_NONE)
6502 return error(validationError);
6505 if(width == 0 || height == 0 || depth == 0 || !data)
6510 es2::Context *context = es2::getContext();
6514 es2::Texture3D *texture = context->getTexture3D();
6518 return error(GL_INVALID_OPERATION);
6521 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, context->getPixels(data));
6525 void FramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
6527 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
6528 "GLuint texture = %d, GLint level = %d, GLint zoffset = %d)", target, attachment, textarget, texture, level, zoffset);
6530 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
6532 return error(GL_INVALID_ENUM);
6535 es2::Context *context = es2::getContext();
6541 textarget = GL_NONE;
6545 es2::Texture *tex = context->getTexture(texture);
6549 return error(GL_INVALID_OPERATION);
6552 if(tex->isCompressed(textarget, level))
6554 return error(GL_INVALID_OPERATION);
6559 case GL_TEXTURE_3D_OES:
6560 if(tex->getTarget() != GL_TEXTURE_3D_OES)
6562 return error(GL_INVALID_OPERATION);
6566 return error(GL_INVALID_ENUM);
6571 return error(GL_INVALID_VALUE);
6575 es2::Framebuffer *framebuffer = nullptr;
6576 GLuint framebufferName = 0;
6577 if(target == GL_READ_FRAMEBUFFER_ANGLE)
6579 framebuffer = context->getReadFramebuffer();
6580 framebufferName = context->getReadFramebufferName();
6584 framebuffer = context->getDrawFramebuffer();
6585 framebufferName = context->getDrawFramebufferName();
6588 if(framebufferName == 0 || !framebuffer)
6590 return error(GL_INVALID_OPERATION);
6593 GLint clientVersion = context->getClientVersion();
6597 case GL_COLOR_ATTACHMENT1:
6598 case GL_COLOR_ATTACHMENT2:
6599 case GL_COLOR_ATTACHMENT3:
6600 case GL_COLOR_ATTACHMENT4:
6601 case GL_COLOR_ATTACHMENT5:
6602 case GL_COLOR_ATTACHMENT6:
6603 case GL_COLOR_ATTACHMENT7:
6604 case GL_COLOR_ATTACHMENT8:
6605 case GL_COLOR_ATTACHMENT9:
6606 case GL_COLOR_ATTACHMENT10:
6607 case GL_COLOR_ATTACHMENT11:
6608 case GL_COLOR_ATTACHMENT12:
6609 case GL_COLOR_ATTACHMENT13:
6610 case GL_COLOR_ATTACHMENT14:
6611 case GL_COLOR_ATTACHMENT15:
6612 case GL_COLOR_ATTACHMENT16:
6613 case GL_COLOR_ATTACHMENT17:
6614 case GL_COLOR_ATTACHMENT18:
6615 case GL_COLOR_ATTACHMENT19:
6616 case GL_COLOR_ATTACHMENT20:
6617 case GL_COLOR_ATTACHMENT21:
6618 case GL_COLOR_ATTACHMENT22:
6619 case GL_COLOR_ATTACHMENT23:
6620 case GL_COLOR_ATTACHMENT24:
6621 case GL_COLOR_ATTACHMENT25:
6622 case GL_COLOR_ATTACHMENT26:
6623 case GL_COLOR_ATTACHMENT27:
6624 case GL_COLOR_ATTACHMENT28:
6625 case GL_COLOR_ATTACHMENT29:
6626 case GL_COLOR_ATTACHMENT30:
6627 case GL_COLOR_ATTACHMENT31:
6628 if(clientVersion < 3)
6630 return error(GL_INVALID_ENUM);
6633 case GL_COLOR_ATTACHMENT0:
6634 if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
6636 return error(GL_INVALID_ENUM);
6638 framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0);
6640 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
6641 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
6643 return error(GL_INVALID_ENUM);
6648 void EGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
6650 if(egl::getClientVersion() == 1)
6652 return libGLES_CM->glEGLImageTargetTexture2DOES(target, image);
6655 TRACE("(GLenum target = 0x%X, GLeglImageOES image = %p)", target, image);
6660 case GL_TEXTURE_EXTERNAL_OES:
6663 return error(GL_INVALID_ENUM);
6666 es2::Context *context = es2::getContext();
6670 es2::Texture2D *texture = nullptr;
6674 case GL_TEXTURE_2D: texture = context->getTexture2D(); break;
6675 case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break;
6676 default: UNREACHABLE(target);
6681 return error(GL_INVALID_OPERATION);
6684 egl::Image *eglImage = context->getSharedImage(image);
6688 return error(GL_INVALID_OPERATION);
6691 texture->setSharedImage(eglImage);
6695 void EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
6697 TRACE("(GLenum target = 0x%X, GLeglImageOES image = %p)", target, image);
6702 GLboolean IsRenderbufferOES(GLuint renderbuffer)
6704 return IsRenderbuffer(renderbuffer);
6707 void BindRenderbufferOES(GLenum target, GLuint renderbuffer)
6709 BindRenderbuffer(target, renderbuffer);
6712 void DeleteRenderbuffersOES(GLsizei n, const GLuint* renderbuffers)
6714 DeleteRenderbuffers(n, renderbuffers);
6717 void GenRenderbuffersOES(GLsizei n, GLuint* renderbuffers)
6719 GenRenderbuffers(n, renderbuffers);
6722 void RenderbufferStorageOES(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
6724 RenderbufferStorage(target, internalformat, width, height);
6727 void GetRenderbufferParameterivOES(GLenum target, GLenum pname, GLint* params)
6729 GetRenderbufferParameteriv(target, pname, params);
6732 GLboolean IsFramebufferOES(GLuint framebuffer)
6734 return IsFramebuffer(framebuffer);
6737 void BindFramebufferOES(GLenum target, GLuint framebuffer)
6739 BindFramebuffer(target, framebuffer);
6742 void DeleteFramebuffersOES(GLsizei n, const GLuint* framebuffers)
6744 DeleteFramebuffers(n, framebuffers);
6747 void GenFramebuffersOES(GLsizei n, GLuint* framebuffers)
6749 GenFramebuffers(n, framebuffers);
6752 GLenum CheckFramebufferStatusOES(GLenum target)
6754 return CheckFramebufferStatus(target);
6757 void FramebufferRenderbufferOES(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
6759 FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
6762 void FramebufferTexture2DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
6764 FramebufferTexture2D(target, attachment, textarget, texture, level);
6767 void GetFramebufferAttachmentParameterivOES(GLenum target, GLenum attachment, GLenum pname, GLint* params)
6769 GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
6772 void GenerateMipmapOES(GLenum target)
6774 GenerateMipmap(target);
6777 void DrawBuffersEXT(GLsizei n, const GLenum *bufs)
6779 TRACE("(GLsizei n = %d, const GLenum *bufs = %p)", n, bufs);
6781 if(n < 0 || n > MAX_DRAW_BUFFERS)
6783 return error(GL_INVALID_VALUE);
6786 es2::Context *context = es2::getContext();
6790 GLuint drawFramebufferName = context->getDrawFramebufferName();
6792 if((drawFramebufferName == 0) && (n != 1))
6794 return error(GL_INVALID_OPERATION);
6797 for(unsigned int i = 0; i < (unsigned)n; i++)
6802 if(drawFramebufferName != 0)
6804 return error(GL_INVALID_OPERATION);
6809 case GL_COLOR_ATTACHMENT0_EXT:
6810 case GL_COLOR_ATTACHMENT1_EXT:
6811 case GL_COLOR_ATTACHMENT2_EXT:
6812 case GL_COLOR_ATTACHMENT3_EXT:
6813 case GL_COLOR_ATTACHMENT4_EXT:
6814 case GL_COLOR_ATTACHMENT5_EXT:
6815 case GL_COLOR_ATTACHMENT6_EXT:
6816 case GL_COLOR_ATTACHMENT7_EXT:
6817 case GL_COLOR_ATTACHMENT8_EXT:
6818 case GL_COLOR_ATTACHMENT9_EXT:
6819 case GL_COLOR_ATTACHMENT10_EXT:
6820 case GL_COLOR_ATTACHMENT11_EXT:
6821 case GL_COLOR_ATTACHMENT12_EXT:
6822 case GL_COLOR_ATTACHMENT13_EXT:
6823 case GL_COLOR_ATTACHMENT14_EXT:
6824 case GL_COLOR_ATTACHMENT15_EXT:
6826 GLuint index = (bufs[i] - GL_COLOR_ATTACHMENT0_EXT);
6828 if(index >= MAX_COLOR_ATTACHMENTS)
6830 return error(GL_INVALID_OPERATION);
6835 return error(GL_INVALID_OPERATION);
6838 if(drawFramebufferName == 0)
6840 return error(GL_INVALID_OPERATION);
6845 return error(GL_INVALID_ENUM);
6849 context->setFramebufferDrawBuffers(n, bufs);
6855 extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname)
6860 __eglMustCastToProperFunctionPointerType address;
6863 static const Extension glExtensions[] =
6865 #define EXTENSION(name) {#name, (__eglMustCastToProperFunctionPointerType)name}
6867 EXTENSION(glTexImage3DOES),
6868 EXTENSION(glBlitFramebufferANGLE),
6869 EXTENSION(glBlitFramebufferNV),
6870 EXTENSION(glRenderbufferStorageMultisampleANGLE),
6871 EXTENSION(glDeleteFencesNV),
6872 EXTENSION(glGenFencesNV),
6873 EXTENSION(glIsFenceNV),
6874 EXTENSION(glTestFenceNV),
6875 EXTENSION(glGetFenceivNV),
6876 EXTENSION(glFinishFenceNV),
6877 EXTENSION(glSetFenceNV),
6878 EXTENSION(glGetGraphicsResetStatusEXT),
6879 EXTENSION(glReadnPixelsEXT),
6880 EXTENSION(glGetnUniformfvEXT),
6881 EXTENSION(glGetnUniformivEXT),
6882 EXTENSION(glGenQueriesEXT),
6883 EXTENSION(glDeleteQueriesEXT),
6884 EXTENSION(glIsQueryEXT),
6885 EXTENSION(glBeginQueryEXT),
6886 EXTENSION(glEndQueryEXT),
6887 EXTENSION(glGetQueryivEXT),
6888 EXTENSION(glGetQueryObjectuivEXT),
6889 EXTENSION(glEGLImageTargetTexture2DOES),
6890 EXTENSION(glEGLImageTargetRenderbufferStorageOES),
6891 EXTENSION(glDrawElementsInstancedEXT),
6892 EXTENSION(glDrawArraysInstancedEXT),
6893 EXTENSION(glVertexAttribDivisorEXT),
6894 EXTENSION(glDrawArraysInstancedANGLE),
6895 EXTENSION(glDrawElementsInstancedANGLE),
6896 EXTENSION(glVertexAttribDivisorANGLE),
6897 EXTENSION(glIsRenderbufferOES),
6898 EXTENSION(glBindRenderbufferOES),
6899 EXTENSION(glDeleteRenderbuffersOES),
6900 EXTENSION(glGenRenderbuffersOES),
6901 EXTENSION(glRenderbufferStorageOES),
6902 EXTENSION(glGetRenderbufferParameterivOES),
6903 EXTENSION(glIsFramebufferOES),
6904 EXTENSION(glBindFramebufferOES),
6905 EXTENSION(glDeleteFramebuffersOES),
6906 EXTENSION(glGenFramebuffersOES),
6907 EXTENSION(glCheckFramebufferStatusOES),
6908 EXTENSION(glFramebufferRenderbufferOES),
6909 EXTENSION(glFramebufferTexture2DOES),
6910 EXTENSION(glGetFramebufferAttachmentParameterivOES),
6911 EXTENSION(glGenerateMipmapOES),
6912 EXTENSION(glDrawBuffersEXT),
6917 for(unsigned int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
6919 if(strcmp(procname, glExtensions[ext].name) == 0)
6921 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;