1 // SwiftShader Software Renderer
\r
3 // Copyright(c) 2005-2013 TransGaming Inc.
\r
5 // All rights reserved. No part of this software may be copied, distributed, transmitted,
\r
6 // transcribed, stored in a retrieval system, translated into any human or computer
\r
7 // language by any means, or disclosed to third parties without the explicit written
\r
8 // agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
\r
9 // or implied, including but not limited to any patent rights, are granted to you.
\r
11 // libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
\r
14 #include "mathutil.h"
\r
15 #include "utilities.h"
\r
17 #include "Context.h"
\r
19 #include "Framebuffer.h"
\r
20 #include "Program.h"
\r
21 #include "Renderbuffer.h"
\r
23 #include "Texture.h"
\r
25 #include "common/debug.h"
\r
26 #include "Common/Version.h"
\r
28 #include <GLES2/gl2.h>
\r
29 #include <GLES2/gl2ext.h>
\r
30 #include <GLES3/gl3.h>
\r
35 #include <cutils/log.h>
\r
41 static bool validImageSize(GLint level, GLsizei width, GLsizei height)
\r
43 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS || width < 0 || height < 0)
\r
51 static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFormat)
\r
53 GLenum validationError = ValidateCompressedFormat(textureFormat, egl::getClientVersion(), false);
\r
54 if(validationError != GL_NONE)
\r
56 return error(validationError, false);
\r
59 // [OpenGL ES 2.0.24] table 3.9
\r
60 switch(textureFormat)
\r
63 if(colorbufferFormat != GL_ALPHA &&
\r
64 colorbufferFormat != GL_RGBA &&
\r
65 colorbufferFormat != GL_RGBA4 &&
\r
66 colorbufferFormat != GL_RGB5_A1 &&
\r
67 colorbufferFormat != GL_RGBA8_OES &&
\r
68 colorbufferFormat != GL_RGBA16F_EXT &&
\r
69 colorbufferFormat != GL_RGBA32F_EXT)
\r
71 return error(GL_INVALID_OPERATION, false);
\r
76 if(colorbufferFormat != GL_RGB &&
\r
77 colorbufferFormat != GL_RGB565 &&
\r
78 colorbufferFormat != GL_RGB8_OES &&
\r
79 colorbufferFormat != GL_RGBA &&
\r
80 colorbufferFormat != GL_RGBA4 &&
\r
81 colorbufferFormat != GL_RGB5_A1 &&
\r
82 colorbufferFormat != GL_RGBA8_OES &&
\r
83 colorbufferFormat != GL_RGB16F_EXT &&
\r
84 colorbufferFormat != GL_RGB32F_EXT &&
\r
85 colorbufferFormat != GL_RGBA16F_EXT &&
\r
86 colorbufferFormat != GL_RGBA32F_EXT)
\r
88 return error(GL_INVALID_OPERATION, false);
\r
91 case GL_LUMINANCE_ALPHA:
\r
93 if(colorbufferFormat != GL_RGBA &&
\r
94 colorbufferFormat != GL_RGBA4 &&
\r
95 colorbufferFormat != GL_RGB5_A1 &&
\r
96 colorbufferFormat != GL_RGBA8_OES &&
\r
97 colorbufferFormat != GL_RGBA16F_EXT &&
\r
98 colorbufferFormat != GL_RGBA32F_EXT)
\r
100 return error(GL_INVALID_OPERATION, false);
\r
103 case GL_DEPTH_COMPONENT:
\r
104 case GL_DEPTH_STENCIL_OES:
\r
105 return error(GL_INVALID_OPERATION, false);
\r
107 return error(GL_INVALID_ENUM, false);
\r
112 void ActiveTexture(GLenum texture)
\r
114 TRACE("(GLenum texture = 0x%X)", texture);
\r
116 es2::Context *context = es2::getContext();
\r
120 if(texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + es2::MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
\r
122 return error(GL_INVALID_ENUM);
\r
125 context->setActiveSampler(texture - GL_TEXTURE0);
\r
129 void AttachShader(GLuint program, GLuint shader)
\r
131 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
\r
133 es2::Context *context = es2::getContext();
\r
137 es2::Program *programObject = context->getProgram(program);
\r
138 es2::Shader *shaderObject = context->getShader(shader);
\r
142 if(context->getShader(program))
\r
144 return error(GL_INVALID_OPERATION);
\r
148 return error(GL_INVALID_VALUE);
\r
154 if(context->getProgram(shader))
\r
156 return error(GL_INVALID_OPERATION);
\r
160 return error(GL_INVALID_VALUE);
\r
164 if(!programObject->attachShader(shaderObject))
\r
166 return error(GL_INVALID_OPERATION);
\r
171 void BeginQueryEXT(GLenum target, GLuint name)
\r
173 TRACE("(GLenum target = 0x%X, GLuint name = %d)", target, name);
\r
177 case GL_ANY_SAMPLES_PASSED_EXT:
\r
178 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
\r
181 return error(GL_INVALID_ENUM);
\r
186 return error(GL_INVALID_OPERATION);
\r
189 es2::Context *context = es2::getContext();
\r
193 context->beginQuery(target, name);
\r
197 void BindAttribLocation(GLuint program, GLuint index, const GLchar* name)
\r
199 TRACE("(GLuint program = %d, GLuint index = %d, const GLchar* name = %s)", program, index, name);
\r
201 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
203 return error(GL_INVALID_VALUE);
\r
206 es2::Context *context = es2::getContext();
\r
210 es2::Program *programObject = context->getProgram(program);
\r
214 if(context->getShader(program))
\r
216 return error(GL_INVALID_OPERATION);
\r
220 return error(GL_INVALID_VALUE);
\r
224 if(strncmp(name, "gl_", 3) == 0)
\r
226 return error(GL_INVALID_OPERATION);
\r
229 programObject->bindAttributeLocation(index, name);
\r
233 void BindBuffer(GLenum target, GLuint buffer)
\r
235 TRACE("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
\r
237 es2::Context *context = es2::getContext();
\r
241 GLint clientVersion = egl::getClientVersion();
\r
245 case GL_ARRAY_BUFFER:
\r
246 context->bindArrayBuffer(buffer);
\r
248 case GL_ELEMENT_ARRAY_BUFFER:
\r
249 context->bindElementArrayBuffer(buffer);
\r
251 case GL_COPY_READ_BUFFER:
\r
252 if(clientVersion >= 3)
\r
254 context->bindCopyReadBuffer(buffer);
\r
257 else return error(GL_INVALID_ENUM);
\r
258 case GL_COPY_WRITE_BUFFER:
\r
259 if(clientVersion >= 3)
\r
261 context->bindCopyWriteBuffer(buffer);
\r
264 else return error(GL_INVALID_ENUM);
\r
265 case GL_PIXEL_PACK_BUFFER:
\r
266 if(clientVersion >= 3)
\r
268 context->bindPixelPackBuffer(buffer);
\r
271 else return error(GL_INVALID_ENUM);
\r
272 case GL_PIXEL_UNPACK_BUFFER:
\r
273 if(clientVersion >= 3)
\r
275 context->bindPixelUnpackBuffer(buffer);
\r
278 else return error(GL_INVALID_ENUM);
\r
279 case GL_TRANSFORM_FEEDBACK_BUFFER:
\r
280 if(clientVersion >= 3)
\r
282 context->bindTransformFeedbackBuffer(buffer);
\r
285 else return error(GL_INVALID_ENUM);
\r
286 case GL_UNIFORM_BUFFER:
\r
287 if(clientVersion >= 3)
\r
289 context->bindGenericUniformBuffer(buffer);
\r
292 else return error(GL_INVALID_ENUM);
\r
294 return error(GL_INVALID_ENUM);
\r
299 void BindFramebuffer(GLenum target, GLuint framebuffer)
\r
301 TRACE("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
\r
303 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
\r
305 return error(GL_INVALID_ENUM);
\r
308 es2::Context *context = es2::getContext();
\r
312 if(target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
\r
314 context->bindReadFramebuffer(framebuffer);
\r
317 if(target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
\r
319 context->bindDrawFramebuffer(framebuffer);
\r
324 void BindRenderbuffer(GLenum target, GLuint renderbuffer)
\r
326 TRACE("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
\r
328 if(target != GL_RENDERBUFFER)
\r
330 return error(GL_INVALID_ENUM);
\r
333 es2::Context *context = es2::getContext();
\r
337 // [OpenGL ES 2.0.25] Section 4.4.3 page 110
\r
338 // [OpenGL ES 3.0.4] Section 4.4.2 page 204
\r
339 // If renderbuffer is not zero, then the resulting renderbuffer object
\r
340 // is a new state vector, initialized with a zero-sized memory buffer.
\r
341 context->bindRenderbuffer(renderbuffer);
\r
345 void BindTexture(GLenum target, GLuint texture)
\r
347 TRACE("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
\r
349 es2::Context *context = es2::getContext();
\r
353 es2::Texture *textureObject = context->getTexture(texture);
\r
355 if(textureObject && textureObject->getTarget() != target && texture != 0)
\r
357 return error(GL_INVALID_OPERATION);
\r
360 GLint clientVersion = context->getClientVersion();
\r
364 case GL_TEXTURE_2D:
\r
365 context->bindTexture2D(texture);
\r
367 case GL_TEXTURE_CUBE_MAP:
\r
368 context->bindTextureCubeMap(texture);
\r
370 case GL_TEXTURE_EXTERNAL_OES:
\r
371 context->bindTextureExternal(texture);
\r
373 case GL_TEXTURE_2D_ARRAY:
\r
374 if(clientVersion < 3)
\r
376 return error(GL_INVALID_ENUM);
\r
378 context->bindTexture2DArray(texture);
\r
380 case GL_TEXTURE_3D_OES:
\r
381 context->bindTexture3D(texture);
\r
384 return error(GL_INVALID_ENUM);
\r
389 void BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
\r
391 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
\r
392 red, green, blue, alpha);
\r
394 es2::Context* context = es2::getContext();
\r
398 context->setBlendColor(es2::clamp01(red), es2::clamp01(green), es2::clamp01(blue), es2::clamp01(alpha));
\r
402 void BlendEquation(GLenum mode)
\r
404 glBlendEquationSeparate(mode, mode);
\r
407 void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
\r
409 TRACE("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
\r
414 case GL_FUNC_SUBTRACT:
\r
415 case GL_FUNC_REVERSE_SUBTRACT:
\r
420 return error(GL_INVALID_ENUM);
\r
426 case GL_FUNC_SUBTRACT:
\r
427 case GL_FUNC_REVERSE_SUBTRACT:
\r
432 return error(GL_INVALID_ENUM);
\r
435 es2::Context *context = es2::getContext();
\r
439 context->setBlendEquation(modeRGB, modeAlpha);
\r
443 void BlendFunc(GLenum sfactor, GLenum dfactor)
\r
445 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
\r
448 void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
\r
450 TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
\r
451 srcRGB, dstRGB, srcAlpha, dstAlpha);
\r
453 GLint clientVersion = egl::getClientVersion();
\r
460 case GL_ONE_MINUS_SRC_COLOR:
\r
462 case GL_ONE_MINUS_DST_COLOR:
\r
464 case GL_ONE_MINUS_SRC_ALPHA:
\r
466 case GL_ONE_MINUS_DST_ALPHA:
\r
467 case GL_CONSTANT_COLOR:
\r
468 case GL_ONE_MINUS_CONSTANT_COLOR:
\r
469 case GL_CONSTANT_ALPHA:
\r
470 case GL_ONE_MINUS_CONSTANT_ALPHA:
\r
471 case GL_SRC_ALPHA_SATURATE:
\r
474 return error(GL_INVALID_ENUM);
\r
482 case GL_ONE_MINUS_SRC_COLOR:
\r
484 case GL_ONE_MINUS_DST_COLOR:
\r
486 case GL_ONE_MINUS_SRC_ALPHA:
\r
488 case GL_ONE_MINUS_DST_ALPHA:
\r
489 case GL_CONSTANT_COLOR:
\r
490 case GL_ONE_MINUS_CONSTANT_COLOR:
\r
491 case GL_CONSTANT_ALPHA:
\r
492 case GL_ONE_MINUS_CONSTANT_ALPHA:
\r
494 case GL_SRC_ALPHA_SATURATE:
\r
495 if(clientVersion < 3)
\r
497 return error(GL_INVALID_ENUM);
\r
501 return error(GL_INVALID_ENUM);
\r
509 case GL_ONE_MINUS_SRC_COLOR:
\r
511 case GL_ONE_MINUS_DST_COLOR:
\r
513 case GL_ONE_MINUS_SRC_ALPHA:
\r
515 case GL_ONE_MINUS_DST_ALPHA:
\r
516 case GL_CONSTANT_COLOR:
\r
517 case GL_ONE_MINUS_CONSTANT_COLOR:
\r
518 case GL_CONSTANT_ALPHA:
\r
519 case GL_ONE_MINUS_CONSTANT_ALPHA:
\r
520 case GL_SRC_ALPHA_SATURATE:
\r
523 return error(GL_INVALID_ENUM);
\r
531 case GL_ONE_MINUS_SRC_COLOR:
\r
533 case GL_ONE_MINUS_DST_COLOR:
\r
535 case GL_ONE_MINUS_SRC_ALPHA:
\r
537 case GL_ONE_MINUS_DST_ALPHA:
\r
538 case GL_CONSTANT_COLOR:
\r
539 case GL_ONE_MINUS_CONSTANT_COLOR:
\r
540 case GL_CONSTANT_ALPHA:
\r
541 case GL_ONE_MINUS_CONSTANT_ALPHA:
\r
543 case GL_SRC_ALPHA_SATURATE:
\r
544 if(clientVersion < 3)
\r
546 return error(GL_INVALID_ENUM);
\r
550 return error(GL_INVALID_ENUM);
\r
553 es2::Context *context = es2::getContext();
\r
557 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
\r
561 void BufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
\r
563 size = static_cast<GLint>(size); // Work around issues with some 64-bit applications
\r
565 TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = %p, GLenum usage = %d)",
\r
566 target, size, data, usage);
\r
570 return error(GL_INVALID_VALUE);
\r
573 GLint clientVersion = egl::getClientVersion();
\r
577 case GL_STREAM_DRAW:
\r
578 case GL_STATIC_DRAW:
\r
579 case GL_DYNAMIC_DRAW:
\r
581 case GL_STREAM_READ:
\r
582 case GL_STREAM_COPY:
\r
583 case GL_STATIC_READ:
\r
584 case GL_STATIC_COPY:
\r
585 case GL_DYNAMIC_READ:
\r
586 case GL_DYNAMIC_COPY:
\r
587 if(clientVersion < 3)
\r
589 return error(GL_INVALID_ENUM);
\r
593 return error(GL_INVALID_ENUM);
\r
596 es2::Context *context = es2::getContext();
\r
600 es2::Buffer *buffer = nullptr;
\r
601 if(!context->getBuffer(target, &buffer))
\r
603 return error(GL_INVALID_ENUM);
\r
608 // A null buffer means that "0" is bound to the requested buffer target
\r
609 return error(GL_INVALID_OPERATION);
\r
612 buffer->bufferData(data, size, usage);
\r
616 void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
\r
618 size = static_cast<GLint>(size); // Work around issues with some 64-bit applications
\r
619 offset = static_cast<GLint>(offset);
\r
621 TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = %p)",
\r
622 target, offset, size, data);
\r
624 if(size < 0 || offset < 0)
\r
626 return error(GL_INVALID_VALUE);
\r
629 es2::Context *context = es2::getContext();
\r
633 es2::Buffer *buffer = nullptr;
\r
634 if(!context->getBuffer(target, &buffer))
\r
636 return error(GL_INVALID_ENUM);
\r
641 // A null buffer means that "0" is bound to the requested buffer target
\r
642 return error(GL_INVALID_OPERATION);
\r
645 if((size_t)size + offset > buffer->size())
\r
647 return error(GL_INVALID_VALUE);
\r
650 buffer->bufferSubData(data, size, offset);
\r
654 GLenum CheckFramebufferStatus(GLenum target)
\r
656 TRACE("(GLenum target = 0x%X)", target);
\r
658 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
\r
660 return error(GL_INVALID_ENUM, 0);
\r
663 es2::Context *context = es2::getContext();
\r
667 es2::Framebuffer *framebuffer = NULL;
\r
668 if(target == GL_READ_FRAMEBUFFER_ANGLE)
\r
670 framebuffer = context->getReadFramebuffer();
\r
674 framebuffer = context->getDrawFramebuffer();
\r
677 return framebuffer->completeness();
\r
683 void Clear(GLbitfield mask)
\r
685 TRACE("(GLbitfield mask = %X)", mask);
\r
687 if((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
\r
689 return error(GL_INVALID_VALUE);
\r
692 es2::Context *context = es2::getContext();
\r
696 context->clear(mask);
\r
700 void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
\r
702 TRACE("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
\r
703 red, green, blue, alpha);
\r
705 es2::Context *context = es2::getContext();
\r
709 context->setClearColor(red, green, blue, alpha);
\r
713 void ClearDepthf(GLclampf depth)
\r
715 TRACE("(GLclampf depth = %f)", depth);
\r
717 es2::Context *context = es2::getContext();
\r
721 context->setClearDepth(depth);
\r
725 void ClearStencil(GLint s)
\r
727 TRACE("(GLint s = %d)", s);
\r
729 es2::Context *context = es2::getContext();
\r
733 context->setClearStencil(s);
\r
737 void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
\r
739 TRACE("(GLboolean red = %d, GLboolean green = %d, GLboolean blue = %d, GLboolean alpha = %d)",
\r
740 red, green, blue, alpha);
\r
742 es2::Context *context = es2::getContext();
\r
746 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
\r
750 void CompileShader(GLuint shader)
\r
752 TRACE("(GLuint shader = %d)", shader);
\r
754 es2::Context *context = es2::getContext();
\r
758 es2::Shader *shaderObject = context->getShader(shader);
\r
762 if(context->getProgram(shader))
\r
764 return error(GL_INVALID_OPERATION);
\r
768 return error(GL_INVALID_VALUE);
\r
772 shaderObject->compile();
\r
776 void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
\r
777 GLint border, GLsizei imageSize, const GLvoid* data)
\r
779 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
\r
780 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = %p)",
\r
781 target, level, internalformat, width, height, border, imageSize, data);
\r
783 if(!validImageSize(level, width, height) || border != 0 || imageSize < 0)
\r
785 return error(GL_INVALID_VALUE);
\r
788 switch(internalformat)
\r
790 case GL_DEPTH_COMPONENT:
\r
791 case GL_DEPTH_COMPONENT16:
\r
792 case GL_DEPTH_COMPONENT32_OES:
\r
793 case GL_DEPTH_STENCIL_OES:
\r
794 case GL_DEPTH24_STENCIL8_OES:
\r
795 return error(GL_INVALID_OPERATION);
\r
798 GLenum validationError = ValidateCompressedFormat(internalformat, egl::getClientVersion(), true);
\r
799 if(validationError != GL_NONE)
\r
801 return error(validationError);
\r
809 return error(GL_INVALID_VALUE);
\r
812 es2::Context *context = es2::getContext();
\r
816 if(level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
\r
818 return error(GL_INVALID_VALUE);
\r
823 case GL_TEXTURE_2D:
\r
824 if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
\r
825 height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
\r
827 return error(GL_INVALID_VALUE);
\r
830 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
\r
831 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
\r
832 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
\r
833 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
\r
834 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
\r
835 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
\r
836 if(width != height)
\r
838 return error(GL_INVALID_VALUE);
\r
841 if(width > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||
\r
842 height > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))
\r
844 return error(GL_INVALID_VALUE);
\r
848 return error(GL_INVALID_ENUM);
\r
851 if(imageSize != egl::ComputeCompressedSize(width, height, internalformat))
\r
853 return error(GL_INVALID_VALUE);
\r
856 if(target == GL_TEXTURE_2D)
\r
858 es2::Texture2D *texture = context->getTexture2D();
\r
862 return error(GL_INVALID_OPERATION);
\r
865 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
\r
869 es2::TextureCubeMap *texture = context->getTextureCubeMap();
\r
873 return error(GL_INVALID_OPERATION);
\r
878 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
\r
879 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
\r
880 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
\r
881 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
\r
882 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
\r
883 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
\r
884 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
\r
886 default: UNREACHABLE(target);
\r
892 void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
\r
893 GLenum format, GLsizei imageSize, const GLvoid* data)
\r
895 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
896 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
\r
897 "GLsizei imageSize = %d, const GLvoid* data = %p)",
\r
898 target, level, xoffset, yoffset, width, height, format, imageSize, data);
\r
900 if(!es2::IsTextureTarget(target))
\r
902 return error(GL_INVALID_ENUM);
\r
905 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
\r
907 return error(GL_INVALID_VALUE);
\r
910 if(xoffset < 0 || yoffset < 0 || !validImageSize(level, width, height) || imageSize < 0)
\r
912 return error(GL_INVALID_VALUE);
\r
915 GLenum validationError = ValidateCompressedFormat(format, egl::getClientVersion(), true);
\r
916 if(validationError != GL_NONE)
\r
918 return error(validationError);
\r
921 if(width == 0 || height == 0 || !data)
\r
926 es2::Context *context = es2::getContext();
\r
930 if(imageSize != egl::ComputeCompressedSize(width, height, format))
\r
932 return error(GL_INVALID_VALUE);
\r
935 if(xoffset % 4 != 0 || yoffset % 4 != 0)
\r
937 // We wait to check the offsets until this point, because the multiple-of-four restriction does not exist unless DXT1 textures are supported
\r
938 return error(GL_INVALID_OPERATION);
\r
941 GLenum sizedInternalFormat = GetSizedInternalFormat(format, GL_NONE);
\r
943 if(target == GL_TEXTURE_2D)
\r
945 es2::Texture2D *texture = context->getTexture2D();
\r
947 GLenum validationError = ValidateSubImageParams(true, width, height, xoffset, yoffset, target, level, sizedInternalFormat, texture);
\r
949 if(validationError == GL_NONE)
\r
951 texture->subImageCompressed(level, xoffset, yoffset, width, height, sizedInternalFormat, imageSize, data);
\r
955 return error(validationError);
\r
958 else if(es2::IsCubemapTextureTarget(target))
\r
960 es2::TextureCubeMap *texture = context->getTextureCubeMap();
\r
962 GLenum validationError = ValidateSubImageParams(true, width, height, xoffset, yoffset, target, level, sizedInternalFormat, texture);
\r
964 if(validationError == GL_NONE)
\r
966 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, sizedInternalFormat, imageSize, data);
\r
970 return error(validationError);
\r
973 else UNREACHABLE(target);
\r
977 void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
\r
979 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
\r
980 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
\r
981 target, level, internalformat, x, y, width, height, border);
\r
983 if(!validImageSize(level, width, height))
\r
985 return error(GL_INVALID_VALUE);
\r
990 return error(GL_INVALID_VALUE);
\r
993 es2::Context *context = es2::getContext();
\r
999 case GL_TEXTURE_2D:
\r
1000 if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
\r
1001 height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
\r
1003 return error(GL_INVALID_VALUE);
\r
1006 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
\r
1007 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
\r
1008 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
\r
1009 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
\r
1010 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
\r
1011 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
\r
1012 if(width != height)
\r
1014 return error(GL_INVALID_VALUE);
\r
1017 if(width > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||
\r
1018 height > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))
\r
1020 return error(GL_INVALID_VALUE);
\r
1024 return error(GL_INVALID_ENUM);
\r
1027 es2::Framebuffer *framebuffer = context->getReadFramebuffer();
\r
1029 if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
\r
1031 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
\r
1034 es2::Renderbuffer *source = framebuffer->getReadColorbuffer();
\r
1036 if(context->getReadFramebufferName() != 0 && (!source || source->getSamples() > 1))
\r
1038 return error(GL_INVALID_OPERATION);
\r
1041 GLenum colorbufferFormat = source->getFormat();
\r
1043 if(!validateColorBufferFormat(internalformat, colorbufferFormat))
\r
1048 if(target == GL_TEXTURE_2D)
\r
1050 es2::Texture2D *texture = context->getTexture2D();
\r
1054 return error(GL_INVALID_OPERATION);
\r
1057 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
\r
1059 else if(es2::IsCubemapTextureTarget(target))
\r
1061 es2::TextureCubeMap *texture = context->getTextureCubeMap();
\r
1065 return error(GL_INVALID_OPERATION);
\r
1068 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
\r
1070 else UNREACHABLE(target);
\r
1074 void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
\r
1076 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
1077 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
\r
1078 target, level, xoffset, yoffset, x, y, width, height);
\r
1080 if(!es2::IsTextureTarget(target))
\r
1082 return error(GL_INVALID_ENUM);
\r
1085 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
\r
1087 return error(GL_INVALID_VALUE);
\r
1090 if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
\r
1092 return error(GL_INVALID_VALUE);
\r
1095 if(std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
\r
1097 return error(GL_INVALID_VALUE);
\r
1100 if(width == 0 || height == 0)
\r
1105 es2::Context *context = es2::getContext();
\r
1109 es2::Framebuffer *framebuffer = context->getReadFramebuffer();
\r
1111 if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
\r
1113 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
\r
1116 es2::Renderbuffer *source = framebuffer->getReadColorbuffer();
\r
1118 if(context->getReadFramebufferName() != 0 && (!source || source->getSamples() > 1))
\r
1120 return error(GL_INVALID_OPERATION);
\r
1123 es2::Texture *texture = nullptr;
\r
1125 if(target == GL_TEXTURE_2D)
\r
1127 texture = context->getTexture2D();
\r
1129 else if(es2::IsCubemapTextureTarget(target))
\r
1131 texture = context->getTextureCubeMap();
\r
1133 else UNREACHABLE(target);
\r
1135 GLenum validationError = ValidateSubImageParams(false, width, height, xoffset, yoffset, target, level, GL_NONE, texture);
\r
1136 if(validationError != GL_NONE)
\r
1138 return error(validationError);
\r
1141 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
\r
1145 GLuint CreateProgram(void)
\r
1149 es2::Context *context = es2::getContext();
\r
1153 return context->createProgram();
\r
1159 GLuint CreateShader(GLenum type)
\r
1161 TRACE("(GLenum type = 0x%X)", type);
\r
1163 es2::Context *context = es2::getContext();
\r
1169 case GL_FRAGMENT_SHADER:
\r
1170 case GL_VERTEX_SHADER:
\r
1171 return context->createShader(type);
\r
1173 return error(GL_INVALID_ENUM, 0);
\r
1180 void CullFace(GLenum mode)
\r
1182 TRACE("(GLenum mode = 0x%X)", mode);
\r
1188 case GL_FRONT_AND_BACK:
\r
1190 es2::Context *context = es2::getContext();
\r
1194 context->setCullMode(mode);
\r
1199 return error(GL_INVALID_ENUM);
\r
1203 void DeleteBuffers(GLsizei n, const GLuint* buffers)
\r
1205 TRACE("(GLsizei n = %d, const GLuint* buffers = %p)", n, buffers);
\r
1209 return error(GL_INVALID_VALUE);
\r
1212 es2::Context *context = es2::getContext();
\r
1216 for(int i = 0; i < n; i++)
\r
1218 context->deleteBuffer(buffers[i]);
\r
1223 void DeleteFencesNV(GLsizei n, const GLuint* fences)
\r
1225 TRACE("(GLsizei n = %d, const GLuint* fences = %p)", n, fences);
\r
1229 return error(GL_INVALID_VALUE);
\r
1232 es2::Context *context = es2::getContext();
\r
1236 for(int i = 0; i < n; i++)
\r
1238 context->deleteFence(fences[i]);
\r
1243 void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
\r
1245 TRACE("(GLsizei n = %d, const GLuint* framebuffers = %p)", n, framebuffers);
\r
1249 return error(GL_INVALID_VALUE);
\r
1252 es2::Context *context = es2::getContext();
\r
1256 for(int i = 0; i < n; i++)
\r
1258 if(framebuffers[i] != 0)
\r
1260 context->deleteFramebuffer(framebuffers[i]);
\r
1266 void DeleteProgram(GLuint program)
\r
1268 TRACE("(GLuint program = %d)", program);
\r
1275 es2::Context *context = es2::getContext();
\r
1279 if(!context->getProgram(program))
\r
1281 if(context->getShader(program))
\r
1283 return error(GL_INVALID_OPERATION);
\r
1287 return error(GL_INVALID_VALUE);
\r
1291 context->deleteProgram(program);
\r
1295 void DeleteQueriesEXT(GLsizei n, const GLuint *ids)
\r
1297 TRACE("(GLsizei n = %d, const GLuint *ids = %p)", n, ids);
\r
1301 return error(GL_INVALID_VALUE);
\r
1304 es2::Context *context = es2::getContext();
\r
1308 for(int i = 0; i < n; i++)
\r
1310 context->deleteQuery(ids[i]);
\r
1315 void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
\r
1317 TRACE("(GLsizei n = %d, const GLuint* renderbuffers = %p)", n, renderbuffers);
\r
1321 return error(GL_INVALID_VALUE);
\r
1324 es2::Context *context = es2::getContext();
\r
1328 for(int i = 0; i < n; i++)
\r
1330 context->deleteRenderbuffer(renderbuffers[i]);
\r
1335 void DeleteShader(GLuint shader)
\r
1337 TRACE("(GLuint shader = %d)", shader);
\r
1344 es2::Context *context = es2::getContext();
\r
1348 if(!context->getShader(shader))
\r
1350 if(context->getProgram(shader))
\r
1352 return error(GL_INVALID_OPERATION);
\r
1356 return error(GL_INVALID_VALUE);
\r
1360 context->deleteShader(shader);
\r
1364 void DeleteTextures(GLsizei n, const GLuint* textures)
\r
1366 TRACE("(GLsizei n = %d, const GLuint* textures = %p)", n, textures);
\r
1370 return error(GL_INVALID_VALUE);
\r
1373 es2::Context *context = es2::getContext();
\r
1377 for(int i = 0; i < n; i++)
\r
1379 if(textures[i] != 0)
\r
1381 context->deleteTexture(textures[i]);
\r
1387 void DepthFunc(GLenum func)
\r
1389 TRACE("(GLenum func = 0x%X)", func);
\r
1403 return error(GL_INVALID_ENUM);
\r
1406 es2::Context *context = es2::getContext();
\r
1410 context->setDepthFunc(func);
\r
1414 void DepthMask(GLboolean flag)
\r
1416 TRACE("(GLboolean flag = %d)", flag);
\r
1418 es2::Context *context = es2::getContext();
\r
1422 context->setDepthMask(flag != GL_FALSE);
\r
1426 void DepthRangef(GLclampf zNear, GLclampf zFar)
\r
1428 TRACE("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
\r
1430 es2::Context *context = es2::getContext();
\r
1434 context->setDepthRange(zNear, zFar);
\r
1438 void DetachShader(GLuint program, GLuint shader)
\r
1440 TRACE("(GLuint program = %d, GLuint shader = %d)", program, shader);
\r
1442 es2::Context *context = es2::getContext();
\r
1447 es2::Program *programObject = context->getProgram(program);
\r
1448 es2::Shader *shaderObject = context->getShader(shader);
\r
1450 if(!programObject)
\r
1452 es2::Shader *shaderByProgramHandle;
\r
1453 shaderByProgramHandle = context->getShader(program);
\r
1454 if(!shaderByProgramHandle)
\r
1456 return error(GL_INVALID_VALUE);
\r
1460 return error(GL_INVALID_OPERATION);
\r
1466 es2::Program *programByShaderHandle = context->getProgram(shader);
\r
1467 if(!programByShaderHandle)
\r
1469 return error(GL_INVALID_VALUE);
\r
1473 return error(GL_INVALID_OPERATION);
\r
1477 if(!programObject->detachShader(shaderObject))
\r
1479 return error(GL_INVALID_OPERATION);
\r
1484 void Disable(GLenum cap)
\r
1486 TRACE("(GLenum cap = 0x%X)", cap);
\r
1488 es2::Context *context = es2::getContext();
\r
1494 case GL_CULL_FACE: context->setCullFaceEnabled(false); break;
\r
1495 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFillEnabled(false); break;
\r
1496 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverageEnabled(false); break;
\r
1497 case GL_SAMPLE_COVERAGE: context->setSampleCoverageEnabled(false); break;
\r
1498 case GL_SCISSOR_TEST: context->setScissorTestEnabled(false); break;
\r
1499 case GL_STENCIL_TEST: context->setStencilTestEnabled(false); break;
\r
1500 case GL_DEPTH_TEST: context->setDepthTestEnabled(false); break;
\r
1501 case GL_BLEND: context->setBlendEnabled(false); break;
\r
1502 case GL_DITHER: context->setDitherEnabled(false); break;
\r
1503 case GL_PRIMITIVE_RESTART_FIXED_INDEX: context->setPrimitiveRestartFixedIndexEnabled(false); break;
\r
1504 case GL_RASTERIZER_DISCARD: context->setRasterizerDiscardEnabled(false); break;
\r
1506 return error(GL_INVALID_ENUM);
\r
1511 void DisableVertexAttribArray(GLuint index)
\r
1513 TRACE("(GLuint index = %d)", index);
\r
1515 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
1517 return error(GL_INVALID_VALUE);
\r
1520 es2::Context *context = es2::getContext();
\r
1524 context->setVertexAttribArrayEnabled(index, false);
\r
1528 void DrawArrays(GLenum mode, GLint first, GLsizei count)
\r
1530 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
\r
1536 case GL_LINE_LOOP:
\r
1537 case GL_LINE_STRIP:
\r
1538 case GL_TRIANGLES:
\r
1539 case GL_TRIANGLE_FAN:
\r
1540 case GL_TRIANGLE_STRIP:
\r
1543 return error(GL_INVALID_ENUM);
\r
1546 if(count < 0 || first < 0)
\r
1548 return error(GL_INVALID_VALUE);
\r
1551 es2::Context *context = es2::getContext();
\r
1555 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
\r
1556 if(transformFeedback && transformFeedback->isActive() && (mode != transformFeedback->primitiveMode()))
\r
1558 return error(GL_INVALID_OPERATION);
\r
1561 context->drawArrays(mode, first, count);
\r
1565 void DrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
\r
1567 TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = %p)",
\r
1568 mode, count, type, indices);
\r
1574 case GL_LINE_LOOP:
\r
1575 case GL_LINE_STRIP:
\r
1576 case GL_TRIANGLES:
\r
1577 case GL_TRIANGLE_FAN:
\r
1578 case GL_TRIANGLE_STRIP:
\r
1581 return error(GL_INVALID_ENUM);
\r
1586 return error(GL_INVALID_VALUE);
\r
1589 es2::Context *context = es2::getContext();
\r
1593 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
\r
1594 if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
\r
1596 return error(GL_INVALID_OPERATION);
\r
1601 case GL_UNSIGNED_BYTE:
\r
1602 case GL_UNSIGNED_SHORT:
\r
1603 case GL_UNSIGNED_INT:
\r
1606 return error(GL_INVALID_ENUM);
\r
1609 context->drawElements(mode, 0, MAX_ELEMENT_INDEX, count, type, indices);
\r
1613 void DrawArraysInstancedEXT(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
\r
1615 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
\r
1616 mode, first, count, instanceCount);
\r
1622 case GL_LINE_LOOP:
\r
1623 case GL_LINE_STRIP:
\r
1624 case GL_TRIANGLES:
\r
1625 case GL_TRIANGLE_FAN:
\r
1626 case GL_TRIANGLE_STRIP:
\r
1629 return error(GL_INVALID_ENUM);
\r
1632 if(count < 0 || instanceCount < 0)
\r
1634 return error(GL_INVALID_VALUE);
\r
1637 es2::Context *context = es2::getContext();
\r
1641 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
\r
1642 if(transformFeedback && transformFeedback->isActive() && (mode != transformFeedback->primitiveMode()))
\r
1644 return error(GL_INVALID_OPERATION);
\r
1647 context->drawArrays(mode, first, count, instanceCount);
\r
1651 void DrawElementsInstancedEXT(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount)
\r
1653 TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const void *indices = %p, GLsizei instanceCount = %d)",
\r
1654 mode, count, type, indices, instanceCount);
\r
1660 case GL_LINE_LOOP:
\r
1661 case GL_LINE_STRIP:
\r
1662 case GL_TRIANGLES:
\r
1663 case GL_TRIANGLE_FAN:
\r
1664 case GL_TRIANGLE_STRIP:
\r
1667 return error(GL_INVALID_ENUM);
\r
1672 case GL_UNSIGNED_BYTE:
\r
1673 case GL_UNSIGNED_SHORT:
\r
1674 case GL_UNSIGNED_INT:
\r
1677 return error(GL_INVALID_ENUM);
\r
1680 if(count < 0 || instanceCount < 0)
\r
1682 return error(GL_INVALID_VALUE);
\r
1685 es2::Context *context = es2::getContext();
\r
1689 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
\r
1690 if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
\r
1692 return error(GL_INVALID_OPERATION);
\r
1695 context->drawElements(mode, 0, MAX_ELEMENT_INDEX, count, type, indices, instanceCount);
\r
1699 void VertexAttribDivisorEXT(GLuint index, GLuint divisor)
\r
1701 TRACE("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
\r
1703 es2::Context *context = es2::getContext();
\r
1707 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
1709 return error(GL_INVALID_VALUE);
\r
1712 context->setVertexAttribDivisor(index, divisor);
\r
1716 void DrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
\r
1718 TRACE("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
\r
1719 mode, first, count, instanceCount);
\r
1725 case GL_LINE_LOOP:
\r
1726 case GL_LINE_STRIP:
\r
1727 case GL_TRIANGLES:
\r
1728 case GL_TRIANGLE_FAN:
\r
1729 case GL_TRIANGLE_STRIP:
\r
1732 return error(GL_INVALID_ENUM);
\r
1735 if(count < 0 || instanceCount < 0)
\r
1737 return error(GL_INVALID_VALUE);
\r
1740 es2::Context *context = es2::getContext();
\r
1744 if(!context->hasZeroDivisor())
\r
1746 return error(GL_INVALID_OPERATION);
\r
1749 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
\r
1750 if(transformFeedback && transformFeedback->isActive() && (mode != transformFeedback->primitiveMode()))
\r
1752 return error(GL_INVALID_OPERATION);
\r
1755 context->drawArrays(mode, first, count, instanceCount);
\r
1759 void DrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount)
\r
1761 TRACE("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const void *indices = %p, GLsizei instanceCount = %d)",
\r
1762 mode, count, type, indices, instanceCount);
\r
1768 case GL_LINE_LOOP:
\r
1769 case GL_LINE_STRIP:
\r
1770 case GL_TRIANGLES:
\r
1771 case GL_TRIANGLE_FAN:
\r
1772 case GL_TRIANGLE_STRIP:
\r
1775 return error(GL_INVALID_ENUM);
\r
1780 case GL_UNSIGNED_BYTE:
\r
1781 case GL_UNSIGNED_SHORT:
\r
1782 case GL_UNSIGNED_INT:
\r
1785 return error(GL_INVALID_ENUM);
\r
1788 if(count < 0 || instanceCount < 0)
\r
1790 return error(GL_INVALID_VALUE);
\r
1793 es2::Context *context = es2::getContext();
\r
1797 if(!context->hasZeroDivisor())
\r
1799 return error(GL_INVALID_OPERATION);
\r
1802 es2::TransformFeedback* transformFeedback = context->getTransformFeedback();
\r
1803 if(transformFeedback && transformFeedback->isActive() && !transformFeedback->isPaused())
\r
1805 return error(GL_INVALID_OPERATION);
\r
1808 context->drawElements(mode, 0, MAX_ELEMENT_INDEX, count, type, indices, instanceCount);
\r
1812 void VertexAttribDivisorANGLE(GLuint index, GLuint divisor)
\r
1814 TRACE("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
\r
1816 es2::Context *context = es2::getContext();
\r
1820 if(index >= MAX_VERTEX_ATTRIBS)
\r
1822 return error(GL_INVALID_VALUE);
\r
1825 context->setVertexAttribDivisor(index, divisor);
\r
1829 void Enable(GLenum cap)
\r
1831 TRACE("(GLenum cap = 0x%X)", cap);
\r
1833 es2::Context *context = es2::getContext();
\r
1839 case GL_CULL_FACE: context->setCullFaceEnabled(true); break;
\r
1840 case GL_POLYGON_OFFSET_FILL: context->setPolygonOffsetFillEnabled(true); break;
\r
1841 case GL_SAMPLE_ALPHA_TO_COVERAGE: context->setSampleAlphaToCoverageEnabled(true); break;
\r
1842 case GL_SAMPLE_COVERAGE: context->setSampleCoverageEnabled(true); break;
\r
1843 case GL_SCISSOR_TEST: context->setScissorTestEnabled(true); break;
\r
1844 case GL_STENCIL_TEST: context->setStencilTestEnabled(true); break;
\r
1845 case GL_DEPTH_TEST: context->setDepthTestEnabled(true); break;
\r
1846 case GL_BLEND: context->setBlendEnabled(true); break;
\r
1847 case GL_DITHER: context->setDitherEnabled(true); break;
\r
1848 case GL_PRIMITIVE_RESTART_FIXED_INDEX: context->setPrimitiveRestartFixedIndexEnabled(true); break;
\r
1849 case GL_RASTERIZER_DISCARD: context->setRasterizerDiscardEnabled(true); break;
\r
1851 return error(GL_INVALID_ENUM);
\r
1856 void EnableVertexAttribArray(GLuint index)
\r
1858 TRACE("(GLuint index = %d)", index);
\r
1860 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
1862 return error(GL_INVALID_VALUE);
\r
1865 es2::Context *context = es2::getContext();
\r
1869 context->setVertexAttribArrayEnabled(index, true);
\r
1873 void EndQueryEXT(GLenum target)
\r
1875 TRACE("GLenum target = 0x%X)", target);
\r
1879 case GL_ANY_SAMPLES_PASSED_EXT:
\r
1880 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT:
\r
1883 return error(GL_INVALID_ENUM);
\r
1886 es2::Context *context = es2::getContext();
\r
1890 context->endQuery(target);
\r
1894 void FinishFenceNV(GLuint fence)
\r
1896 TRACE("(GLuint fence = %d)", fence);
\r
1898 es2::Context *context = es2::getContext();
\r
1902 es2::Fence* fenceObject = context->getFence(fence);
\r
1904 if(fenceObject == NULL)
\r
1906 return error(GL_INVALID_OPERATION);
\r
1909 fenceObject->finishFence();
\r
1917 es2::Context *context = es2::getContext();
\r
1921 context->finish();
\r
1929 es2::Context *context = es2::getContext();
\r
1937 void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
\r
1939 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
\r
1940 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
\r
1942 if((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE) ||
\r
1943 (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
\r
1945 return error(GL_INVALID_ENUM);
\r
1948 es2::Context *context = es2::getContext();
\r
1952 es2::Framebuffer *framebuffer = NULL;
\r
1953 GLuint framebufferName = 0;
\r
1954 if(target == GL_READ_FRAMEBUFFER_ANGLE)
\r
1956 framebuffer = context->getReadFramebuffer();
\r
1957 framebufferName = context->getReadFramebufferName();
\r
1961 framebuffer = context->getDrawFramebuffer();
\r
1962 framebufferName = context->getDrawFramebufferName();
\r
1965 if(!framebuffer || framebufferName == 0)
\r
1967 return error(GL_INVALID_OPERATION);
\r
1970 // [OpenGL ES 2.0.25] Section 4.4.3 page 112
\r
1971 // [OpenGL ES 3.0.2] Section 4.4.2 page 201
\r
1972 // 'renderbuffer' must be either zero or the name of an existing renderbuffer object of
\r
1973 // type 'renderbuffertarget', otherwise an INVALID_OPERATION error is generated.
\r
1974 if(renderbuffer != 0)
\r
1976 if(!context->getRenderbuffer(renderbuffer))
\r
1978 return error(GL_INVALID_OPERATION);
\r
1982 GLint clientVersion = context->getClientVersion();
\r
1984 switch(attachment)
\r
1986 case GL_COLOR_ATTACHMENT1:
\r
1987 case GL_COLOR_ATTACHMENT2:
\r
1988 case GL_COLOR_ATTACHMENT3:
\r
1989 case GL_COLOR_ATTACHMENT4:
\r
1990 case GL_COLOR_ATTACHMENT5:
\r
1991 case GL_COLOR_ATTACHMENT6:
\r
1992 case GL_COLOR_ATTACHMENT7:
\r
1993 case GL_COLOR_ATTACHMENT8:
\r
1994 case GL_COLOR_ATTACHMENT9:
\r
1995 case GL_COLOR_ATTACHMENT10:
\r
1996 case GL_COLOR_ATTACHMENT11:
\r
1997 case GL_COLOR_ATTACHMENT12:
\r
1998 case GL_COLOR_ATTACHMENT13:
\r
1999 case GL_COLOR_ATTACHMENT14:
\r
2000 case GL_COLOR_ATTACHMENT15:
\r
2001 case GL_COLOR_ATTACHMENT16:
\r
2002 case GL_COLOR_ATTACHMENT17:
\r
2003 case GL_COLOR_ATTACHMENT18:
\r
2004 case GL_COLOR_ATTACHMENT19:
\r
2005 case GL_COLOR_ATTACHMENT20:
\r
2006 case GL_COLOR_ATTACHMENT21:
\r
2007 case GL_COLOR_ATTACHMENT22:
\r
2008 case GL_COLOR_ATTACHMENT23:
\r
2009 case GL_COLOR_ATTACHMENT24:
\r
2010 case GL_COLOR_ATTACHMENT25:
\r
2011 case GL_COLOR_ATTACHMENT26:
\r
2012 case GL_COLOR_ATTACHMENT27:
\r
2013 case GL_COLOR_ATTACHMENT28:
\r
2014 case GL_COLOR_ATTACHMENT29:
\r
2015 case GL_COLOR_ATTACHMENT30:
\r
2016 case GL_COLOR_ATTACHMENT31:
\r
2017 if(clientVersion < 3)
\r
2019 return error(GL_INVALID_ENUM);
\r
2022 case GL_COLOR_ATTACHMENT0:
\r
2023 if((attachment - GL_COLOR_ATTACHMENT0) >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)
\r
2025 return error(GL_INVALID_ENUM);
\r
2027 framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer, attachment - GL_COLOR_ATTACHMENT0);
\r
2029 case GL_DEPTH_ATTACHMENT:
\r
2030 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
\r
2032 case GL_STENCIL_ATTACHMENT:
\r
2033 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
\r
2035 case GL_DEPTH_STENCIL_ATTACHMENT:
\r
2036 if(clientVersion >= 3)
\r
2038 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
\r
2039 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
\r
2042 else return error(GL_INVALID_ENUM);
\r
2044 return error(GL_INVALID_ENUM);
\r
2049 void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
\r
2051 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
\r
2052 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
\r
2054 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
\r
2056 return error(GL_INVALID_ENUM);
\r
2059 es2::Context *context = es2::getContext();
\r
2065 textarget = GL_NONE;
\r
2069 es2::Texture *tex = context->getTexture(texture);
\r
2073 return error(GL_INVALID_OPERATION);
\r
2078 case GL_TEXTURE_2D:
\r
2079 if(tex->getTarget() != GL_TEXTURE_2D)
\r
2081 return error(GL_INVALID_OPERATION);
\r
2084 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
\r
2085 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
\r
2086 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
\r
2087 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
\r
2088 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
\r
2089 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
\r
2090 if(tex->getTarget() != GL_TEXTURE_CUBE_MAP)
\r
2092 return error(GL_INVALID_OPERATION);
\r
2096 return error(GL_INVALID_ENUM);
\r
2099 if(tex->isCompressed(textarget, level))
\r
2101 return error(GL_INVALID_OPERATION);
\r
2104 if((level != 0) && (context->getClientVersion() < 3))
\r
2106 return error(GL_INVALID_VALUE);
\r
2109 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
\r
2111 return error(GL_INVALID_VALUE);
\r
2115 es2::Framebuffer *framebuffer = NULL;
\r
2116 GLuint framebufferName = 0;
\r
2117 if(target == GL_READ_FRAMEBUFFER_ANGLE)
\r
2119 framebuffer = context->getReadFramebuffer();
\r
2120 framebufferName = context->getReadFramebufferName();
\r
2124 framebuffer = context->getDrawFramebuffer();
\r
2125 framebufferName = context->getDrawFramebufferName();
\r
2128 if(framebufferName == 0 || !framebuffer)
\r
2130 return error(GL_INVALID_OPERATION);
\r
2133 GLint clientVersion = context->getClientVersion();
\r
2135 switch(attachment)
\r
2137 case GL_COLOR_ATTACHMENT1:
\r
2138 case GL_COLOR_ATTACHMENT2:
\r
2139 case GL_COLOR_ATTACHMENT3:
\r
2140 case GL_COLOR_ATTACHMENT4:
\r
2141 case GL_COLOR_ATTACHMENT5:
\r
2142 case GL_COLOR_ATTACHMENT6:
\r
2143 case GL_COLOR_ATTACHMENT7:
\r
2144 case GL_COLOR_ATTACHMENT8:
\r
2145 case GL_COLOR_ATTACHMENT9:
\r
2146 case GL_COLOR_ATTACHMENT10:
\r
2147 case GL_COLOR_ATTACHMENT11:
\r
2148 case GL_COLOR_ATTACHMENT12:
\r
2149 case GL_COLOR_ATTACHMENT13:
\r
2150 case GL_COLOR_ATTACHMENT14:
\r
2151 case GL_COLOR_ATTACHMENT15:
\r
2152 case GL_COLOR_ATTACHMENT16:
\r
2153 case GL_COLOR_ATTACHMENT17:
\r
2154 case GL_COLOR_ATTACHMENT18:
\r
2155 case GL_COLOR_ATTACHMENT19:
\r
2156 case GL_COLOR_ATTACHMENT20:
\r
2157 case GL_COLOR_ATTACHMENT21:
\r
2158 case GL_COLOR_ATTACHMENT22:
\r
2159 case GL_COLOR_ATTACHMENT23:
\r
2160 case GL_COLOR_ATTACHMENT24:
\r
2161 case GL_COLOR_ATTACHMENT25:
\r
2162 case GL_COLOR_ATTACHMENT26:
\r
2163 case GL_COLOR_ATTACHMENT27:
\r
2164 case GL_COLOR_ATTACHMENT28:
\r
2165 case GL_COLOR_ATTACHMENT29:
\r
2166 case GL_COLOR_ATTACHMENT30:
\r
2167 case GL_COLOR_ATTACHMENT31:
\r
2168 if(clientVersion < 3)
\r
2170 return error(GL_INVALID_ENUM);
\r
2173 case GL_COLOR_ATTACHMENT0:
\r
2174 if((attachment - GL_COLOR_ATTACHMENT0) >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)
\r
2176 return error(GL_INVALID_ENUM);
\r
2178 framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0, level);
\r
2180 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level); break;
\r
2181 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level); break;
\r
2183 return error(GL_INVALID_ENUM);
\r
2188 void FrontFace(GLenum mode)
\r
2190 TRACE("(GLenum mode = 0x%X)", mode);
\r
2197 es2::Context *context = es2::getContext();
\r
2201 context->setFrontFace(mode);
\r
2206 return error(GL_INVALID_ENUM);
\r
2210 void GenBuffers(GLsizei n, GLuint* buffers)
\r
2212 TRACE("(GLsizei n = %d, GLuint* buffers = %p)", n, buffers);
\r
2216 return error(GL_INVALID_VALUE);
\r
2219 es2::Context *context = es2::getContext();
\r
2223 for(int i = 0; i < n; i++)
\r
2225 buffers[i] = context->createBuffer();
\r
2230 void GenerateMipmap(GLenum target)
\r
2232 TRACE("(GLenum target = 0x%X)", target);
\r
2234 es2::Context *context = es2::getContext();
\r
2238 es2::Texture *texture = nullptr;
\r
2240 GLint clientVersion = context->getClientVersion();
\r
2244 case GL_TEXTURE_2D:
\r
2245 texture = context->getTexture2D();
\r
2247 case GL_TEXTURE_CUBE_MAP:
\r
2248 texture = context->getTextureCubeMap();
\r
2250 case GL_TEXTURE_2D_ARRAY:
\r
2251 if(clientVersion < 3)
\r
2253 return error(GL_INVALID_ENUM);
\r
2257 texture = context->getTexture2DArray();
\r
2260 case GL_TEXTURE_3D_OES:
\r
2261 texture = context->getTexture3D();
\r
2264 return error(GL_INVALID_ENUM);
\r
2267 if(texture->isCompressed(target, 0) || texture->isDepth(target, 0))
\r
2269 return error(GL_INVALID_OPERATION);
\r
2272 texture->generateMipmaps();
\r
2276 void GenFencesNV(GLsizei n, GLuint* fences)
\r
2278 TRACE("(GLsizei n = %d, GLuint* fences = %p)", n, fences);
\r
2282 return error(GL_INVALID_VALUE);
\r
2285 es2::Context *context = es2::getContext();
\r
2289 for(int i = 0; i < n; i++)
\r
2291 fences[i] = context->createFence();
\r
2296 void GenFramebuffers(GLsizei n, GLuint* framebuffers)
\r
2298 TRACE("(GLsizei n = %d, GLuint* framebuffers = %p)", n, framebuffers);
\r
2302 return error(GL_INVALID_VALUE);
\r
2305 es2::Context *context = es2::getContext();
\r
2309 for(int i = 0; i < n; i++)
\r
2311 framebuffers[i] = context->createFramebuffer();
\r
2316 void GenQueriesEXT(GLsizei n, GLuint* ids)
\r
2318 TRACE("(GLsizei n = %d, GLuint* ids = %p)", n, ids);
\r
2322 return error(GL_INVALID_VALUE);
\r
2325 es2::Context *context = es2::getContext();
\r
2329 for(int i = 0; i < n; i++)
\r
2331 ids[i] = context->createQuery();
\r
2336 void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
\r
2338 TRACE("(GLsizei n = %d, GLuint* renderbuffers = %p)", n, renderbuffers);
\r
2342 return error(GL_INVALID_VALUE);
\r
2345 es2::Context *context = es2::getContext();
\r
2349 for(int i = 0; i < n; i++)
\r
2351 renderbuffers[i] = context->createRenderbuffer();
\r
2356 void GenTextures(GLsizei n, GLuint* textures)
\r
2358 TRACE("(GLsizei n = %d, GLuint* textures = %p)", n, textures);
\r
2362 return error(GL_INVALID_VALUE);
\r
2365 es2::Context *context = es2::getContext();
\r
2369 for(int i = 0; i < n; i++)
\r
2371 textures[i] = context->createTexture();
\r
2376 void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
\r
2378 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = %p, "
\r
2379 "GLint *size = %p, GLenum *type = %p, GLchar *name = %p)",
\r
2380 program, index, bufsize, length, size, type, name);
\r
2384 return error(GL_INVALID_VALUE);
\r
2387 es2::Context *context = es2::getContext();
\r
2391 es2::Program *programObject = context->getProgram(program);
\r
2393 if(!programObject)
\r
2395 if(context->getShader(program))
\r
2397 return error(GL_INVALID_OPERATION);
\r
2401 return error(GL_INVALID_VALUE);
\r
2405 if(index >= programObject->getActiveAttributeCount())
\r
2407 return error(GL_INVALID_VALUE);
\r
2410 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
\r
2414 void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
\r
2416 TRACE("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
\r
2417 "GLsizei* length = %p, GLint* size = %p, GLenum* type = %p, GLchar* name = %s)",
\r
2418 program, index, bufsize, length, size, type, name);
\r
2422 return error(GL_INVALID_VALUE);
\r
2425 es2::Context *context = es2::getContext();
\r
2429 es2::Program *programObject = context->getProgram(program);
\r
2431 if(!programObject)
\r
2433 if(context->getShader(program))
\r
2435 return error(GL_INVALID_OPERATION);
\r
2439 return error(GL_INVALID_VALUE);
\r
2443 if(index >= programObject->getActiveUniformCount())
\r
2445 return error(GL_INVALID_VALUE);
\r
2448 programObject->getActiveUniform(index, bufsize, length, size, type, name);
\r
2452 void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
\r
2454 TRACE("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = %p, GLuint* shaders = %p)",
\r
2455 program, maxcount, count, shaders);
\r
2459 return error(GL_INVALID_VALUE);
\r
2462 es2::Context *context = es2::getContext();
\r
2466 es2::Program *programObject = context->getProgram(program);
\r
2468 if(!programObject)
\r
2470 if(context->getShader(program))
\r
2472 return error(GL_INVALID_OPERATION);
\r
2476 return error(GL_INVALID_VALUE);
\r
2480 return programObject->getAttachedShaders(maxcount, count, shaders);
\r
2484 int GetAttribLocation(GLuint program, const GLchar* name)
\r
2486 TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name);
\r
2488 es2::Context *context = es2::getContext();
\r
2493 es2::Program *programObject = context->getProgram(program);
\r
2495 if(!programObject)
\r
2497 if(context->getShader(program))
\r
2499 return error(GL_INVALID_OPERATION, -1);
\r
2503 return error(GL_INVALID_VALUE, -1);
\r
2507 if(!programObject->isLinked())
\r
2509 return error(GL_INVALID_OPERATION, -1);
\r
2512 return programObject->getAttributeLocation(name);
\r
2518 void GetBooleanv(GLenum pname, GLboolean* params)
\r
2520 TRACE("(GLenum pname = 0x%X, GLboolean* params = %p)", pname, params);
\r
2522 es2::Context *context = es2::getContext();
\r
2526 if(!(context->getBooleanv(pname, params)))
\r
2528 GLenum nativeType;
\r
2529 unsigned int numParams = 0;
\r
2530 if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))
\r
2531 return error(GL_INVALID_ENUM);
\r
2533 if(numParams == 0)
\r
2534 return; // it is known that the pname is valid, but there are no parameters to return
\r
2536 if(nativeType == GL_FLOAT)
\r
2538 GLfloat *floatParams = NULL;
\r
2539 floatParams = new GLfloat[numParams];
\r
2541 context->getFloatv(pname, floatParams);
\r
2543 for(unsigned int i = 0; i < numParams; ++i)
\r
2545 if(floatParams[i] == 0.0f)
\r
2546 params[i] = GL_FALSE;
\r
2548 params[i] = GL_TRUE;
\r
2551 delete [] floatParams;
\r
2553 else if(nativeType == GL_INT)
\r
2555 GLint *intParams = NULL;
\r
2556 intParams = new GLint[numParams];
\r
2558 context->getIntegerv(pname, intParams);
\r
2560 for(unsigned int i = 0; i < numParams; ++i)
\r
2562 if(intParams[i] == 0)
\r
2563 params[i] = GL_FALSE;
\r
2565 params[i] = GL_TRUE;
\r
2568 delete [] intParams;
\r
2574 void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
\r
2576 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = %p)", target, pname, params);
\r
2578 es2::Context *context = es2::getContext();
\r
2582 es2::Buffer *buffer;
\r
2583 if(!context->getBuffer(target, &buffer))
\r
2585 return error(GL_INVALID_ENUM);
\r
2590 // A null buffer means that "0" is bound to the requested buffer target
\r
2591 return error(GL_INVALID_OPERATION);
\r
2594 GLint clientVersion = context->getClientVersion();
\r
2598 case GL_BUFFER_USAGE:
\r
2599 *params = buffer->usage();
\r
2601 case GL_BUFFER_SIZE:
\r
2602 *params = buffer->size();
\r
2604 case GL_BUFFER_ACCESS_FLAGS:
\r
2605 if(clientVersion >= 3)
\r
2607 *params = buffer->access();
\r
2610 else return error(GL_INVALID_ENUM);
\r
2611 case GL_BUFFER_MAPPED:
\r
2612 if(clientVersion >= 3)
\r
2614 *params = buffer->isMapped();
\r
2617 else return error(GL_INVALID_ENUM);
\r
2618 case GL_BUFFER_MAP_LENGTH:
\r
2619 if(clientVersion >= 3)
\r
2621 *params = buffer->length();
\r
2624 else return error(GL_INVALID_ENUM);
\r
2625 case GL_BUFFER_MAP_OFFSET:
\r
2626 if(clientVersion >= 3)
\r
2628 *params = buffer->offset();
\r
2631 else return error(GL_INVALID_ENUM);
\r
2633 return error(GL_INVALID_ENUM);
\r
2638 GLenum GetError(void)
\r
2642 es2::Context *context = es2::getContext();
\r
2646 return context->getError();
\r
2649 return GL_NO_ERROR;
\r
2652 void GetFenceivNV(GLuint fence, GLenum pname, GLint *params)
\r
2654 TRACE("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = %p)", fence, pname, params);
\r
2656 es2::Context *context = es2::getContext();
\r
2660 es2::Fence *fenceObject = context->getFence(fence);
\r
2662 if(fenceObject == NULL)
\r
2664 return error(GL_INVALID_OPERATION);
\r
2667 fenceObject->getFenceiv(pname, params);
\r
2671 void GetFloatv(GLenum pname, GLfloat* params)
\r
2673 TRACE("(GLenum pname = 0x%X, GLfloat* params = %p)", pname, params);
\r
2675 es2::Context *context = es2::getContext();
\r
2679 if(!(context->getFloatv(pname, params)))
\r
2681 GLenum nativeType;
\r
2682 unsigned int numParams = 0;
\r
2683 if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))
\r
2684 return error(GL_INVALID_ENUM);
\r
2686 if(numParams == 0)
\r
2687 return; // it is known that the pname is valid, but that there are no parameters to return.
\r
2689 if(nativeType == GL_BOOL)
\r
2691 GLboolean *boolParams = NULL;
\r
2692 boolParams = new GLboolean[numParams];
\r
2694 context->getBooleanv(pname, boolParams);
\r
2696 for(unsigned int i = 0; i < numParams; ++i)
\r
2698 if(boolParams[i] == GL_FALSE)
\r
2704 delete [] boolParams;
\r
2706 else if(nativeType == GL_INT)
\r
2708 GLint *intParams = NULL;
\r
2709 intParams = new GLint[numParams];
\r
2711 context->getIntegerv(pname, intParams);
\r
2713 for(unsigned int i = 0; i < numParams; ++i)
\r
2715 params[i] = (GLfloat)intParams[i];
\r
2718 delete [] intParams;
\r
2724 void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
\r
2726 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = %p)",
\r
2727 target, attachment, pname, params);
\r
2729 es2::Context *context = es2::getContext();
\r
2733 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER && target != GL_READ_FRAMEBUFFER)
\r
2735 return error(GL_INVALID_ENUM);
\r
2738 GLint clientVersion = context->getClientVersion();
\r
2740 es2::Framebuffer *framebuffer = nullptr;
\r
2741 if(target == GL_READ_FRAMEBUFFER)
\r
2743 if(context->getReadFramebufferName() == 0)
\r
2745 if(clientVersion < 3)
\r
2747 return error(GL_INVALID_OPERATION);
\r
2751 switch(attachment)
\r
2758 return error(GL_INVALID_ENUM);
\r
2763 framebuffer = context->getReadFramebuffer();
\r
2767 if(context->getDrawFramebufferName() == 0)
\r
2769 if(clientVersion < 3)
\r
2771 return error(GL_INVALID_OPERATION);
\r
2775 switch(attachment)
\r
2782 return error(GL_INVALID_ENUM);
\r
2787 framebuffer = context->getDrawFramebuffer();
\r
2790 GLenum attachmentType;
\r
2791 GLuint attachmentHandle;
\r
2792 GLint attachmentLayer;
\r
2793 Renderbuffer* renderbuffer = nullptr;
\r
2794 switch(attachment)
\r
2797 if(clientVersion >= 3)
\r
2799 attachmentType = framebuffer->getColorbufferType(0);
\r
2800 attachmentHandle = framebuffer->getColorbufferName(0);
\r
2801 attachmentLayer = framebuffer->getColorbufferLayer(0);
\r
2802 renderbuffer = framebuffer->getColorbuffer(0);
\r
2804 else return error(GL_INVALID_ENUM);
\r
2806 case GL_COLOR_ATTACHMENT1:
\r
2807 case GL_COLOR_ATTACHMENT2:
\r
2808 case GL_COLOR_ATTACHMENT3:
\r
2809 case GL_COLOR_ATTACHMENT4:
\r
2810 case GL_COLOR_ATTACHMENT5:
\r
2811 case GL_COLOR_ATTACHMENT6:
\r
2812 case GL_COLOR_ATTACHMENT7:
\r
2813 case GL_COLOR_ATTACHMENT8:
\r
2814 case GL_COLOR_ATTACHMENT9:
\r
2815 case GL_COLOR_ATTACHMENT10:
\r
2816 case GL_COLOR_ATTACHMENT11:
\r
2817 case GL_COLOR_ATTACHMENT12:
\r
2818 case GL_COLOR_ATTACHMENT13:
\r
2819 case GL_COLOR_ATTACHMENT14:
\r
2820 case GL_COLOR_ATTACHMENT15:
\r
2821 case GL_COLOR_ATTACHMENT16:
\r
2822 case GL_COLOR_ATTACHMENT17:
\r
2823 case GL_COLOR_ATTACHMENT18:
\r
2824 case GL_COLOR_ATTACHMENT19:
\r
2825 case GL_COLOR_ATTACHMENT20:
\r
2826 case GL_COLOR_ATTACHMENT21:
\r
2827 case GL_COLOR_ATTACHMENT22:
\r
2828 case GL_COLOR_ATTACHMENT23:
\r
2829 case GL_COLOR_ATTACHMENT24:
\r
2830 case GL_COLOR_ATTACHMENT25:
\r
2831 case GL_COLOR_ATTACHMENT26:
\r
2832 case GL_COLOR_ATTACHMENT27:
\r
2833 case GL_COLOR_ATTACHMENT28:
\r
2834 case GL_COLOR_ATTACHMENT29:
\r
2835 case GL_COLOR_ATTACHMENT30:
\r
2836 case GL_COLOR_ATTACHMENT31:
\r
2837 if(clientVersion < 3)
\r
2839 return error(GL_INVALID_ENUM);
\r
2842 case GL_COLOR_ATTACHMENT0:
\r
2843 if((attachment - GL_COLOR_ATTACHMENT0) >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)
\r
2845 return error(GL_INVALID_ENUM);
\r
2847 attachmentType = framebuffer->getColorbufferType(attachment - GL_COLOR_ATTACHMENT0);
\r
2848 attachmentHandle = framebuffer->getColorbufferName(attachment - GL_COLOR_ATTACHMENT0);
\r
2849 attachmentLayer = framebuffer->getColorbufferLayer(attachment - GL_COLOR_ATTACHMENT0);
\r
2850 renderbuffer = framebuffer->getColorbuffer(attachment - GL_COLOR_ATTACHMENT0);
\r
2853 if(clientVersion < 3)
\r
2855 return error(GL_INVALID_ENUM);
\r
2858 case GL_DEPTH_ATTACHMENT:
\r
2859 attachmentType = framebuffer->getDepthbufferType();
\r
2860 attachmentHandle = framebuffer->getDepthbufferName();
\r
2861 attachmentLayer = framebuffer->getDepthbufferLayer();
\r
2862 renderbuffer = framebuffer->getDepthbuffer();
\r
2865 if(clientVersion < 3)
\r
2867 return error(GL_INVALID_ENUM);
\r
2870 case GL_STENCIL_ATTACHMENT:
\r
2871 attachmentType = framebuffer->getStencilbufferType();
\r
2872 attachmentHandle = framebuffer->getStencilbufferName();
\r
2873 attachmentLayer = framebuffer->getStencilbufferLayer();
\r
2874 renderbuffer = framebuffer->getStencilbuffer();
\r
2876 case GL_DEPTH_STENCIL_ATTACHMENT:
\r
2877 if(clientVersion >= 3)
\r
2879 attachmentType = framebuffer->getDepthbufferType();
\r
2880 attachmentHandle = framebuffer->getDepthbufferName();
\r
2881 attachmentLayer = framebuffer->getDepthbufferLayer();
\r
2882 if(attachmentHandle != framebuffer->getStencilbufferName())
\r
2884 // Different attachments to DEPTH and STENCIL, query fails
\r
2885 return error(GL_INVALID_OPERATION);
\r
2887 renderbuffer = framebuffer->getDepthbuffer();
\r
2889 else return error(GL_INVALID_ENUM);
\r
2892 return error(GL_INVALID_ENUM);
\r
2895 GLenum attachmentObjectType = GL_NONE; // Type category
\r
2896 if(attachmentType == GL_NONE || Framebuffer::IsRenderbuffer(attachmentType))
\r
2898 attachmentObjectType = attachmentType;
\r
2900 else if(es2::IsTextureTarget(attachmentType))
\r
2902 attachmentObjectType = GL_TEXTURE;
\r
2904 else UNREACHABLE(attachmentType);
\r
2906 if(attachmentObjectType != GL_NONE)
\r
2910 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
\r
2911 *params = attachmentObjectType;
\r
2913 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
\r
2914 if(Framebuffer::IsRenderbuffer(attachmentObjectType) || attachmentObjectType == GL_TEXTURE)
\r
2916 *params = attachmentHandle;
\r
2920 return error(GL_INVALID_ENUM);
\r
2923 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
\r
2924 if(attachmentObjectType == GL_TEXTURE)
\r
2926 *params = clientVersion < 3 ? 0 : renderbuffer->getLevel(); // FramebufferTexture2D will not allow level to be set to anything else in GL ES 2.0
\r
2930 return error(GL_INVALID_ENUM);
\r
2933 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
\r
2934 if(attachmentObjectType == GL_TEXTURE)
\r
2936 if(es2::IsCubemapTextureTarget(attachmentType))
\r
2938 *params = attachmentType;
\r
2947 return error(GL_INVALID_ENUM);
\r
2950 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
\r
2951 if(clientVersion >= 3)
\r
2953 *params = attachmentLayer;
\r
2955 else return error(GL_INVALID_ENUM);
\r
2957 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
\r
2958 if(clientVersion >= 3)
\r
2960 *params = renderbuffer->getRedSize();
\r
2962 else return error(GL_INVALID_ENUM);
\r
2964 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
\r
2965 if(clientVersion >= 3)
\r
2967 *params = renderbuffer->getGreenSize();
\r
2969 else return error(GL_INVALID_ENUM);
\r
2971 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
\r
2972 if(clientVersion >= 3)
\r
2974 *params = renderbuffer->getBlueSize();
\r
2976 else return error(GL_INVALID_ENUM);
\r
2978 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
\r
2979 if(clientVersion >= 3)
\r
2981 *params = renderbuffer->getAlphaSize();
\r
2983 else return error(GL_INVALID_ENUM);
\r
2985 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
\r
2986 if(clientVersion >= 3)
\r
2988 *params = renderbuffer->getDepthSize();
\r
2990 else return error(GL_INVALID_ENUM);
\r
2992 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
\r
2993 if(clientVersion >= 3)
\r
2995 *params = renderbuffer->getStencilSize();
\r
2997 else return error(GL_INVALID_ENUM);
\r
2999 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
\r
3000 if(clientVersion >= 3)
\r
3002 if(attachment == GL_DEPTH_STENCIL_ATTACHMENT)
\r
3004 return error(GL_INVALID_OPERATION);
\r
3007 *params = sw2es::GetComponentType(renderbuffer->getInternalFormat(), attachment);
\r
3009 else return error(GL_INVALID_ENUM);
\r
3011 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
\r
3012 if(clientVersion >= 3)
\r
3014 *params = GL_LINEAR; // FIXME: GL_SRGB will also be possible, when sRGB is added
\r
3016 else return error(GL_INVALID_ENUM);
\r
3019 return error(GL_INVALID_ENUM);
\r
3024 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
\r
3025 // is NONE, then querying any other pname will generate INVALID_ENUM.
\r
3027 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
\r
3028 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
\r
3029 // INVALID_OPERATION for all other pnames
\r
3033 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
\r
3034 *params = GL_NONE;
\r
3037 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
\r
3038 if(clientVersion < 3)
\r
3040 return error(GL_INVALID_ENUM);
\r
3046 if(clientVersion < 3)
\r
3048 return error(GL_INVALID_ENUM);
\r
3052 return error(GL_INVALID_OPERATION);
\r
3059 GLenum GetGraphicsResetStatusEXT(void)
\r
3063 return GL_NO_ERROR;
\r
3066 void GetIntegerv(GLenum pname, GLint* params)
\r
3068 TRACE("(GLenum pname = 0x%X, GLint* params = %p)", pname, params);
\r
3070 es2::Context *context = es2::getContext();
\r
3074 // Not strictly an error, but probably unintended or attempting to rely on non-compliant behavior
\r
3075 #ifdef __ANDROID__
\r
3076 ALOGI("expected_badness glGetIntegerv() called without current context.");
\r
3078 ERR("glGetIntegerv() called without current context.");
\r
3081 // This is not spec compliant! When there is no current GL context, functions should
\r
3082 // have no side effects. Google Maps queries these values before creating a context,
\r
3083 // so we need this as a bug-compatible workaround.
\r
3086 case GL_MAX_TEXTURE_SIZE: *params = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE; return;
\r
3087 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = es2::MAX_VERTEX_TEXTURE_IMAGE_UNITS; return;
\r
3088 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = es2::MAX_COMBINED_TEXTURE_IMAGE_UNITS; return;
\r
3089 case GL_STENCIL_BITS: *params = 8; return;
\r
3090 case GL_ALIASED_LINE_WIDTH_RANGE:
\r
3091 params[0] = (GLint)es2::ALIASED_LINE_WIDTH_RANGE_MIN;
\r
3092 params[1] = (GLint)es2::ALIASED_LINE_WIDTH_RANGE_MAX;
\r
3099 if(!(context->getIntegerv(pname, params)))
\r
3101 GLenum nativeType;
\r
3102 unsigned int numParams = 0;
\r
3103 if(!context->getQueryParameterInfo(pname, &nativeType, &numParams))
\r
3104 return error(GL_INVALID_ENUM);
\r
3106 if(numParams == 0)
\r
3107 return; // it is known that pname is valid, but there are no parameters to return
\r
3109 if(nativeType == GL_BOOL)
\r
3111 GLboolean *boolParams = NULL;
\r
3112 boolParams = new GLboolean[numParams];
\r
3114 context->getBooleanv(pname, boolParams);
\r
3116 for(unsigned int i = 0; i < numParams; ++i)
\r
3118 params[i] = (boolParams[i] == GL_FALSE) ? 0 : 1;
\r
3121 delete [] boolParams;
\r
3123 else if(nativeType == GL_FLOAT)
\r
3125 GLfloat *floatParams = NULL;
\r
3126 floatParams = new GLfloat[numParams];
\r
3128 context->getFloatv(pname, floatParams);
\r
3130 for(unsigned int i = 0; i < numParams; ++i)
\r
3132 if(pname == GL_DEPTH_RANGE || pname == GL_COLOR_CLEAR_VALUE || pname == GL_DEPTH_CLEAR_VALUE || pname == GL_BLEND_COLOR)
\r
3134 params[i] = es2::floatToInt(floatParams[i]);
\r
3138 params[i] = (GLint)(floatParams[i] > 0.0f ? floor(floatParams[i] + 0.5) : ceil(floatParams[i] - 0.5));
\r
3142 delete [] floatParams;
\r
3148 void GetProgramiv(GLuint program, GLenum pname, GLint* params)
\r
3150 TRACE("(GLuint program = %d, GLenum pname = 0x%X, GLint* params = %p)", program, pname, params);
\r
3152 es2::Context *context = es2::getContext();
\r
3156 es2::Program *programObject = context->getProgram(program);
\r
3158 if(!programObject)
\r
3160 return error(GL_INVALID_VALUE);
\r
3163 GLint clientVersion = egl::getClientVersion();
\r
3167 case GL_DELETE_STATUS:
\r
3168 *params = programObject->isFlaggedForDeletion();
\r
3170 case GL_LINK_STATUS:
\r
3171 *params = programObject->isLinked();
\r
3173 case GL_VALIDATE_STATUS:
\r
3174 *params = programObject->isValidated();
\r
3176 case GL_INFO_LOG_LENGTH:
\r
3177 *params = programObject->getInfoLogLength();
\r
3179 case GL_ATTACHED_SHADERS:
\r
3180 *params = programObject->getAttachedShadersCount();
\r
3182 case GL_ACTIVE_ATTRIBUTES:
\r
3183 *params = programObject->getActiveAttributeCount();
\r
3185 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
\r
3186 *params = programObject->getActiveAttributeMaxLength();
\r
3188 case GL_ACTIVE_UNIFORMS:
\r
3189 *params = programObject->getActiveUniformCount();
\r
3191 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
\r
3192 *params = programObject->getActiveUniformMaxLength();
\r
3194 case GL_ACTIVE_UNIFORM_BLOCKS:
\r
3195 if(clientVersion >= 3)
\r
3197 *params = programObject->getActiveUniformBlockCount();
\r
3200 else return error(GL_INVALID_ENUM);
\r
3201 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
\r
3202 if(clientVersion >= 3)
\r
3204 *params = programObject->getActiveUniformBlockMaxLength();
\r
3207 else return error(GL_INVALID_ENUM);
\r
3208 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
\r
3209 if(clientVersion >= 3)
\r
3211 *params = programObject->getTransformFeedbackBufferMode();
\r
3214 else return error(GL_INVALID_ENUM);
\r
3215 case GL_TRANSFORM_FEEDBACK_VARYINGS:
\r
3216 if(clientVersion >= 3)
\r
3218 *params = programObject->getTransformFeedbackVaryingCount();
\r
3221 else return error(GL_INVALID_ENUM);
\r
3222 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
\r
3223 if(clientVersion >= 3)
\r
3225 *params = programObject->getTransformFeedbackVaryingMaxLength();
\r
3228 else return error(GL_INVALID_ENUM);
\r
3229 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
\r
3230 if(clientVersion >= 3)
\r
3232 *params = programObject->getBinaryRetrievableHint();
\r
3235 else return error(GL_INVALID_ENUM);
\r
3236 case GL_PROGRAM_BINARY_LENGTH:
\r
3237 if(clientVersion >= 3)
\r
3239 *params = programObject->getBinaryLength();
\r
3242 else return error(GL_INVALID_ENUM);
\r
3244 return error(GL_INVALID_ENUM);
\r
3249 void GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
\r
3251 TRACE("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = %p, GLchar* infolog = %p)",
\r
3252 program, bufsize, length, infolog);
\r
3256 return error(GL_INVALID_VALUE);
\r
3259 es2::Context *context = es2::getContext();
\r
3263 es2::Program *programObject = context->getProgram(program);
\r
3265 if(!programObject)
\r
3267 return error(GL_INVALID_VALUE);
\r
3270 programObject->getInfoLog(bufsize, length, infolog);
\r
3274 void GetQueryivEXT(GLenum target, GLenum pname, GLint *params)
\r
3276 TRACE("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = %p)", target, pname, params);
\r
3280 case GL_CURRENT_QUERY_EXT:
\r
3283 return error(GL_INVALID_ENUM);
\r
3286 es2::Context *context = es2::getContext();
\r
3290 params[0] = context->getActiveQuery(target);
\r
3294 void GetQueryObjectuivEXT(GLuint name, GLenum pname, GLuint *params)
\r
3296 TRACE("(GLuint name = %d, GLenum pname = 0x%X, GLuint *params = %p)", name, pname, params);
\r
3300 case GL_QUERY_RESULT_EXT:
\r
3301 case GL_QUERY_RESULT_AVAILABLE_EXT:
\r
3304 return error(GL_INVALID_ENUM);
\r
3307 es2::Context *context = es2::getContext();
\r
3311 es2::Query *queryObject = context->getQuery(name);
\r
3315 return error(GL_INVALID_OPERATION);
\r
3318 if(context->getActiveQuery(queryObject->getType()) == name)
\r
3320 return error(GL_INVALID_OPERATION);
\r
3325 case GL_QUERY_RESULT_EXT:
\r
3326 params[0] = queryObject->getResult();
\r
3328 case GL_QUERY_RESULT_AVAILABLE_EXT:
\r
3329 params[0] = queryObject->isResultAvailable();
\r
3337 void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
\r
3339 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = %p)", target, pname, params);
\r
3341 es2::Context *context = es2::getContext();
\r
3345 if(target != GL_RENDERBUFFER)
\r
3347 return error(GL_INVALID_ENUM);
\r
3350 if(context->getRenderbufferName() == 0)
\r
3352 return error(GL_INVALID_OPERATION);
\r
3355 es2::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferName());
\r
3359 case GL_RENDERBUFFER_WIDTH: *params = renderbuffer->getWidth(); break;
\r
3360 case GL_RENDERBUFFER_HEIGHT: *params = renderbuffer->getHeight(); break;
\r
3361 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getFormat(); break;
\r
3362 case GL_RENDERBUFFER_RED_SIZE: *params = renderbuffer->getRedSize(); break;
\r
3363 case GL_RENDERBUFFER_GREEN_SIZE: *params = renderbuffer->getGreenSize(); break;
\r
3364 case GL_RENDERBUFFER_BLUE_SIZE: *params = renderbuffer->getBlueSize(); break;
\r
3365 case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break;
\r
3366 case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break;
\r
3367 case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break;
\r
3368 case GL_RENDERBUFFER_SAMPLES_ANGLE: *params = renderbuffer->getSamples(); break;
\r
3370 return error(GL_INVALID_ENUM);
\r
3375 void GetShaderiv(GLuint shader, GLenum pname, GLint* params)
\r
3377 TRACE("(GLuint shader = %d, GLenum pname = %d, GLint* params = %p)", shader, pname, params);
\r
3379 es2::Context *context = es2::getContext();
\r
3383 es2::Shader *shaderObject = context->getShader(shader);
\r
3387 return error(GL_INVALID_VALUE);
\r
3392 case GL_SHADER_TYPE:
\r
3393 *params = shaderObject->getType();
\r
3395 case GL_DELETE_STATUS:
\r
3396 *params = shaderObject->isFlaggedForDeletion();
\r
3398 case GL_COMPILE_STATUS:
\r
3399 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
\r
3401 case GL_INFO_LOG_LENGTH:
\r
3402 *params = shaderObject->getInfoLogLength();
\r
3404 case GL_SHADER_SOURCE_LENGTH:
\r
3405 *params = shaderObject->getSourceLength();
\r
3408 return error(GL_INVALID_ENUM);
\r
3413 void GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
\r
3415 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = %p, GLchar* infolog = %p)",
\r
3416 shader, bufsize, length, infolog);
\r
3420 return error(GL_INVALID_VALUE);
\r
3423 es2::Context *context = es2::getContext();
\r
3427 es2::Shader *shaderObject = context->getShader(shader);
\r
3431 return error(GL_INVALID_VALUE);
\r
3434 shaderObject->getInfoLog(bufsize, length, infolog);
\r
3438 void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
\r
3440 TRACE("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = %p, GLint* precision = %p)",
\r
3441 shadertype, precisiontype, range, precision);
\r
3443 switch(shadertype)
\r
3445 case GL_VERTEX_SHADER:
\r
3446 case GL_FRAGMENT_SHADER:
\r
3449 return error(GL_INVALID_ENUM);
\r
3452 switch(precisiontype)
\r
3454 case GL_LOW_FLOAT:
\r
3455 case GL_MEDIUM_FLOAT:
\r
3456 case GL_HIGH_FLOAT:
\r
3457 // IEEE 754 single-precision
\r
3463 case GL_MEDIUM_INT:
\r
3465 // Full integer precision is supported
\r
3471 return error(GL_INVALID_ENUM);
\r
3475 void GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
\r
3477 TRACE("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = %p, GLchar* source = %p)",
\r
3478 shader, bufsize, length, source);
\r
3482 return error(GL_INVALID_VALUE);
\r
3485 es2::Context *context = es2::getContext();
\r
3489 es2::Shader *shaderObject = context->getShader(shader);
\r
3493 return error(GL_INVALID_OPERATION);
\r
3496 shaderObject->getSource(bufsize, length, source);
\r
3500 const GLubyte* GetString(GLenum name)
\r
3502 TRACE("(GLenum name = 0x%X)", name);
\r
3507 return (GLubyte*)"Google Inc.";
\r
3509 return (GLubyte*)"Google SwiftShader";
\r
3512 es2::Context *context = es2::getContext();
\r
3513 return (context && (context->getClientVersion() >= 3)) ?
\r
3514 (GLubyte*)"OpenGL ES 3.0 SwiftShader " VERSION_STRING :
\r
3515 (GLubyte*)"OpenGL ES 2.0 SwiftShader " VERSION_STRING;
\r
3517 case GL_SHADING_LANGUAGE_VERSION:
\r
3519 es2::Context *context = es2::getContext();
\r
3520 return (context && (context->getClientVersion() >= 3)) ?
\r
3521 (GLubyte*)"OpenGL ES GLSL ES 3.00 SwiftShader " VERSION_STRING :
\r
3522 (GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader " VERSION_STRING;
\r
3524 case GL_EXTENSIONS:
\r
3526 es2::Context *context = es2::getContext();
\r
3527 return context ? context->getExtensions(GL_INVALID_INDEX) : (GLubyte*)NULL;
\r
3530 return error(GL_INVALID_ENUM, (GLubyte*)NULL);
\r
3534 void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
\r
3536 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = %p)", target, pname, params);
\r
3538 es2::Context *context = es2::getContext();
\r
3542 es2::Texture *texture;
\r
3544 GLint clientVersion = context->getClientVersion();
\r
3548 case GL_TEXTURE_2D:
\r
3549 texture = context->getTexture2D();
\r
3551 case GL_TEXTURE_CUBE_MAP:
\r
3552 texture = context->getTextureCubeMap();
\r
3554 case GL_TEXTURE_EXTERNAL_OES:
\r
3555 texture = context->getTextureExternal();
\r
3557 case GL_TEXTURE_2D_ARRAY:
\r
3558 if(clientVersion < 3)
\r
3560 return error(GL_INVALID_ENUM);
\r
3564 texture = context->getTexture2DArray();
\r
3567 case GL_TEXTURE_3D_OES:
\r
3568 texture = context->getTexture3D();
\r
3571 return error(GL_INVALID_ENUM);
\r
3576 case GL_TEXTURE_MAG_FILTER:
\r
3577 *params = (GLfloat)texture->getMagFilter();
\r
3579 case GL_TEXTURE_MIN_FILTER:
\r
3580 *params = (GLfloat)texture->getMinFilter();
\r
3582 case GL_TEXTURE_WRAP_S:
\r
3583 *params = (GLfloat)texture->getWrapS();
\r
3585 case GL_TEXTURE_WRAP_T:
\r
3586 *params = (GLfloat)texture->getWrapT();
\r
3588 case GL_TEXTURE_WRAP_R_OES:
\r
3589 *params = (GLfloat)texture->getWrapR();
\r
3591 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
\r
3592 *params = texture->getMaxAnisotropy();
\r
3594 case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
\r
3595 *params = (GLfloat)1;
\r
3597 case GL_TEXTURE_BASE_LEVEL:
\r
3598 if(clientVersion >= 3)
\r
3600 *params = (GLfloat)texture->getBaseLevel();
\r
3603 else return error(GL_INVALID_ENUM);
\r
3604 case GL_TEXTURE_COMPARE_FUNC:
\r
3605 if(clientVersion >= 3)
\r
3607 *params = (GLfloat)texture->getCompareFunc();
\r
3610 else return error(GL_INVALID_ENUM);
\r
3611 case GL_TEXTURE_COMPARE_MODE:
\r
3612 if(clientVersion >= 3)
\r
3614 *params = (GLfloat)texture->getCompareMode();
\r
3617 else return error(GL_INVALID_ENUM);
\r
3618 case GL_TEXTURE_IMMUTABLE_FORMAT:
\r
3619 if(clientVersion >= 3)
\r
3621 *params = (GLfloat)texture->getImmutableFormat();
\r
3624 else return error(GL_INVALID_ENUM);
\r
3625 case GL_TEXTURE_IMMUTABLE_LEVELS:
\r
3626 if(clientVersion >= 3)
\r
3628 *params = (GLfloat)texture->getImmutableLevels();
\r
3631 else return error(GL_INVALID_ENUM);
\r
3632 case GL_TEXTURE_MAX_LEVEL:
\r
3633 if(clientVersion >= 3)
\r
3635 *params = (GLfloat)texture->getMaxLevel();
\r
3638 else return error(GL_INVALID_ENUM);
\r
3639 case GL_TEXTURE_MAX_LOD:
\r
3640 if(clientVersion >= 3)
\r
3642 *params = texture->getMaxLOD();
\r
3645 else return error(GL_INVALID_ENUM);
\r
3646 case GL_TEXTURE_MIN_LOD:
\r
3647 if(clientVersion >= 3)
\r
3649 *params = texture->getMinLOD();
\r
3652 else return error(GL_INVALID_ENUM);
\r
3653 case GL_TEXTURE_SWIZZLE_R:
\r
3654 if(clientVersion >= 3)
\r
3656 *params = (GLfloat)texture->getSwizzleR();
\r
3659 else return error(GL_INVALID_ENUM);
\r
3660 case GL_TEXTURE_SWIZZLE_G:
\r
3661 if(clientVersion >= 3)
\r
3663 *params = (GLfloat)texture->getSwizzleG();
\r
3666 else return error(GL_INVALID_ENUM);
\r
3667 case GL_TEXTURE_SWIZZLE_B:
\r
3668 if(clientVersion >= 3)
\r
3670 *params = (GLfloat)texture->getSwizzleB();
\r
3673 else return error(GL_INVALID_ENUM);
\r
3674 case GL_TEXTURE_SWIZZLE_A:
\r
3675 if(clientVersion >= 3)
\r
3677 *params = (GLfloat)texture->getSwizzleA();
\r
3680 else return error(GL_INVALID_ENUM);
\r
3682 return error(GL_INVALID_ENUM);
\r
3687 void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
\r
3689 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = %p)", target, pname, params);
\r
3691 es2::Context *context = es2::getContext();
\r
3695 es2::Texture *texture;
\r
3697 GLint clientVersion = context->getClientVersion();
\r
3701 case GL_TEXTURE_2D:
\r
3702 texture = context->getTexture2D();
\r
3704 case GL_TEXTURE_CUBE_MAP:
\r
3705 texture = context->getTextureCubeMap();
\r
3707 case GL_TEXTURE_EXTERNAL_OES:
\r
3708 texture = context->getTextureExternal();
\r
3710 case GL_TEXTURE_2D_ARRAY:
\r
3711 if(clientVersion < 3)
\r
3713 return error(GL_INVALID_ENUM);
\r
3717 texture = context->getTexture2DArray();
\r
3720 case GL_TEXTURE_3D_OES:
\r
3721 texture = context->getTexture3D();
\r
3724 return error(GL_INVALID_ENUM);
\r
3729 case GL_TEXTURE_MAG_FILTER:
\r
3730 *params = texture->getMagFilter();
\r
3732 case GL_TEXTURE_MIN_FILTER:
\r
3733 *params = texture->getMinFilter();
\r
3735 case GL_TEXTURE_WRAP_S:
\r
3736 *params = texture->getWrapS();
\r
3738 case GL_TEXTURE_WRAP_T:
\r
3739 *params = texture->getWrapT();
\r
3741 case GL_TEXTURE_WRAP_R_OES:
\r
3742 *params = texture->getWrapR();
\r
3744 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
\r
3745 *params = (GLint)texture->getMaxAnisotropy();
\r
3747 case GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES:
\r
3750 case GL_TEXTURE_BASE_LEVEL:
\r
3751 if(clientVersion >= 3)
\r
3753 *params = texture->getBaseLevel();
\r
3756 else return error(GL_INVALID_ENUM);
\r
3757 case GL_TEXTURE_COMPARE_FUNC:
\r
3758 if(clientVersion >= 3)
\r
3760 *params = (GLint)texture->getCompareFunc();
\r
3763 else return error(GL_INVALID_ENUM);
\r
3764 case GL_TEXTURE_COMPARE_MODE:
\r
3765 if(clientVersion >= 3)
\r
3767 *params = (GLint)texture->getCompareMode();
\r
3770 else return error(GL_INVALID_ENUM);
\r
3771 case GL_TEXTURE_IMMUTABLE_FORMAT:
\r
3772 if(clientVersion >= 3)
\r
3774 *params = (GLint)texture->getImmutableFormat();
\r
3777 else return error(GL_INVALID_ENUM);
\r
3778 case GL_TEXTURE_IMMUTABLE_LEVELS:
\r
3779 if(clientVersion >= 3)
\r
3781 *params = (GLint)texture->getImmutableLevels();
\r
3784 else return error(GL_INVALID_ENUM);
\r
3785 case GL_TEXTURE_MAX_LEVEL:
\r
3786 if(clientVersion >= 3)
\r
3788 *params = texture->getMaxLevel();
\r
3791 else return error(GL_INVALID_ENUM);
\r
3792 case GL_TEXTURE_MAX_LOD:
\r
3793 if(clientVersion >= 3)
\r
3795 *params = (GLint)roundf(texture->getMaxLOD());
\r
3798 else return error(GL_INVALID_ENUM);
\r
3799 case GL_TEXTURE_MIN_LOD:
\r
3800 if(clientVersion >= 3)
\r
3802 *params = (GLint)roundf(texture->getMinLOD());
\r
3805 else return error(GL_INVALID_ENUM);
\r
3806 case GL_TEXTURE_SWIZZLE_R:
\r
3807 if(clientVersion >= 3)
\r
3809 *params = (GLint)texture->getSwizzleR();
\r
3812 else return error(GL_INVALID_ENUM);
\r
3813 case GL_TEXTURE_SWIZZLE_G:
\r
3814 if(clientVersion >= 3)
\r
3816 *params = (GLint)texture->getSwizzleG();
\r
3819 else return error(GL_INVALID_ENUM);
\r
3820 case GL_TEXTURE_SWIZZLE_B:
\r
3821 if(clientVersion >= 3)
\r
3823 *params = (GLint)texture->getSwizzleB();
\r
3826 else return error(GL_INVALID_ENUM);
\r
3827 case GL_TEXTURE_SWIZZLE_A:
\r
3828 if(clientVersion >= 3)
\r
3830 *params = (GLint)texture->getSwizzleA();
\r
3833 else return error(GL_INVALID_ENUM);
\r
3835 return error(GL_INVALID_ENUM);
\r
3840 void GetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
\r
3842 TRACE("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = %p)",
\r
3843 program, location, bufSize, params);
\r
3847 return error(GL_INVALID_VALUE);
\r
3850 es2::Context *context = es2::getContext();
\r
3856 return error(GL_INVALID_VALUE);
\r
3859 es2::Program *programObject = context->getProgram(program);
\r
3861 if(!programObject || !programObject->isLinked())
\r
3863 return error(GL_INVALID_OPERATION);
\r
3866 if(!programObject->getUniformfv(location, &bufSize, params))
\r
3868 return error(GL_INVALID_OPERATION);
\r
3873 void GetUniformfv(GLuint program, GLint location, GLfloat* params)
\r
3875 TRACE("(GLuint program = %d, GLint location = %d, GLfloat* params = %p)", program, location, params);
\r
3877 es2::Context *context = es2::getContext();
\r
3883 return error(GL_INVALID_VALUE);
\r
3886 es2::Program *programObject = context->getProgram(program);
\r
3888 if(!programObject || !programObject->isLinked())
\r
3890 return error(GL_INVALID_OPERATION);
\r
3893 if(!programObject->getUniformfv(location, NULL, params))
\r
3895 return error(GL_INVALID_OPERATION);
\r
3900 void GetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
\r
3902 TRACE("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = %p)",
\r
3903 program, location, bufSize, params);
\r
3907 return error(GL_INVALID_VALUE);
\r
3910 es2::Context *context = es2::getContext();
\r
3916 return error(GL_INVALID_VALUE);
\r
3919 es2::Program *programObject = context->getProgram(program);
\r
3921 if(!programObject || !programObject->isLinked())
\r
3923 return error(GL_INVALID_OPERATION);
\r
3926 if(!programObject)
\r
3928 return error(GL_INVALID_OPERATION);
\r
3931 if(!programObject->getUniformiv(location, &bufSize, params))
\r
3933 return error(GL_INVALID_OPERATION);
\r
3938 void GetUniformiv(GLuint program, GLint location, GLint* params)
\r
3940 TRACE("(GLuint program = %d, GLint location = %d, GLint* params = %p)", program, location, params);
\r
3942 es2::Context *context = es2::getContext();
\r
3948 return error(GL_INVALID_VALUE);
\r
3951 es2::Program *programObject = context->getProgram(program);
\r
3953 if(!programObject || !programObject->isLinked())
\r
3955 return error(GL_INVALID_OPERATION);
\r
3958 if(!programObject)
\r
3960 return error(GL_INVALID_OPERATION);
\r
3963 if(!programObject->getUniformiv(location, NULL, params))
\r
3965 return error(GL_INVALID_OPERATION);
\r
3970 int GetUniformLocation(GLuint program, const GLchar* name)
\r
3972 TRACE("(GLuint program = %d, const GLchar* name = %s)", program, name);
\r
3974 es2::Context *context = es2::getContext();
\r
3976 if(strstr(name, "gl_") == name)
\r
3983 es2::Program *programObject = context->getProgram(program);
\r
3985 if(!programObject)
\r
3987 if(context->getShader(program))
\r
3989 return error(GL_INVALID_OPERATION, -1);
\r
3993 return error(GL_INVALID_VALUE, -1);
\r
3997 if(!programObject->isLinked())
\r
3999 return error(GL_INVALID_OPERATION, -1);
\r
4002 return programObject->getUniformLocation(name);
\r
4008 void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
\r
4010 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = %p)", index, pname, params);
\r
4012 es2::Context *context = es2::getContext();
\r
4016 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
4018 return error(GL_INVALID_VALUE);
\r
4021 const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
\r
4023 GLint clientVersion = context->getClientVersion();
\r
4027 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
\r
4028 *params = (GLfloat)(attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
\r
4030 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
\r
4031 *params = (GLfloat)attribState.mSize;
\r
4033 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
\r
4034 *params = (GLfloat)attribState.mStride;
\r
4036 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
\r
4037 *params = (GLfloat)attribState.mType;
\r
4039 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
\r
4040 *params = (GLfloat)(attribState.mNormalized ? GL_TRUE : GL_FALSE);
\r
4042 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
\r
4043 *params = (GLfloat)attribState.mBoundBuffer.name();
\r
4045 case GL_CURRENT_VERTEX_ATTRIB:
\r
4047 const VertexAttribute& attrib = context->getCurrentVertexAttributes()[index];
\r
4048 for(int i = 0; i < 4; ++i)
\r
4050 params[i] = attrib.getCurrentValueF(i);
\r
4054 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
\r
4055 if(clientVersion >= 3)
\r
4057 switch(attribState.mType)
\r
4060 case GL_UNSIGNED_BYTE:
\r
4062 case GL_UNSIGNED_SHORT:
\r
4064 case GL_INT_2_10_10_10_REV:
\r
4065 case GL_UNSIGNED_INT:
\r
4067 *params = (GLfloat)GL_TRUE;
\r
4070 *params = (GLfloat)GL_FALSE;
\r
4075 else return error(GL_INVALID_ENUM);
\r
4076 default: return error(GL_INVALID_ENUM);
\r
4081 void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
\r
4083 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = %p)", index, pname, params);
\r
4085 es2::Context *context = es2::getContext();
\r
4089 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
4091 return error(GL_INVALID_VALUE);
\r
4094 const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
\r
4096 GLint clientVersion = context->getClientVersion();
\r
4100 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
\r
4101 *params = (attribState.mArrayEnabled ? GL_TRUE : GL_FALSE);
\r
4103 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
\r
4104 *params = attribState.mSize;
\r
4106 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
\r
4107 *params = attribState.mStride;
\r
4109 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
\r
4110 *params = attribState.mType;
\r
4112 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
\r
4113 *params = (attribState.mNormalized ? GL_TRUE : GL_FALSE);
\r
4115 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
\r
4116 *params = attribState.mBoundBuffer.name();
\r
4118 case GL_CURRENT_VERTEX_ATTRIB:
\r
4120 const VertexAttribute& attrib = context->getCurrentVertexAttributes()[index];
\r
4121 for(int i = 0; i < 4; ++i)
\r
4123 float currentValue = attrib.getCurrentValueF(i);
\r
4124 params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
\r
4128 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
\r
4129 if(clientVersion >= 3)
\r
4131 switch(attribState.mType)
\r
4134 case GL_UNSIGNED_BYTE:
\r
4136 case GL_UNSIGNED_SHORT:
\r
4138 case GL_INT_2_10_10_10_REV:
\r
4139 case GL_UNSIGNED_INT:
\r
4141 *params = GL_TRUE;
\r
4144 *params = GL_FALSE;
\r
4149 else return error(GL_INVALID_ENUM);
\r
4150 default: return error(GL_INVALID_ENUM);
\r
4155 void GetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
\r
4157 TRACE("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = %p)", index, pname, pointer);
\r
4159 es2::Context *context = es2::getContext();
\r
4163 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
4165 return error(GL_INVALID_VALUE);
\r
4168 if(pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
\r
4170 return error(GL_INVALID_ENUM);
\r
4173 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
\r
4177 void Hint(GLenum target, GLenum mode)
\r
4179 TRACE("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
\r
4185 case GL_DONT_CARE:
\r
4188 return error(GL_INVALID_ENUM);
\r
4191 es2::Context *context = es2::getContext();
\r
4194 case GL_GENERATE_MIPMAP_HINT:
\r
4195 if(context) context->setGenerateMipmapHint(mode);
\r
4197 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
\r
4198 if(context) context->setFragmentShaderDerivativeHint(mode);
\r
4201 return error(GL_INVALID_ENUM);
\r
4205 GLboolean IsBuffer(GLuint buffer)
\r
4207 TRACE("(GLuint buffer = %d)", buffer);
\r
4209 es2::Context *context = es2::getContext();
\r
4211 if(context && buffer)
\r
4213 es2::Buffer *bufferObject = context->getBuffer(buffer);
\r
4224 GLboolean IsEnabled(GLenum cap)
\r
4226 TRACE("(GLenum cap = 0x%X)", cap);
\r
4228 es2::Context *context = es2::getContext();
\r
4232 GLint clientVersion = context->getClientVersion();
\r
4236 case GL_CULL_FACE: return context->isCullFaceEnabled();
\r
4237 case GL_POLYGON_OFFSET_FILL: return context->isPolygonOffsetFillEnabled();
\r
4238 case GL_SAMPLE_ALPHA_TO_COVERAGE: return context->isSampleAlphaToCoverageEnabled();
\r
4239 case GL_SAMPLE_COVERAGE: return context->isSampleCoverageEnabled();
\r
4240 case GL_SCISSOR_TEST: return context->isScissorTestEnabled();
\r
4241 case GL_STENCIL_TEST: return context->isStencilTestEnabled();
\r
4242 case GL_DEPTH_TEST: return context->isDepthTestEnabled();
\r
4243 case GL_BLEND: return context->isBlendEnabled();
\r
4244 case GL_DITHER: return context->isDitherEnabled();
\r
4245 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
\r
4246 if(clientVersion >= 3)
\r
4248 return context->isPrimitiveRestartFixedIndexEnabled();
\r
4250 else return error(GL_INVALID_ENUM, false);
\r
4251 case GL_RASTERIZER_DISCARD:
\r
4252 if(clientVersion >= 3)
\r
4254 return context->isRasterizerDiscardEnabled();
\r
4256 else return error(GL_INVALID_ENUM, false);
\r
4258 return error(GL_INVALID_ENUM, false);
\r
4265 GLboolean IsFenceNV(GLuint fence)
\r
4267 TRACE("(GLuint fence = %d)", fence);
\r
4269 es2::Context *context = es2::getContext();
\r
4273 es2::Fence *fenceObject = context->getFence(fence);
\r
4275 if(fenceObject == NULL)
\r
4280 return fenceObject->isFence();
\r
4286 GLboolean IsFramebuffer(GLuint framebuffer)
\r
4288 TRACE("(GLuint framebuffer = %d)", framebuffer);
\r
4290 es2::Context *context = es2::getContext();
\r
4292 if(context && framebuffer)
\r
4294 es2::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
\r
4296 if(framebufferObject)
\r
4305 GLboolean IsProgram(GLuint program)
\r
4307 TRACE("(GLuint program = %d)", program);
\r
4309 es2::Context *context = es2::getContext();
\r
4311 if(context && program)
\r
4313 es2::Program *programObject = context->getProgram(program);
\r
4324 GLboolean IsQueryEXT(GLuint name)
\r
4326 TRACE("(GLuint name = %d)", name);
\r
4333 es2::Context *context = es2::getContext();
\r
4337 es2::Query *queryObject = context->getQuery(name);
\r
4348 GLboolean IsRenderbuffer(GLuint renderbuffer)
\r
4350 TRACE("(GLuint renderbuffer = %d)", renderbuffer);
\r
4352 es2::Context *context = es2::getContext();
\r
4354 if(context && renderbuffer)
\r
4356 es2::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
\r
4358 if(renderbufferObject)
\r
4367 GLboolean IsShader(GLuint shader)
\r
4369 TRACE("(GLuint shader = %d)", shader);
\r
4371 es2::Context *context = es2::getContext();
\r
4373 if(context && shader)
\r
4375 es2::Shader *shaderObject = context->getShader(shader);
\r
4386 GLboolean IsTexture(GLuint texture)
\r
4388 TRACE("(GLuint texture = %d)", texture);
\r
4390 es2::Context *context = es2::getContext();
\r
4392 if(context && texture)
\r
4394 es2::Texture *textureObject = context->getTexture(texture);
\r
4405 void LineWidth(GLfloat width)
\r
4407 TRACE("(GLfloat width = %f)", width);
\r
4411 return error(GL_INVALID_VALUE);
\r
4414 es2::Context *context = es2::getContext();
\r
4418 context->setLineWidth(width);
\r
4422 void LinkProgram(GLuint program)
\r
4424 TRACE("(GLuint program = %d)", program);
\r
4426 es2::Context *context = es2::getContext();
\r
4430 es2::Program *programObject = context->getProgram(program);
\r
4432 if(!programObject)
\r
4434 if(context->getShader(program))
\r
4436 return error(GL_INVALID_OPERATION);
\r
4440 return error(GL_INVALID_VALUE);
\r
4444 programObject->link();
\r
4448 void PixelStorei(GLenum pname, GLint param)
\r
4450 TRACE("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
\r
4452 es2::Context *context = es2::getContext();
\r
4456 GLint clientVersion = context->getClientVersion();
\r
4460 case GL_UNPACK_ALIGNMENT:
\r
4461 if(param != 1 && param != 2 && param != 4 && param != 8)
\r
4463 return error(GL_INVALID_VALUE);
\r
4465 context->setUnpackAlignment(param);
\r
4467 case GL_PACK_ALIGNMENT:
\r
4468 if(param != 1 && param != 2 && param != 4 && param != 8)
\r
4470 return error(GL_INVALID_VALUE);
\r
4472 context->setPackAlignment(param);
\r
4474 case GL_PACK_ROW_LENGTH:
\r
4475 if(clientVersion >= 3)
\r
4479 return error(GL_INVALID_VALUE);
\r
4481 context->setPackRowLength(param);
\r
4484 else return error(GL_INVALID_ENUM);
\r
4485 case GL_PACK_SKIP_PIXELS:
\r
4486 if(clientVersion >= 3)
\r
4490 return error(GL_INVALID_VALUE);
\r
4492 context->setPackSkipPixels(param);
\r
4495 else return error(GL_INVALID_ENUM);
\r
4496 case GL_PACK_SKIP_ROWS:
\r
4497 if(clientVersion >= 3)
\r
4501 return error(GL_INVALID_VALUE);
\r
4503 context->setPackSkipRows(param);
\r
4506 else return error(GL_INVALID_ENUM);
\r
4507 case GL_UNPACK_ROW_LENGTH:
\r
4508 if(clientVersion >= 3)
\r
4512 return error(GL_INVALID_VALUE);
\r
4514 context->setUnpackRowLength(param);
\r
4517 else return error(GL_INVALID_ENUM);
\r
4518 case GL_UNPACK_IMAGE_HEIGHT:
\r
4519 if(clientVersion >= 3)
\r
4523 return error(GL_INVALID_VALUE);
\r
4525 context->setUnpackImageHeight(param);
\r
4528 else return error(GL_INVALID_ENUM);
\r
4529 case GL_UNPACK_SKIP_PIXELS:
\r
4530 if(clientVersion >= 3)
\r
4534 return error(GL_INVALID_VALUE);
\r
4536 context->setUnpackSkipPixels(param);
\r
4539 else return error(GL_INVALID_ENUM);
\r
4540 case GL_UNPACK_SKIP_ROWS:
\r
4541 if(clientVersion >= 3)
\r
4545 return error(GL_INVALID_VALUE);
\r
4547 context->setUnpackSkipRows(param);
\r
4550 else return error(GL_INVALID_ENUM);
\r
4551 case GL_UNPACK_SKIP_IMAGES:
\r
4552 if(clientVersion >= 3) {
\r
4555 return error(GL_INVALID_VALUE);
\r
4557 context->setUnpackSkipImages(param);
\r
4560 else return error(GL_INVALID_ENUM);
\r
4562 return error(GL_INVALID_ENUM);
\r
4567 void PolygonOffset(GLfloat factor, GLfloat units)
\r
4569 TRACE("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
\r
4571 es2::Context *context = es2::getContext();
\r
4575 context->setPolygonOffsetParams(factor, units);
\r
4579 void ReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
\r
4580 GLenum format, GLenum type, GLsizei bufSize, GLvoid *data)
\r
4582 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
\r
4583 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = %p)",
\r
4584 x, y, width, height, format, type, bufSize, data);
\r
4586 if(width < 0 || height < 0 || bufSize < 0)
\r
4588 return error(GL_INVALID_VALUE);
\r
4591 es2::Context *context = es2::getContext();
\r
4595 context->readPixels(x, y, width, height, format, type, &bufSize, data);
\r
4599 void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels)
\r
4601 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
\r
4602 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = %p)",
\r
4603 x, y, width, height, format, type, pixels);
\r
4605 if(width < 0 || height < 0)
\r
4607 return error(GL_INVALID_VALUE);
\r
4610 es2::Context *context = es2::getContext();
\r
4614 context->readPixels(x, y, width, height, format, type, NULL, pixels);
\r
4618 void ReleaseShaderCompiler(void)
\r
4622 es2::Shader::releaseCompiler();
\r
4625 void RenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
\r
4627 TRACE("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
\r
4628 target, samples, internalformat, width, height);
\r
4632 case GL_RENDERBUFFER:
\r
4635 return error(GL_INVALID_ENUM);
\r
4638 if(width < 0 || height < 0 || samples < 0)
\r
4640 return error(GL_INVALID_VALUE);
\r
4643 es2::Context *context = es2::getContext();
\r
4647 if(width > es2::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE ||
\r
4648 height > es2::IMPLEMENTATION_MAX_RENDERBUFFER_SIZE ||
\r
4649 samples > es2::IMPLEMENTATION_MAX_SAMPLES)
\r
4651 return error(GL_INVALID_VALUE);
\r
4654 GLuint handle = context->getRenderbufferName();
\r
4657 return error(GL_INVALID_OPERATION);
\r
4660 GLint clientVersion = context->getClientVersion();
\r
4661 switch(internalformat)
\r
4663 case GL_DEPTH_COMPONENT32F:
\r
4664 if(clientVersion < 3)
\r
4666 return error(GL_INVALID_ENUM);
\r
4669 case GL_DEPTH_COMPONENT16:
\r
4670 case GL_DEPTH_COMPONENT24:
\r
4671 case GL_DEPTH_COMPONENT32_OES:
\r
4672 context->setRenderbufferStorage(new es2::Depthbuffer(width, height, internalformat, samples));
\r
4688 case GL_SRGB8_ALPHA8:
\r
4692 case GL_RGB10_A2UI:
\r
4699 case GL_R11F_G11F_B10F:
\r
4705 if(clientVersion < 3)
\r
4707 return error(GL_INVALID_ENUM);
\r
4714 case GL_RGBA8_OES:
\r
4715 context->setRenderbufferStorage(new es2::Colorbuffer(width, height, internalformat, samples));
\r
4717 case GL_STENCIL_INDEX8:
\r
4718 context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples));
\r
4720 case GL_DEPTH32F_STENCIL8:
\r
4721 if(clientVersion < 3)
\r
4723 return error(GL_INVALID_ENUM);
\r
4726 case GL_DEPTH24_STENCIL8_OES:
\r
4727 context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, internalformat, samples));
\r
4730 return error(GL_INVALID_ENUM);
\r
4735 void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
\r
4737 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
\r
4740 void SampleCoverage(GLclampf value, GLboolean invert)
\r
4742 TRACE("(GLclampf value = %f, GLboolean invert = %d)", value, invert);
\r
4744 es2::Context* context = es2::getContext();
\r
4748 context->setSampleCoverageParams(es2::clamp01(value), invert == GL_TRUE);
\r
4752 void SetFenceNV(GLuint fence, GLenum condition)
\r
4754 TRACE("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
\r
4756 if(condition != GL_ALL_COMPLETED_NV)
\r
4758 return error(GL_INVALID_ENUM);
\r
4761 es2::Context *context = es2::getContext();
\r
4765 es2::Fence *fenceObject = context->getFence(fence);
\r
4767 if(fenceObject == NULL)
\r
4769 return error(GL_INVALID_OPERATION);
\r
4772 fenceObject->setFence(condition);
\r
4776 void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
\r
4778 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
\r
4780 if(width < 0 || height < 0)
\r
4782 return error(GL_INVALID_VALUE);
\r
4785 es2::Context* context = es2::getContext();
\r
4789 context->setScissorParams(x, y, width, height);
\r
4793 void ShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
\r
4795 TRACE("(GLsizei n = %d, const GLuint* shaders = %p, GLenum binaryformat = 0x%X, "
\r
4796 "const GLvoid* binary = %p, GLsizei length = %d)",
\r
4797 n, shaders, binaryformat, binary, length);
\r
4799 // No binary shader formats are supported.
\r
4800 return error(GL_INVALID_ENUM);
\r
4803 void ShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
\r
4805 TRACE("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = %p, const GLint* length = %p)",
\r
4806 shader, count, string, length);
\r
4810 return error(GL_INVALID_VALUE);
\r
4813 es2::Context *context = es2::getContext();
\r
4817 es2::Shader *shaderObject = context->getShader(shader);
\r
4821 if(context->getProgram(shader))
\r
4823 return error(GL_INVALID_OPERATION);
\r
4827 return error(GL_INVALID_VALUE);
\r
4831 shaderObject->setSource(count, string, length);
\r
4835 void StencilFunc(GLenum func, GLint ref, GLuint mask)
\r
4837 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
\r
4840 void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
\r
4842 TRACE("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
\r
4848 case GL_FRONT_AND_BACK:
\r
4851 return error(GL_INVALID_ENUM);
\r
4866 return error(GL_INVALID_ENUM);
\r
4869 es2::Context *context = es2::getContext();
\r
4873 if(face == GL_FRONT || face == GL_FRONT_AND_BACK)
\r
4875 context->setStencilParams(func, ref, mask);
\r
4878 if(face == GL_BACK || face == GL_FRONT_AND_BACK)
\r
4880 context->setStencilBackParams(func, ref, mask);
\r
4885 void StencilMask(GLuint mask)
\r
4887 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
\r
4890 void StencilMaskSeparate(GLenum face, GLuint mask)
\r
4892 TRACE("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
\r
4898 case GL_FRONT_AND_BACK:
\r
4901 return error(GL_INVALID_ENUM);
\r
4904 es2::Context *context = es2::getContext();
\r
4908 if(face == GL_FRONT || face == GL_FRONT_AND_BACK)
\r
4910 context->setStencilWritemask(mask);
\r
4913 if(face == GL_BACK || face == GL_FRONT_AND_BACK)
\r
4915 context->setStencilBackWritemask(mask);
\r
4920 void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
\r
4922 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
\r
4925 void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
\r
4927 TRACE("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
\r
4928 face, fail, zfail, zpass);
\r
4934 case GL_FRONT_AND_BACK:
\r
4937 return error(GL_INVALID_ENUM);
\r
4948 case GL_INCR_WRAP:
\r
4949 case GL_DECR_WRAP:
\r
4952 return error(GL_INVALID_ENUM);
\r
4963 case GL_INCR_WRAP:
\r
4964 case GL_DECR_WRAP:
\r
4967 return error(GL_INVALID_ENUM);
\r
4978 case GL_INCR_WRAP:
\r
4979 case GL_DECR_WRAP:
\r
4982 return error(GL_INVALID_ENUM);
\r
4985 es2::Context *context = es2::getContext();
\r
4989 if(face == GL_FRONT || face == GL_FRONT_AND_BACK)
\r
4991 context->setStencilOperations(fail, zfail, zpass);
\r
4994 if(face == GL_BACK || face == GL_FRONT_AND_BACK)
\r
4996 context->setStencilBackOperations(fail, zfail, zpass);
\r
5001 GLboolean TestFenceNV(GLuint fence)
\r
5003 TRACE("(GLuint fence = %d)", fence);
\r
5005 es2::Context *context = es2::getContext();
\r
5009 es2::Fence *fenceObject = context->getFence(fence);
\r
5011 if(fenceObject == NULL)
\r
5013 return error(GL_INVALID_OPERATION, GL_TRUE);
\r
5016 return fenceObject->testFence();
\r
5022 void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
\r
5023 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
\r
5025 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
\r
5026 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = %p)",
\r
5027 target, level, internalformat, width, height, border, format, type, pixels);
\r
5029 if(!validImageSize(level, width, height))
\r
5031 return error(GL_INVALID_VALUE);
\r
5034 es2::Context *context = es2::getContext();
\r
5038 GLint clientVersion = context->getClientVersion();
\r
5039 if(clientVersion < 3)
\r
5041 if(internalformat != (GLint)format)
\r
5043 return error(GL_INVALID_OPERATION);
\r
5047 GLenum validationError = ValidateCompressedFormat(format, clientVersion, false);
\r
5048 if(validationError != GL_NONE)
\r
5050 return error(validationError);
\r
5053 if(!ValidateTextureFormatType(format, type, internalformat, egl::getClientVersion()))
\r
5060 return error(GL_INVALID_VALUE);
\r
5065 case GL_TEXTURE_2D:
\r
5066 if(width > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||
\r
5067 height > (es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))
\r
5069 return error(GL_INVALID_VALUE);
\r
5072 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
\r
5073 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
\r
5074 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
\r
5075 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
\r
5076 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
\r
5077 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
\r
5078 if(width != height)
\r
5080 return error(GL_INVALID_VALUE);
\r
5083 if(width > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level) ||
\r
5084 height > (es2::IMPLEMENTATION_MAX_CUBE_MAP_TEXTURE_SIZE >> level))
\r
5086 return error(GL_INVALID_VALUE);
\r
5090 return error(GL_INVALID_ENUM);
\r
5093 GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);
\r
5095 if(target == GL_TEXTURE_2D)
\r
5097 es2::Texture2D *texture = context->getTexture2D();
\r
5101 return error(GL_INVALID_OPERATION);
\r
5104 texture->setImage(level, width, height, sizedInternalFormat, type, context->getUnpackInfo(), pixels);
\r
5108 es2::TextureCubeMap *texture = context->getTextureCubeMap();
\r
5112 return error(GL_INVALID_OPERATION);
\r
5115 texture->setImage(target, level, width, height, sizedInternalFormat, type, context->getUnpackInfo(), pixels);
\r
5120 void TexParameterf(GLenum target, GLenum pname, GLfloat param)
\r
5122 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat param = %f)", target, pname, param);
\r
5124 es2::Context *context = es2::getContext();
\r
5128 es2::Texture *texture;
\r
5130 GLint clientVersion = context->getClientVersion();
\r
5134 case GL_TEXTURE_2D:
\r
5135 texture = context->getTexture2D();
\r
5137 case GL_TEXTURE_2D_ARRAY:
\r
5138 if(clientVersion < 3)
\r
5140 return error(GL_INVALID_ENUM);
\r
5144 texture = context->getTexture2DArray();
\r
5147 case GL_TEXTURE_3D_OES:
\r
5148 texture = context->getTexture3D();
\r
5150 case GL_TEXTURE_CUBE_MAP:
\r
5151 texture = context->getTextureCubeMap();
\r
5153 case GL_TEXTURE_EXTERNAL_OES:
\r
5154 texture = context->getTextureExternal();
\r
5157 return error(GL_INVALID_ENUM);
\r
5162 case GL_TEXTURE_WRAP_S:
\r
5163 if(!texture->setWrapS((GLenum)param))
\r
5165 return error(GL_INVALID_ENUM);
\r
5168 case GL_TEXTURE_WRAP_T:
\r
5169 if(!texture->setWrapT((GLenum)param))
\r
5171 return error(GL_INVALID_ENUM);
\r
5174 case GL_TEXTURE_WRAP_R_OES:
\r
5175 if(!texture->setWrapR((GLenum)param))
\r
5177 return error(GL_INVALID_ENUM);
\r
5180 case GL_TEXTURE_MIN_FILTER:
\r
5181 if(!texture->setMinFilter((GLenum)param))
\r
5183 return error(GL_INVALID_ENUM);
\r
5186 case GL_TEXTURE_MAG_FILTER:
\r
5187 if(!texture->setMagFilter((GLenum)param))
\r
5189 return error(GL_INVALID_ENUM);
\r
5192 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
\r
5193 if(!texture->setMaxAnisotropy(param))
\r
5195 return error(GL_INVALID_VALUE);
\r
5198 case GL_TEXTURE_BASE_LEVEL:
\r
5199 if(clientVersion < 3 || !texture->setBaseLevel((GLint)(roundf(param))))
\r
5201 return error(GL_INVALID_VALUE);
\r
5204 case GL_TEXTURE_COMPARE_FUNC:
\r
5205 if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param))
\r
5207 return error(GL_INVALID_VALUE);
\r
5210 case GL_TEXTURE_COMPARE_MODE:
\r
5211 if(clientVersion < 3 || !texture->setCompareMode((GLenum)param))
\r
5213 return error(GL_INVALID_VALUE);
\r
5216 case GL_TEXTURE_MAX_LEVEL:
\r
5217 if(clientVersion < 3 || !texture->setMaxLevel((GLint)(roundf(param))))
\r
5219 return error(GL_INVALID_VALUE);
\r
5222 case GL_TEXTURE_MAX_LOD:
\r
5223 if(clientVersion < 3 || !texture->setMaxLOD(param))
\r
5225 return error(GL_INVALID_VALUE);
\r
5228 case GL_TEXTURE_MIN_LOD:
\r
5229 if(clientVersion < 3 || !texture->setMinLOD(param))
\r
5231 return error(GL_INVALID_VALUE);
\r
5234 case GL_TEXTURE_SWIZZLE_R:
\r
5235 if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param))
\r
5237 return error(GL_INVALID_VALUE);
\r
5240 case GL_TEXTURE_SWIZZLE_G:
\r
5241 if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param))
\r
5243 return error(GL_INVALID_VALUE);
\r
5246 case GL_TEXTURE_SWIZZLE_B:
\r
5247 if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param))
\r
5249 return error(GL_INVALID_VALUE);
\r
5252 case GL_TEXTURE_SWIZZLE_A:
\r
5253 if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param))
\r
5255 return error(GL_INVALID_VALUE);
\r
5259 return error(GL_INVALID_ENUM);
\r
5264 void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
\r
5266 glTexParameterf(target, pname, *params);
\r
5269 void TexParameteri(GLenum target, GLenum pname, GLint param)
\r
5271 TRACE("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
\r
5273 es2::Context *context = es2::getContext();
\r
5277 es2::Texture *texture;
\r
5279 GLint clientVersion = context->getClientVersion();
\r
5283 case GL_TEXTURE_2D:
\r
5284 texture = context->getTexture2D();
\r
5286 case GL_TEXTURE_2D_ARRAY:
\r
5287 if(clientVersion < 3)
\r
5289 return error(GL_INVALID_ENUM);
\r
5293 texture = context->getTexture2DArray();
\r
5296 case GL_TEXTURE_3D_OES:
\r
5297 texture = context->getTexture3D();
\r
5299 case GL_TEXTURE_CUBE_MAP:
\r
5300 texture = context->getTextureCubeMap();
\r
5302 case GL_TEXTURE_EXTERNAL_OES:
\r
5303 texture = context->getTextureExternal();
\r
5306 return error(GL_INVALID_ENUM);
\r
5311 case GL_TEXTURE_WRAP_S:
\r
5312 if(!texture->setWrapS((GLenum)param))
\r
5314 return error(GL_INVALID_ENUM);
\r
5317 case GL_TEXTURE_WRAP_T:
\r
5318 if(!texture->setWrapT((GLenum)param))
\r
5320 return error(GL_INVALID_ENUM);
\r
5323 case GL_TEXTURE_WRAP_R_OES:
\r
5324 if(!texture->setWrapR((GLenum)param))
\r
5326 return error(GL_INVALID_ENUM);
\r
5329 case GL_TEXTURE_MIN_FILTER:
\r
5330 if(!texture->setMinFilter((GLenum)param))
\r
5332 return error(GL_INVALID_ENUM);
\r
5335 case GL_TEXTURE_MAG_FILTER:
\r
5336 if(!texture->setMagFilter((GLenum)param))
\r
5338 return error(GL_INVALID_ENUM);
\r
5341 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
\r
5342 if(!texture->setMaxAnisotropy((GLfloat)param))
\r
5344 return error(GL_INVALID_VALUE);
\r
5347 case GL_TEXTURE_BASE_LEVEL:
\r
5348 if(clientVersion < 3 || !texture->setBaseLevel(param))
\r
5350 return error(GL_INVALID_VALUE);
\r
5353 case GL_TEXTURE_COMPARE_FUNC:
\r
5354 if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param))
\r
5356 return error(GL_INVALID_VALUE);
\r
5359 case GL_TEXTURE_COMPARE_MODE:
\r
5360 if(clientVersion < 3 || !texture->setCompareMode((GLenum)param))
\r
5362 return error(GL_INVALID_VALUE);
\r
5365 case GL_TEXTURE_MAX_LEVEL:
\r
5366 if(clientVersion < 3 || !texture->setMaxLevel(param))
\r
5368 return error(GL_INVALID_VALUE);
\r
5371 case GL_TEXTURE_MAX_LOD:
\r
5372 if(clientVersion < 3 || !texture->setMaxLOD((GLfloat)param))
\r
5374 return error(GL_INVALID_VALUE);
\r
5377 case GL_TEXTURE_MIN_LOD:
\r
5378 if(clientVersion < 3 || !texture->setMinLOD((GLfloat)param))
\r
5380 return error(GL_INVALID_VALUE);
\r
5383 case GL_TEXTURE_SWIZZLE_R:
\r
5384 if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param))
\r
5386 return error(GL_INVALID_VALUE);
\r
5389 case GL_TEXTURE_SWIZZLE_G:
\r
5390 if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param))
\r
5392 return error(GL_INVALID_VALUE);
\r
5395 case GL_TEXTURE_SWIZZLE_B:
\r
5396 if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param))
\r
5398 return error(GL_INVALID_VALUE);
\r
5401 case GL_TEXTURE_SWIZZLE_A:
\r
5402 if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param))
\r
5404 return error(GL_INVALID_VALUE);
\r
5408 return error(GL_INVALID_ENUM);
\r
5413 void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
\r
5415 glTexParameteri(target, pname, *params);
\r
5418 void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
\r
5419 GLenum format, GLenum type, const GLvoid* pixels)
\r
5421 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
5422 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
\r
5423 "const GLvoid* pixels = %p)",
\r
5424 target, level, xoffset, yoffset, width, height, format, type, pixels);
\r
5426 if(!es2::IsTextureTarget(target))
\r
5428 return error(GL_INVALID_ENUM);
\r
5431 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
\r
5433 return error(GL_INVALID_VALUE);
\r
5436 if(xoffset < 0 || yoffset < 0 || width < 0 || height < 0)
\r
5438 return error(GL_INVALID_VALUE);
\r
5441 if(std::numeric_limits<GLsizei>::max() - xoffset < width || std::numeric_limits<GLsizei>::max() - yoffset < height)
\r
5443 return error(GL_INVALID_VALUE);
\r
5446 if(!ValidateTextureFormatType(format, type, format, egl::getClientVersion()))
\r
5451 if(width == 0 || height == 0 || !pixels)
\r
5456 es2::Context *context = es2::getContext();
\r
5460 GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);
\r
5462 if(target == GL_TEXTURE_2D)
\r
5464 es2::Texture2D *texture = context->getTexture2D();
\r
5466 GLenum validationError = ValidateSubImageParams(false, width, height, xoffset, yoffset, target, level, sizedInternalFormat, texture);
\r
5468 if(validationError == GL_NONE)
\r
5470 texture->subImage(level, xoffset, yoffset, width, height, sizedInternalFormat, type, context->getUnpackInfo(), pixels);
\r
5474 return error(validationError);
\r
5477 else if(es2::IsCubemapTextureTarget(target))
\r
5479 es2::TextureCubeMap *texture = context->getTextureCubeMap();
\r
5481 GLenum validationError = ValidateSubImageParams(false, width, height, xoffset, yoffset, target, level, sizedInternalFormat, texture);
\r
5483 if(validationError == GL_NONE)
\r
5485 texture->subImage(target, level, xoffset, yoffset, width, height, sizedInternalFormat, type, context->getUnpackInfo(), pixels);
\r
5489 return error(validationError);
\r
5492 else UNREACHABLE(target);
\r
5496 void Uniform1f(GLint location, GLfloat x)
\r
5498 glUniform1fv(location, 1, &x);
\r
5501 void Uniform1fv(GLint location, GLsizei count, const GLfloat* v)
\r
5503 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = %p)", location, count, v);
\r
5507 return error(GL_INVALID_VALUE);
\r
5510 if(location == -1)
\r
5515 es2::Context *context = es2::getContext();
\r
5519 es2::Program *program = context->getCurrentProgram();
\r
5523 return error(GL_INVALID_OPERATION);
\r
5526 if(!program->setUniform1fv(location, count, v))
\r
5528 return error(GL_INVALID_OPERATION);
\r
5533 void Uniform1i(GLint location, GLint x)
\r
5535 glUniform1iv(location, 1, &x);
\r
5538 void Uniform1iv(GLint location, GLsizei count, const GLint* v)
\r
5540 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = %p)", location, count, v);
\r
5544 return error(GL_INVALID_VALUE);
\r
5547 if(location == -1)
\r
5552 es2::Context *context = es2::getContext();
\r
5556 es2::Program *program = context->getCurrentProgram();
\r
5560 return error(GL_INVALID_OPERATION);
\r
5563 if(!program->setUniform1iv(location, count, v))
\r
5565 return error(GL_INVALID_OPERATION);
\r
5570 void Uniform2f(GLint location, GLfloat x, GLfloat y)
\r
5572 GLfloat xy[2] = {x, y};
\r
5574 glUniform2fv(location, 1, (GLfloat*)&xy);
\r
5577 void Uniform2fv(GLint location, GLsizei count, const GLfloat* v)
\r
5579 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = %p)", location, count, v);
\r
5583 return error(GL_INVALID_VALUE);
\r
5586 if(location == -1)
\r
5591 es2::Context *context = es2::getContext();
\r
5595 es2::Program *program = context->getCurrentProgram();
\r
5599 return error(GL_INVALID_OPERATION);
\r
5602 if(!program->setUniform2fv(location, count, v))
\r
5604 return error(GL_INVALID_OPERATION);
\r
5609 void Uniform2i(GLint location, GLint x, GLint y)
\r
5611 GLint xy[4] = {x, y};
\r
5613 glUniform2iv(location, 1, (GLint*)&xy);
\r
5616 void Uniform2iv(GLint location, GLsizei count, const GLint* v)
\r
5618 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = %p)", location, count, v);
\r
5622 return error(GL_INVALID_VALUE);
\r
5625 if(location == -1)
\r
5630 es2::Context *context = es2::getContext();
\r
5634 es2::Program *program = context->getCurrentProgram();
\r
5638 return error(GL_INVALID_OPERATION);
\r
5641 if(!program->setUniform2iv(location, count, v))
\r
5643 return error(GL_INVALID_OPERATION);
\r
5648 void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
\r
5650 GLfloat xyz[3] = {x, y, z};
\r
5652 glUniform3fv(location, 1, (GLfloat*)&xyz);
\r
5655 void Uniform3fv(GLint location, GLsizei count, const GLfloat* v)
\r
5657 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = %p)", location, count, v);
\r
5661 return error(GL_INVALID_VALUE);
\r
5664 if(location == -1)
\r
5669 es2::Context *context = es2::getContext();
\r
5673 es2::Program *program = context->getCurrentProgram();
\r
5677 return error(GL_INVALID_OPERATION);
\r
5680 if(!program->setUniform3fv(location, count, v))
\r
5682 return error(GL_INVALID_OPERATION);
\r
5687 void Uniform3i(GLint location, GLint x, GLint y, GLint z)
\r
5689 GLint xyz[3] = {x, y, z};
\r
5691 glUniform3iv(location, 1, (GLint*)&xyz);
\r
5694 void Uniform3iv(GLint location, GLsizei count, const GLint* v)
\r
5696 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = %p)", location, count, v);
\r
5700 return error(GL_INVALID_VALUE);
\r
5703 if(location == -1)
\r
5708 es2::Context *context = es2::getContext();
\r
5712 es2::Program *program = context->getCurrentProgram();
\r
5716 return error(GL_INVALID_OPERATION);
\r
5719 if(!program->setUniform3iv(location, count, v))
\r
5721 return error(GL_INVALID_OPERATION);
\r
5726 void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
\r
5728 GLfloat xyzw[4] = {x, y, z, w};
\r
5730 glUniform4fv(location, 1, (GLfloat*)&xyzw);
\r
5733 void Uniform4fv(GLint location, GLsizei count, const GLfloat* v)
\r
5735 TRACE("(GLint location = %d, GLsizei count = %d, const GLfloat* v = %p)", location, count, v);
\r
5739 return error(GL_INVALID_VALUE);
\r
5742 if(location == -1)
\r
5747 es2::Context *context = es2::getContext();
\r
5751 es2::Program *program = context->getCurrentProgram();
\r
5755 return error(GL_INVALID_OPERATION);
\r
5758 if(!program->setUniform4fv(location, count, v))
\r
5760 return error(GL_INVALID_OPERATION);
\r
5765 void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
\r
5767 GLint xyzw[4] = {x, y, z, w};
\r
5769 glUniform4iv(location, 1, (GLint*)&xyzw);
\r
5772 void Uniform4iv(GLint location, GLsizei count, const GLint* v)
\r
5774 TRACE("(GLint location = %d, GLsizei count = %d, const GLint* v = %p)", location, count, v);
\r
5778 return error(GL_INVALID_VALUE);
\r
5781 if(location == -1)
\r
5786 es2::Context *context = es2::getContext();
\r
5790 es2::Program *program = context->getCurrentProgram();
\r
5794 return error(GL_INVALID_OPERATION);
\r
5797 if(!program->setUniform4iv(location, count, v))
\r
5799 return error(GL_INVALID_OPERATION);
\r
5804 void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
\r
5806 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",
\r
5807 location, count, transpose, value);
\r
5811 return error(GL_INVALID_VALUE);
\r
5814 if(location == -1)
\r
5819 es2::Context *context = es2::getContext();
\r
5823 if(context->getClientVersion() < 3 && transpose != GL_FALSE)
\r
5825 return error(GL_INVALID_VALUE);
\r
5828 es2::Program *program = context->getCurrentProgram();
\r
5832 return error(GL_INVALID_OPERATION);
\r
5835 if(!program->setUniformMatrix2fv(location, count, transpose, value))
\r
5837 return error(GL_INVALID_OPERATION);
\r
5842 void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
\r
5844 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",
\r
5845 location, count, transpose, value);
\r
5849 return error(GL_INVALID_VALUE);
\r
5852 if(location == -1)
\r
5857 es2::Context *context = es2::getContext();
\r
5861 if(context->getClientVersion() < 3 && transpose != GL_FALSE)
\r
5863 return error(GL_INVALID_VALUE);
\r
5866 es2::Program *program = context->getCurrentProgram();
\r
5870 return error(GL_INVALID_OPERATION);
\r
5873 if(!program->setUniformMatrix3fv(location, count, transpose, value))
\r
5875 return error(GL_INVALID_OPERATION);
\r
5880 void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
\r
5882 TRACE("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %d, const GLfloat* value = %p)",
\r
5883 location, count, transpose, value);
\r
5887 return error(GL_INVALID_VALUE);
\r
5890 if(location == -1)
\r
5895 es2::Context *context = es2::getContext();
\r
5899 if(context->getClientVersion() < 3 && transpose != GL_FALSE)
\r
5901 return error(GL_INVALID_VALUE);
\r
5904 es2::Program *program = context->getCurrentProgram();
\r
5908 return error(GL_INVALID_OPERATION);
\r
5911 if(!program->setUniformMatrix4fv(location, count, transpose, value))
\r
5913 return error(GL_INVALID_OPERATION);
\r
5918 void UseProgram(GLuint program)
\r
5920 TRACE("(GLuint program = %d)", program);
\r
5922 es2::Context *context = es2::getContext();
\r
5926 es2::Program *programObject = context->getProgram(program);
\r
5928 if(!programObject && program != 0)
\r
5930 if(context->getShader(program))
\r
5932 return error(GL_INVALID_OPERATION);
\r
5936 return error(GL_INVALID_VALUE);
\r
5940 if(program != 0 && !programObject->isLinked())
\r
5942 return error(GL_INVALID_OPERATION);
\r
5945 context->useProgram(program);
\r
5949 void ValidateProgram(GLuint program)
\r
5951 TRACE("(GLuint program = %d)", program);
\r
5953 es2::Context *context = es2::getContext();
\r
5957 es2::Program *programObject = context->getProgram(program);
\r
5959 if(!programObject)
\r
5961 if(context->getShader(program))
\r
5963 return error(GL_INVALID_OPERATION);
\r
5967 return error(GL_INVALID_VALUE);
\r
5971 programObject->validate();
\r
5975 void VertexAttrib1f(GLuint index, GLfloat x)
\r
5977 TRACE("(GLuint index = %d, GLfloat x = %f)", index, x);
\r
5979 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
5981 return error(GL_INVALID_VALUE);
\r
5984 es2::Context *context = es2::getContext();
\r
5988 GLfloat vals[4] = { x, 0, 0, 1 };
\r
5989 context->setVertexAttrib(index, vals);
\r
5993 void VertexAttrib1fv(GLuint index, const GLfloat* values)
\r
5995 TRACE("(GLuint index = %d, const GLfloat* values = %p)", index, values);
\r
5997 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
5999 return error(GL_INVALID_VALUE);
\r
6002 es2::Context *context = es2::getContext();
\r
6006 GLfloat vals[4] = { values[0], 0, 0, 1 };
\r
6007 context->setVertexAttrib(index, vals);
\r
6011 void VertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
\r
6013 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
\r
6015 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
6017 return error(GL_INVALID_VALUE);
\r
6020 es2::Context *context = es2::getContext();
\r
6024 GLfloat vals[4] = { x, y, 0, 1 };
\r
6025 context->setVertexAttrib(index, vals);
\r
6029 void VertexAttrib2fv(GLuint index, const GLfloat* values)
\r
6031 TRACE("(GLuint index = %d, const GLfloat* values = %p)", index, values);
\r
6033 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
6035 return error(GL_INVALID_VALUE);
\r
6038 es2::Context *context = es2::getContext();
\r
6042 GLfloat vals[4] = { values[0], values[1], 0, 1 };
\r
6043 context->setVertexAttrib(index, vals);
\r
6047 void VertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
\r
6049 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
\r
6051 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
6053 return error(GL_INVALID_VALUE);
\r
6056 es2::Context *context = es2::getContext();
\r
6060 GLfloat vals[4] = { x, y, z, 1 };
\r
6061 context->setVertexAttrib(index, vals);
\r
6065 void VertexAttrib3fv(GLuint index, const GLfloat* values)
\r
6067 TRACE("(GLuint index = %d, const GLfloat* values = %p)", index, values);
\r
6069 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
6071 return error(GL_INVALID_VALUE);
\r
6074 es2::Context *context = es2::getContext();
\r
6078 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
\r
6079 context->setVertexAttrib(index, vals);
\r
6083 void VertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
\r
6085 TRACE("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
\r
6087 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
6089 return error(GL_INVALID_VALUE);
\r
6092 es2::Context *context = es2::getContext();
\r
6096 GLfloat vals[4] = { x, y, z, w };
\r
6097 context->setVertexAttrib(index, vals);
\r
6101 void VertexAttrib4fv(GLuint index, const GLfloat* values)
\r
6103 TRACE("(GLuint index = %d, const GLfloat* values = %p)", index, values);
\r
6105 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
6107 return error(GL_INVALID_VALUE);
\r
6110 es2::Context *context = es2::getContext();
\r
6114 context->setVertexAttrib(index, values);
\r
6118 void VertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
\r
6120 TRACE("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
\r
6121 "GLboolean normalized = %d, GLsizei stride = %d, const GLvoid* ptr = %p)",
\r
6122 index, size, type, normalized, stride, ptr);
\r
6124 if(index >= es2::MAX_VERTEX_ATTRIBS)
\r
6126 return error(GL_INVALID_VALUE);
\r
6129 if(size < 1 || size > 4)
\r
6131 return error(GL_INVALID_VALUE);
\r
6134 GLint clientVersion = egl::getClientVersion();
\r
6139 case GL_UNSIGNED_BYTE:
\r
6141 case GL_UNSIGNED_SHORT:
\r
6145 case GL_INT_2_10_10_10_REV:
\r
6146 case GL_UNSIGNED_INT_2_10_10_10_REV:
\r
6147 if(clientVersion >= 3)
\r
6151 return error(GL_INVALID_OPERATION);
\r
6155 else return error(GL_INVALID_ENUM);
\r
6157 case GL_UNSIGNED_INT:
\r
6158 case GL_HALF_FLOAT:
\r
6159 if(clientVersion >= 3)
\r
6163 else return error(GL_INVALID_ENUM);
\r
6165 return error(GL_INVALID_ENUM);
\r
6170 return error(GL_INVALID_VALUE);
\r
6173 es2::Context *context = es2::getContext();
\r
6177 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
\r
6181 void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
\r
6183 TRACE("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
\r
6185 if(width < 0 || height < 0)
\r
6187 return error(GL_INVALID_VALUE);
\r
6190 es2::Context *context = es2::getContext();
\r
6194 context->setViewportParams(x, y, width, height);
\r
6198 void BlitFramebufferNV(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
\r
6200 TRACE("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
\r
6201 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
\r
6202 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
\r
6203 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
\r
6210 return error(GL_INVALID_ENUM);
\r
6213 if((mask & ~(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) != 0)
\r
6215 return error(GL_INVALID_VALUE);
\r
6218 es2::Context *context = es2::getContext();
\r
6222 if(context->getReadFramebufferName() == context->getDrawFramebufferName())
\r
6224 ERR("Blits with the same source and destination framebuffer are not supported by this implementation.");
\r
6225 return error(GL_INVALID_OPERATION);
\r
6228 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask);
\r
6232 void BlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
\r
6233 GLbitfield mask, GLenum filter)
\r
6235 if(srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
\r
6237 ERR("Scaling and flipping in BlitFramebufferANGLE not supported by this implementation");
\r
6238 return error(GL_INVALID_OPERATION);
\r
6241 glBlitFramebufferNV(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
\r
6244 void TexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
\r
6245 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
\r
6247 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
\r
6248 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
\r
6249 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = %p)",
\r
6250 target, level, internalformat, width, height, depth, border, format, type, pixels);
\r
6254 case GL_TEXTURE_3D_OES:
\r
6257 case GL_DEPTH_COMPONENT:
\r
6258 case GL_DEPTH_STENCIL_OES:
\r
6259 return error(GL_INVALID_OPERATION);
\r
6265 return error(GL_INVALID_ENUM);
\r
6268 if(!ValidateTextureFormatType(format, type, internalformat, egl::getClientVersion()))
\r
6273 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
\r
6275 return error(GL_INVALID_VALUE);
\r
6278 const GLsizei maxSize3D = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level;
\r
6279 if((width < 0) || (height < 0) || (depth < 0) || (width > maxSize3D) || (height > maxSize3D) || (depth > maxSize3D))
\r
6281 return error(GL_INVALID_VALUE);
\r
6286 return error(GL_INVALID_VALUE);
\r
6289 es2::Context *context = es2::getContext();
\r
6293 es2::Texture3D *texture = context->getTexture3D();
\r
6297 return error(GL_INVALID_OPERATION);
\r
6300 texture->setImage(level, width, height, depth, GetSizedInternalFormat(internalformat, type), type, context->getUnpackInfo(), pixels);
\r
6304 void TexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)
\r
6306 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
6307 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
\r
6308 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = %p)",
\r
6309 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
\r
6313 case GL_TEXTURE_3D_OES:
\r
6316 return error(GL_INVALID_ENUM);
\r
6319 if(!ValidateTextureFormatType(format, type, format, egl::getClientVersion()))
\r
6324 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
\r
6326 return error(GL_INVALID_VALUE);
\r
6329 if((width < 0) || (height < 0) || (depth < 0))
\r
6331 return error(GL_INVALID_VALUE);
\r
6334 es2::Context *context = es2::getContext();
\r
6338 es2::Texture3D *texture = context->getTexture3D();
\r
6340 GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);
\r
6342 GLenum validationError = ValidateSubImageParams(false, width, height, depth, xoffset, yoffset, zoffset, target, level, sizedInternalFormat, texture);
\r
6343 if(validationError == GL_NONE)
\r
6345 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, sizedInternalFormat, type, context->getUnpackInfo(), pixels);
\r
6349 return error(validationError);
\r
6354 void CopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
\r
6356 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
6357 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
\r
6358 target, level, xoffset, yoffset, zoffset, x, y, width, height);
\r
6362 case GL_TEXTURE_3D_OES:
\r
6365 return error(GL_INVALID_ENUM);
\r
6368 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
\r
6370 return error(GL_INVALID_VALUE);
\r
6373 es2::Context *context = es2::getContext();
\r
6377 es2::Framebuffer *framebuffer = context->getReadFramebuffer();
\r
6379 if(framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
\r
6381 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
\r
6384 es2::Renderbuffer *source = framebuffer->getReadColorbuffer();
\r
6386 if(context->getReadFramebufferName() != 0 && (!source || source->getSamples() > 1))
\r
6388 return error(GL_INVALID_OPERATION);
\r
6391 es2::Texture3D *texture = context->getTexture3D();
\r
6393 GLenum validationError = ValidateSubImageParams(false, width, height, 1, xoffset, yoffset, zoffset, target, level, GL_NONE, texture);
\r
6395 if(validationError != GL_NONE)
\r
6397 return error(validationError);
\r
6400 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
\r
6404 void CompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data)
\r
6406 TRACE("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
\r
6407 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = %p)",
\r
6408 target, level, internalformat, width, height, depth, border, imageSize, data);
\r
6412 case GL_TEXTURE_3D_OES:
\r
6415 return error(GL_INVALID_ENUM);
\r
6418 if((level < 0) || (level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS))
\r
6420 return error(GL_INVALID_VALUE);
\r
6423 const GLsizei maxSize3D = es2::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level;
\r
6424 if((width < 0) || (height < 0) || (depth < 0) || (width > maxSize3D) || (height > maxSize3D) || (depth > maxSize3D) ||(border != 0) || (imageSize < 0))
\r
6426 return error(GL_INVALID_VALUE);
\r
6429 switch(internalformat)
\r
6431 case GL_DEPTH_COMPONENT:
\r
6432 case GL_DEPTH_COMPONENT16:
\r
6433 case GL_DEPTH_COMPONENT32_OES:
\r
6434 case GL_DEPTH_STENCIL_OES:
\r
6435 case GL_DEPTH24_STENCIL8_OES:
\r
6436 return error(GL_INVALID_OPERATION);
\r
6439 GLenum validationError = ValidateCompressedFormat(internalformat, egl::getClientVersion(), true);
\r
6440 if(validationError != GL_NONE)
\r
6442 return error(validationError);
\r
6447 if(imageSize != egl::ComputeCompressedSize(width, height, internalformat) * depth)
\r
6449 return error(GL_INVALID_VALUE);
\r
6452 es2::Context *context = es2::getContext();
\r
6456 es2::Texture3D *texture = context->getTexture3D();
\r
6460 return error(GL_INVALID_OPERATION);
\r
6463 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
\r
6467 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)
\r
6469 TRACE("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
\r
6470 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
\r
6471 "GLenum format = 0x%X, GLsizei imageSize = %d, const void *data = %p)",
\r
6472 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
\r
6476 case GL_TEXTURE_3D_OES:
\r
6479 return error(GL_INVALID_ENUM);
\r
6482 if(level < 0 || level >= es2::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
\r
6484 return error(GL_INVALID_VALUE);
\r
6487 if(xoffset < 0 || yoffset < 0 || zoffset < 0 || !validImageSize(level, width, height) || depth < 0 || imageSize < 0)
\r
6489 return error(GL_INVALID_VALUE);
\r
6492 GLenum validationError = ValidateCompressedFormat(format, egl::getClientVersion(), true);
\r
6493 if(validationError != GL_NONE)
\r
6495 return error(validationError);
\r
6498 if(width == 0 || height == 0 || depth == 0 || !data)
\r
6503 es2::Context *context = es2::getContext();
\r
6507 es2::Texture3D *texture = context->getTexture3D();
\r
6511 return error(GL_INVALID_OPERATION);
\r
6514 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
\r
6518 void FramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
\r
6520 TRACE("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
\r
6521 "GLuint texture = %d, GLint level = %d, GLint zoffset = %d)", target, attachment, textarget, texture, level, zoffset);
\r
6523 if(target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
\r
6525 return error(GL_INVALID_ENUM);
\r
6528 es2::Context *context = es2::getContext();
\r
6534 textarget = GL_NONE;
\r
6538 es2::Texture *tex = context->getTexture(texture);
\r
6542 return error(GL_INVALID_OPERATION);
\r
6545 if(tex->isCompressed(textarget, level))
\r
6547 return error(GL_INVALID_OPERATION);
\r
6552 case GL_TEXTURE_3D_OES:
\r
6553 if(tex->getTarget() != GL_TEXTURE_3D_OES)
\r
6555 return error(GL_INVALID_OPERATION);
\r
6559 return error(GL_INVALID_ENUM);
\r
6564 return error(GL_INVALID_VALUE);
\r
6568 es2::Framebuffer *framebuffer = NULL;
\r
6569 GLuint framebufferName = 0;
\r
6570 if(target == GL_READ_FRAMEBUFFER_ANGLE)
\r
6572 framebuffer = context->getReadFramebuffer();
\r
6573 framebufferName = context->getReadFramebufferName();
\r
6577 framebuffer = context->getDrawFramebuffer();
\r
6578 framebufferName = context->getDrawFramebufferName();
\r
6581 if(framebufferName == 0 || !framebuffer)
\r
6583 return error(GL_INVALID_OPERATION);
\r
6586 GLint clientVersion = context->getClientVersion();
\r
6588 switch(attachment)
\r
6590 case GL_COLOR_ATTACHMENT1:
\r
6591 case GL_COLOR_ATTACHMENT2:
\r
6592 case GL_COLOR_ATTACHMENT3:
\r
6593 case GL_COLOR_ATTACHMENT4:
\r
6594 case GL_COLOR_ATTACHMENT5:
\r
6595 case GL_COLOR_ATTACHMENT6:
\r
6596 case GL_COLOR_ATTACHMENT7:
\r
6597 case GL_COLOR_ATTACHMENT8:
\r
6598 case GL_COLOR_ATTACHMENT9:
\r
6599 case GL_COLOR_ATTACHMENT10:
\r
6600 case GL_COLOR_ATTACHMENT11:
\r
6601 case GL_COLOR_ATTACHMENT12:
\r
6602 case GL_COLOR_ATTACHMENT13:
\r
6603 case GL_COLOR_ATTACHMENT14:
\r
6604 case GL_COLOR_ATTACHMENT15:
\r
6605 case GL_COLOR_ATTACHMENT16:
\r
6606 case GL_COLOR_ATTACHMENT17:
\r
6607 case GL_COLOR_ATTACHMENT18:
\r
6608 case GL_COLOR_ATTACHMENT19:
\r
6609 case GL_COLOR_ATTACHMENT20:
\r
6610 case GL_COLOR_ATTACHMENT21:
\r
6611 case GL_COLOR_ATTACHMENT22:
\r
6612 case GL_COLOR_ATTACHMENT23:
\r
6613 case GL_COLOR_ATTACHMENT24:
\r
6614 case GL_COLOR_ATTACHMENT25:
\r
6615 case GL_COLOR_ATTACHMENT26:
\r
6616 case GL_COLOR_ATTACHMENT27:
\r
6617 case GL_COLOR_ATTACHMENT28:
\r
6618 case GL_COLOR_ATTACHMENT29:
\r
6619 case GL_COLOR_ATTACHMENT30:
\r
6620 case GL_COLOR_ATTACHMENT31:
\r
6621 if(clientVersion < 3)
\r
6623 return error(GL_INVALID_ENUM);
\r
6626 case GL_COLOR_ATTACHMENT0:
\r
6627 if((attachment - GL_COLOR_ATTACHMENT0) >= es2::IMPLEMENTATION_MAX_COLOR_ATTACHMENTS)
\r
6629 return error(GL_INVALID_ENUM);
\r
6631 framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0);
\r
6633 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture); break;
\r
6634 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
\r
6636 return error(GL_INVALID_ENUM);
\r
6641 void EGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
\r
6643 if(egl::getClientVersion() == 1)
\r
6645 return libGLES_CM->glEGLImageTargetTexture2DOES(target, image);
\r
6648 TRACE("(GLenum target = 0x%X, GLeglImageOES image = %p)", target, image);
\r
6652 case GL_TEXTURE_2D:
\r
6653 case GL_TEXTURE_EXTERNAL_OES:
\r
6656 return error(GL_INVALID_ENUM);
\r
6661 return error(GL_INVALID_OPERATION);
\r
6664 es2::Context *context = es2::getContext();
\r
6668 es2::Texture2D *texture = 0;
\r
6672 case GL_TEXTURE_2D: texture = context->getTexture2D(); break;
\r
6673 case GL_TEXTURE_EXTERNAL_OES: texture = context->getTextureExternal(); break;
\r
6674 default: UNREACHABLE(target);
\r
6679 return error(GL_INVALID_OPERATION);
\r
6682 egl::Image *glImage = static_cast<egl::Image*>(image);
\r
6684 texture->setImage(glImage);
\r
6688 void EGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
\r
6690 TRACE("(GLenum target = 0x%X, GLeglImageOES image = %p)", target, image);
\r
6695 GLboolean IsRenderbufferOES(GLuint renderbuffer)
\r
6697 return IsRenderbuffer(renderbuffer);
\r
6700 void BindRenderbufferOES(GLenum target, GLuint renderbuffer)
\r
6702 BindRenderbuffer(target, renderbuffer);
\r
6705 void DeleteRenderbuffersOES(GLsizei n, const GLuint* renderbuffers)
\r
6707 DeleteRenderbuffers(n, renderbuffers);
\r
6710 void GenRenderbuffersOES(GLsizei n, GLuint* renderbuffers)
\r
6712 GenRenderbuffers(n, renderbuffers);
\r
6715 void RenderbufferStorageOES(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
\r
6717 RenderbufferStorage(target, internalformat, width, height);
\r
6720 void GetRenderbufferParameterivOES(GLenum target, GLenum pname, GLint* params)
\r
6722 GetRenderbufferParameteriv(target, pname, params);
\r
6725 GLboolean IsFramebufferOES(GLuint framebuffer)
\r
6727 return IsFramebuffer(framebuffer);
\r
6730 void BindFramebufferOES(GLenum target, GLuint framebuffer)
\r
6732 BindFramebuffer(target, framebuffer);
\r
6735 void DeleteFramebuffersOES(GLsizei n, const GLuint* framebuffers)
\r
6737 DeleteFramebuffers(n, framebuffers);
\r
6740 void GenFramebuffersOES(GLsizei n, GLuint* framebuffers)
\r
6742 GenFramebuffers(n, framebuffers);
\r
6745 GLenum CheckFramebufferStatusOES(GLenum target)
\r
6747 return CheckFramebufferStatus(target);
\r
6750 void FramebufferRenderbufferOES(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
\r
6752 FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
\r
6755 void FramebufferTexture2DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
\r
6757 FramebufferTexture2D(target, attachment, textarget, texture, level);
\r
6760 void GetFramebufferAttachmentParameterivOES(GLenum target, GLenum attachment, GLenum pname, GLint* params)
\r
6762 GetFramebufferAttachmentParameteriv(target, attachment, pname, params);
\r
6765 void GenerateMipmapOES(GLenum target)
\r
6767 GenerateMipmap(target);
\r
6772 extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname)
\r
6777 __eglMustCastToProperFunctionPointerType address;
\r
6780 static const Extension glExtensions[] =
\r
6782 #define EXTENSION(name) {#name, (__eglMustCastToProperFunctionPointerType)name}
\r
6784 EXTENSION(glTexImage3DOES),
\r
6785 EXTENSION(glBlitFramebufferANGLE),
\r
6786 EXTENSION(glBlitFramebufferNV),
\r
6787 EXTENSION(glRenderbufferStorageMultisampleANGLE),
\r
6788 EXTENSION(glDeleteFencesNV),
\r
6789 EXTENSION(glGenFencesNV),
\r
6790 EXTENSION(glIsFenceNV),
\r
6791 EXTENSION(glTestFenceNV),
\r
6792 EXTENSION(glGetFenceivNV),
\r
6793 EXTENSION(glFinishFenceNV),
\r
6794 EXTENSION(glSetFenceNV),
\r
6795 EXTENSION(glGetGraphicsResetStatusEXT),
\r
6796 EXTENSION(glReadnPixelsEXT),
\r
6797 EXTENSION(glGetnUniformfvEXT),
\r
6798 EXTENSION(glGetnUniformivEXT),
\r
6799 EXTENSION(glGenQueriesEXT),
\r
6800 EXTENSION(glDeleteQueriesEXT),
\r
6801 EXTENSION(glIsQueryEXT),
\r
6802 EXTENSION(glBeginQueryEXT),
\r
6803 EXTENSION(glEndQueryEXT),
\r
6804 EXTENSION(glGetQueryivEXT),
\r
6805 EXTENSION(glGetQueryObjectuivEXT),
\r
6806 EXTENSION(glEGLImageTargetTexture2DOES),
\r
6807 EXTENSION(glEGLImageTargetRenderbufferStorageOES),
\r
6808 EXTENSION(glDrawElementsInstancedEXT),
\r
6809 EXTENSION(glDrawArraysInstancedEXT),
\r
6810 EXTENSION(glVertexAttribDivisorEXT),
\r
6811 EXTENSION(glDrawArraysInstancedANGLE),
\r
6812 EXTENSION(glDrawElementsInstancedANGLE),
\r
6813 EXTENSION(glVertexAttribDivisorANGLE),
\r
6814 EXTENSION(glIsRenderbufferOES),
\r
6815 EXTENSION(glBindRenderbufferOES),
\r
6816 EXTENSION(glDeleteRenderbuffersOES),
\r
6817 EXTENSION(glGenRenderbuffersOES),
\r
6818 EXTENSION(glRenderbufferStorageOES),
\r
6819 EXTENSION(glGetRenderbufferParameterivOES),
\r
6820 EXTENSION(glIsFramebufferOES),
\r
6821 EXTENSION(glBindFramebufferOES),
\r
6822 EXTENSION(glDeleteFramebuffersOES),
\r
6823 EXTENSION(glGenFramebuffersOES),
\r
6824 EXTENSION(glCheckFramebufferStatusOES),
\r
6825 EXTENSION(glFramebufferRenderbufferOES),
\r
6826 EXTENSION(glFramebufferTexture2DOES),
\r
6827 EXTENSION(glGetFramebufferAttachmentParameterivOES),
\r
6828 EXTENSION(glGenerateMipmapOES),
\r
6833 for(unsigned int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++)
\r
6835 if(strcmp(procname, glExtensions[ext].name) == 0)
\r
6837 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
\r