1 #include "precompiled.h"
3 // Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
8 // libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions.
10 #include "common/version.h"
12 #include "libGLESv2/main.h"
13 #include "common/utilities.h"
14 #include "libGLESv2/formatutils.h"
15 #include "libGLESv2/Buffer.h"
16 #include "libGLESv2/Fence.h"
17 #include "libGLESv2/Framebuffer.h"
18 #include "libGLESv2/Renderbuffer.h"
19 #include "libGLESv2/Program.h"
20 #include "libGLESv2/ProgramBinary.h"
21 #include "libGLESv2/Texture.h"
22 #include "libGLESv2/Query.h"
23 #include "libGLESv2/Context.h"
24 #include "libGLESv2/VertexArray.h"
25 #include "libGLESv2/TransformFeedback.h"
27 #include "libGLESv2/validationES.h"
28 #include "libGLESv2/validationES2.h"
29 #include "libGLESv2/validationES3.h"
30 #include "libGLESv2/queryconversions.h"
35 // OpenGL ES 2.0 functions
37 void __stdcall glActiveTexture(GLenum texture)
39 EVENT("(GLenum texture = 0x%X)", texture);
43 gl::Context *context = gl::getNonLostContext();
47 if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1)
49 return gl::error(GL_INVALID_ENUM);
52 context->setActiveSampler(texture - GL_TEXTURE0);
57 return gl::error(GL_OUT_OF_MEMORY);
61 void __stdcall glAttachShader(GLuint program, GLuint shader)
63 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
67 gl::Context *context = gl::getNonLostContext();
71 gl::Program *programObject = context->getProgram(program);
72 gl::Shader *shaderObject = context->getShader(shader);
76 if (context->getShader(program))
78 return gl::error(GL_INVALID_OPERATION);
82 return gl::error(GL_INVALID_VALUE);
88 if (context->getProgram(shader))
90 return gl::error(GL_INVALID_OPERATION);
94 return gl::error(GL_INVALID_VALUE);
98 if (!programObject->attachShader(shaderObject))
100 return gl::error(GL_INVALID_OPERATION);
106 return gl::error(GL_OUT_OF_MEMORY);
110 void __stdcall glBeginQueryEXT(GLenum target, GLuint id)
112 EVENT("(GLenum target = 0x%X, GLuint %d)", target, id);
116 gl::Context *context = gl::getNonLostContext();
120 if (!ValidateBeginQuery(context, target, id))
125 context->beginQuery(target, id);
130 return gl::error(GL_OUT_OF_MEMORY);
134 void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* name)
136 EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name);
140 if (index >= gl::MAX_VERTEX_ATTRIBS)
142 return gl::error(GL_INVALID_VALUE);
145 gl::Context *context = gl::getNonLostContext();
149 gl::Program *programObject = context->getProgram(program);
153 if (context->getShader(program))
155 return gl::error(GL_INVALID_OPERATION);
159 return gl::error(GL_INVALID_VALUE);
163 if (strncmp(name, "gl_", 3) == 0)
165 return gl::error(GL_INVALID_OPERATION);
168 programObject->bindAttributeLocation(index, name);
173 return gl::error(GL_OUT_OF_MEMORY);
177 void __stdcall glBindBuffer(GLenum target, GLuint buffer)
179 EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer);
183 gl::Context *context = gl::getNonLostContext();
187 if (!gl::ValidBufferTarget(context, target))
189 return gl::error(GL_INVALID_ENUM);
194 case GL_ARRAY_BUFFER:
195 context->bindArrayBuffer(buffer);
197 case GL_ELEMENT_ARRAY_BUFFER:
198 context->bindElementArrayBuffer(buffer);
200 case GL_COPY_READ_BUFFER:
201 context->bindCopyReadBuffer(buffer);
203 case GL_COPY_WRITE_BUFFER:
204 context->bindCopyWriteBuffer(buffer);
206 case GL_PIXEL_PACK_BUFFER:
207 context->bindPixelPackBuffer(buffer);
209 case GL_PIXEL_UNPACK_BUFFER:
210 context->bindPixelUnpackBuffer(buffer);
212 case GL_UNIFORM_BUFFER:
213 context->bindGenericUniformBuffer(buffer);
215 case GL_TRANSFORM_FEEDBACK_BUFFER:
216 context->bindGenericTransformFeedbackBuffer(buffer);
219 return gl::error(GL_INVALID_ENUM);
225 return gl::error(GL_OUT_OF_MEMORY);
229 void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
231 EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer);
235 if (!gl::ValidFramebufferTarget(target))
237 return gl::error(GL_INVALID_ENUM);
240 gl::Context *context = gl::getNonLostContext();
244 if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
246 context->bindReadFramebuffer(framebuffer);
249 if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
251 context->bindDrawFramebuffer(framebuffer);
257 return gl::error(GL_OUT_OF_MEMORY);
261 void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer)
263 EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer);
267 if (target != GL_RENDERBUFFER)
269 return gl::error(GL_INVALID_ENUM);
272 gl::Context *context = gl::getNonLostContext();
276 context->bindRenderbuffer(renderbuffer);
281 return gl::error(GL_OUT_OF_MEMORY);
285 void __stdcall glBindTexture(GLenum target, GLuint texture)
287 EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture);
291 gl::Context *context = gl::getNonLostContext();
295 gl::Texture *textureObject = context->getTexture(texture);
297 if (textureObject && textureObject->getTarget() != target && texture != 0)
299 return gl::error(GL_INVALID_OPERATION);
305 context->bindTexture2D(texture);
307 case GL_TEXTURE_CUBE_MAP:
308 context->bindTextureCubeMap(texture);
311 if (context->getClientVersion() < 3)
313 return gl::error(GL_INVALID_ENUM);
315 context->bindTexture3D(texture);
317 case GL_TEXTURE_2D_ARRAY:
318 if (context->getClientVersion() < 3)
320 return gl::error(GL_INVALID_ENUM);
322 context->bindTexture2DArray(texture);
325 return gl::error(GL_INVALID_ENUM);
331 return gl::error(GL_OUT_OF_MEMORY);
335 void __stdcall glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
337 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
338 red, green, blue, alpha);
342 gl::Context* context = gl::getNonLostContext();
346 context->setBlendColor(gl::clamp01(red), gl::clamp01(green), gl::clamp01(blue), gl::clamp01(alpha));
351 return gl::error(GL_OUT_OF_MEMORY);
355 void __stdcall glBlendEquation(GLenum mode)
357 glBlendEquationSeparate(mode, mode);
360 void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
362 EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
366 gl::Context *context = gl::getNonLostContext();
371 case GL_FUNC_SUBTRACT:
372 case GL_FUNC_REVERSE_SUBTRACT:
378 return gl::error(GL_INVALID_ENUM);
384 case GL_FUNC_SUBTRACT:
385 case GL_FUNC_REVERSE_SUBTRACT:
391 return gl::error(GL_INVALID_ENUM);
396 context->setBlendEquation(modeRGB, modeAlpha);
401 return gl::error(GL_OUT_OF_MEMORY);
405 void __stdcall glBlendFunc(GLenum sfactor, GLenum dfactor)
407 glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
410 void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
412 EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
413 srcRGB, dstRGB, srcAlpha, dstAlpha);
417 gl::Context *context = gl::getNonLostContext();
424 case GL_ONE_MINUS_SRC_COLOR:
426 case GL_ONE_MINUS_DST_COLOR:
428 case GL_ONE_MINUS_SRC_ALPHA:
430 case GL_ONE_MINUS_DST_ALPHA:
431 case GL_CONSTANT_COLOR:
432 case GL_ONE_MINUS_CONSTANT_COLOR:
433 case GL_CONSTANT_ALPHA:
434 case GL_ONE_MINUS_CONSTANT_ALPHA:
435 case GL_SRC_ALPHA_SATURATE:
438 return gl::error(GL_INVALID_ENUM);
446 case GL_ONE_MINUS_SRC_COLOR:
448 case GL_ONE_MINUS_DST_COLOR:
450 case GL_ONE_MINUS_SRC_ALPHA:
452 case GL_ONE_MINUS_DST_ALPHA:
453 case GL_CONSTANT_COLOR:
454 case GL_ONE_MINUS_CONSTANT_COLOR:
455 case GL_CONSTANT_ALPHA:
456 case GL_ONE_MINUS_CONSTANT_ALPHA:
459 case GL_SRC_ALPHA_SATURATE:
460 if (!context || context->getClientVersion() < 3)
462 return gl::error(GL_INVALID_ENUM);
467 return gl::error(GL_INVALID_ENUM);
475 case GL_ONE_MINUS_SRC_COLOR:
477 case GL_ONE_MINUS_DST_COLOR:
479 case GL_ONE_MINUS_SRC_ALPHA:
481 case GL_ONE_MINUS_DST_ALPHA:
482 case GL_CONSTANT_COLOR:
483 case GL_ONE_MINUS_CONSTANT_COLOR:
484 case GL_CONSTANT_ALPHA:
485 case GL_ONE_MINUS_CONSTANT_ALPHA:
486 case GL_SRC_ALPHA_SATURATE:
489 return gl::error(GL_INVALID_ENUM);
497 case GL_ONE_MINUS_SRC_COLOR:
499 case GL_ONE_MINUS_DST_COLOR:
501 case GL_ONE_MINUS_SRC_ALPHA:
503 case GL_ONE_MINUS_DST_ALPHA:
504 case GL_CONSTANT_COLOR:
505 case GL_ONE_MINUS_CONSTANT_COLOR:
506 case GL_CONSTANT_ALPHA:
507 case GL_ONE_MINUS_CONSTANT_ALPHA:
510 case GL_SRC_ALPHA_SATURATE:
511 if (!context || context->getClientVersion() < 3)
513 return gl::error(GL_INVALID_ENUM);
518 return gl::error(GL_INVALID_ENUM);
521 bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
522 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
524 bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
525 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
527 if (constantColorUsed && constantAlphaUsed)
529 ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL");
530 return gl::error(GL_INVALID_OPERATION);
535 context->setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
540 return gl::error(GL_OUT_OF_MEMORY);
544 void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
546 EVENT("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",
547 target, size, data, usage);
553 return gl::error(GL_INVALID_VALUE);
556 gl::Context *context = gl::getNonLostContext();
562 case GL_DYNAMIC_DRAW:
569 case GL_DYNAMIC_READ:
570 case GL_DYNAMIC_COPY:
571 if (context && context->getClientVersion() < 3)
573 return gl::error(GL_INVALID_ENUM);
578 return gl::error(GL_INVALID_ENUM);
583 if (!gl::ValidBufferTarget(context, target))
585 return gl::error(GL_INVALID_ENUM);
588 gl::Buffer *buffer = context->getTargetBuffer(target);
592 return gl::error(GL_INVALID_OPERATION);
595 buffer->bufferData(data, size, usage);
600 return gl::error(GL_OUT_OF_MEMORY);
604 void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)
606 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",
607 target, offset, size, data);
611 if (size < 0 || offset < 0)
613 return gl::error(GL_INVALID_VALUE);
621 gl::Context *context = gl::getNonLostContext();
625 if (!gl::ValidBufferTarget(context, target))
627 return gl::error(GL_INVALID_ENUM);
630 gl::Buffer *buffer = context->getTargetBuffer(target);
634 return gl::error(GL_INVALID_OPERATION);
637 if (buffer->mapped())
639 return gl::error(GL_INVALID_OPERATION);
642 // Check for possible overflow of size + offset
643 if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset))
645 return gl::error(GL_OUT_OF_MEMORY);
648 if (size + offset > buffer->size())
650 return gl::error(GL_INVALID_VALUE);
653 buffer->bufferSubData(data, size, offset);
658 return gl::error(GL_OUT_OF_MEMORY);
662 GLenum __stdcall glCheckFramebufferStatus(GLenum target)
664 EVENT("(GLenum target = 0x%X)", target);
668 if (!gl::ValidFramebufferTarget(target))
670 return gl::error(GL_INVALID_ENUM, 0);
673 gl::Context *context = gl::getNonLostContext();
677 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
679 return framebuffer->completeness();
684 return gl::error(GL_OUT_OF_MEMORY, 0);
690 void __stdcall glClear(GLbitfield mask)
692 EVENT("(GLbitfield mask = 0x%X)", mask);
696 gl::Context *context = gl::getNonLostContext();
700 gl::Framebuffer *framebufferObject = context->getDrawFramebuffer();
702 if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
704 return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
707 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
709 return gl::error(GL_INVALID_VALUE);
712 context->clear(mask);
717 return gl::error(GL_OUT_OF_MEMORY);
721 void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
723 EVENT("(GLclampf red = %f, GLclampf green = %f, GLclampf blue = %f, GLclampf alpha = %f)",
724 red, green, blue, alpha);
728 gl::Context *context = gl::getNonLostContext();
732 context->setClearColor(red, green, blue, alpha);
737 return gl::error(GL_OUT_OF_MEMORY);
741 void __stdcall glClearDepthf(GLclampf depth)
743 EVENT("(GLclampf depth = %f)", depth);
747 gl::Context *context = gl::getNonLostContext();
751 context->setClearDepth(depth);
756 return gl::error(GL_OUT_OF_MEMORY);
760 void __stdcall glClearStencil(GLint s)
762 EVENT("(GLint s = %d)", s);
766 gl::Context *context = gl::getNonLostContext();
770 context->setClearStencil(s);
775 return gl::error(GL_OUT_OF_MEMORY);
779 void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
781 EVENT("(GLboolean red = %d, GLboolean green = %u, GLboolean blue = %u, GLboolean alpha = %u)",
782 red, green, blue, alpha);
786 gl::Context *context = gl::getNonLostContext();
790 context->setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE);
795 return gl::error(GL_OUT_OF_MEMORY);
799 void __stdcall glCompileShader(GLuint shader)
801 EVENT("(GLuint shader = %d)", shader);
805 gl::Context *context = gl::getNonLostContext();
809 gl::Shader *shaderObject = context->getShader(shader);
813 if (context->getProgram(shader))
815 return gl::error(GL_INVALID_OPERATION);
819 return gl::error(GL_INVALID_VALUE);
823 shaderObject->compile();
828 return gl::error(GL_OUT_OF_MEMORY);
832 void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
833 GLint border, GLsizei imageSize, const GLvoid* data)
835 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
836 "GLsizei height = %d, GLint border = %d, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
837 target, level, internalformat, width, height, border, imageSize, data);
841 gl::Context *context = gl::getNonLostContext();
845 if (context->getClientVersion() < 3 &&
846 !ValidateES2TexImageParameters(context, target, level, internalformat, true, false,
847 0, 0, width, height, border, GL_NONE, GL_NONE, data))
852 if (context->getClientVersion() >= 3 &&
853 !ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
854 0, 0, 0, width, height, 1, border, GL_NONE, GL_NONE, data))
859 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
861 return gl::error(GL_INVALID_VALUE);
868 gl::Texture2D *texture = context->getTexture2D();
869 texture->setCompressedImage(level, internalformat, width, height, imageSize, data);
873 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
874 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
875 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
876 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
877 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
878 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
880 gl::TextureCubeMap *texture = context->getTextureCubeMap();
881 texture->setCompressedImage(target, level, internalformat, width, height, imageSize, data);
886 return gl::error(GL_INVALID_ENUM);
892 return gl::error(GL_OUT_OF_MEMORY);
896 void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
897 GLenum format, GLsizei imageSize, const GLvoid* data)
899 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
900 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, "
901 "GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
902 target, level, xoffset, yoffset, width, height, format, imageSize, data);
906 gl::Context *context = gl::getNonLostContext();
910 if (context->getClientVersion() < 3 &&
911 !ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true,
912 xoffset, yoffset, width, height, 0, GL_NONE, GL_NONE, data))
917 if (context->getClientVersion() >= 3 &&
918 !ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
919 xoffset, yoffset, 0, width, height, 1, 0, GL_NONE, GL_NONE, data))
924 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
926 return gl::error(GL_INVALID_VALUE);
933 gl::Texture2D *texture = context->getTexture2D();
934 texture->subImageCompressed(level, xoffset, yoffset, width, height, format, imageSize, data);
938 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
939 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
940 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
941 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
942 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
943 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
945 gl::TextureCubeMap *texture = context->getTextureCubeMap();
946 texture->subImageCompressed(target, level, xoffset, yoffset, width, height, format, imageSize, data);
951 return gl::error(GL_INVALID_ENUM);
957 return gl::error(GL_OUT_OF_MEMORY);
961 void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
963 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
964 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, GLint border = %d)",
965 target, level, internalformat, x, y, width, height, border);
969 gl::Context *context = gl::getNonLostContext();
973 if (context->getClientVersion() < 3 &&
974 !ValidateES2CopyTexImageParameters(context, target, level, internalformat, false,
975 0, 0, x, y, width, height, border))
980 if (context->getClientVersion() >= 3 &&
981 !ValidateES3CopyTexImageParameters(context, target, level, internalformat, false,
982 0, 0, 0, x, y, width, height, border))
987 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
993 gl::Texture2D *texture = context->getTexture2D();
994 texture->copyImage(level, internalformat, x, y, width, height, framebuffer);
998 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
999 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1000 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1001 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1002 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1003 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1005 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1006 texture->copyImage(target, level, internalformat, x, y, width, height, framebuffer);
1011 return gl::error(GL_INVALID_ENUM);
1017 return gl::error(GL_OUT_OF_MEMORY);
1021 void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
1023 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
1024 "GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
1025 target, level, xoffset, yoffset, x, y, width, height);
1029 gl::Context *context = gl::getNonLostContext();
1033 if (context->getClientVersion() < 3 &&
1034 !ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true,
1035 xoffset, yoffset, x, y, width, height, 0))
1040 if (context->getClientVersion() >= 3 &&
1041 !ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true,
1042 xoffset, yoffset, 0, x, y, width, height, 0))
1047 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
1053 gl::Texture2D *texture = context->getTexture2D();
1054 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
1058 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1059 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1060 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1061 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1062 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1063 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1065 gl::TextureCubeMap *texture = context->getTextureCubeMap();
1066 texture->copySubImage(target, level, xoffset, yoffset, 0, x, y, width, height, framebuffer);
1071 return gl::error(GL_INVALID_ENUM);
1078 return gl::error(GL_OUT_OF_MEMORY);
1082 GLuint __stdcall glCreateProgram(void)
1088 gl::Context *context = gl::getNonLostContext();
1092 return context->createProgram();
1097 return gl::error(GL_OUT_OF_MEMORY, 0);
1103 GLuint __stdcall glCreateShader(GLenum type)
1105 EVENT("(GLenum type = 0x%X)", type);
1109 gl::Context *context = gl::getNonLostContext();
1115 case GL_FRAGMENT_SHADER:
1116 case GL_VERTEX_SHADER:
1117 return context->createShader(type);
1119 return gl::error(GL_INVALID_ENUM, 0);
1125 return gl::error(GL_OUT_OF_MEMORY, 0);
1131 void __stdcall glCullFace(GLenum mode)
1133 EVENT("(GLenum mode = 0x%X)", mode);
1141 case GL_FRONT_AND_BACK:
1143 gl::Context *context = gl::getNonLostContext();
1147 context->setCullMode(mode);
1152 return gl::error(GL_INVALID_ENUM);
1157 return gl::error(GL_OUT_OF_MEMORY);
1161 void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers)
1163 EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers);
1169 return gl::error(GL_INVALID_VALUE);
1172 gl::Context *context = gl::getNonLostContext();
1176 for (int i = 0; i < n; i++)
1178 context->deleteBuffer(buffers[i]);
1184 return gl::error(GL_OUT_OF_MEMORY);
1188 void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences)
1190 EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences);
1196 return gl::error(GL_INVALID_VALUE);
1199 gl::Context *context = gl::getNonLostContext();
1203 for (int i = 0; i < n; i++)
1205 context->deleteFenceNV(fences[i]);
1211 return gl::error(GL_OUT_OF_MEMORY);
1215 void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
1217 EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
1223 return gl::error(GL_INVALID_VALUE);
1226 gl::Context *context = gl::getNonLostContext();
1230 for (int i = 0; i < n; i++)
1232 if (framebuffers[i] != 0)
1234 context->deleteFramebuffer(framebuffers[i]);
1241 return gl::error(GL_OUT_OF_MEMORY);
1245 void __stdcall glDeleteProgram(GLuint program)
1247 EVENT("(GLuint program = %d)", program);
1256 gl::Context *context = gl::getNonLostContext();
1260 if (!context->getProgram(program))
1262 if(context->getShader(program))
1264 return gl::error(GL_INVALID_OPERATION);
1268 return gl::error(GL_INVALID_VALUE);
1272 context->deleteProgram(program);
1277 return gl::error(GL_OUT_OF_MEMORY);
1281 void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids)
1283 EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids);
1289 return gl::error(GL_INVALID_VALUE);
1292 gl::Context *context = gl::getNonLostContext();
1296 for (int i = 0; i < n; i++)
1298 context->deleteQuery(ids[i]);
1304 return gl::error(GL_OUT_OF_MEMORY);
1308 void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
1310 EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
1316 return gl::error(GL_INVALID_VALUE);
1319 gl::Context *context = gl::getNonLostContext();
1323 for (int i = 0; i < n; i++)
1325 context->deleteRenderbuffer(renderbuffers[i]);
1331 return gl::error(GL_OUT_OF_MEMORY);
1335 void __stdcall glDeleteShader(GLuint shader)
1337 EVENT("(GLuint shader = %d)", shader);
1346 gl::Context *context = gl::getNonLostContext();
1350 if (!context->getShader(shader))
1352 if(context->getProgram(shader))
1354 return gl::error(GL_INVALID_OPERATION);
1358 return gl::error(GL_INVALID_VALUE);
1362 context->deleteShader(shader);
1367 return gl::error(GL_OUT_OF_MEMORY);
1371 void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures)
1373 EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures);
1379 return gl::error(GL_INVALID_VALUE);
1382 gl::Context *context = gl::getNonLostContext();
1386 for (int i = 0; i < n; i++)
1388 if (textures[i] != 0)
1390 context->deleteTexture(textures[i]);
1397 return gl::error(GL_OUT_OF_MEMORY);
1401 void __stdcall glDepthFunc(GLenum func)
1403 EVENT("(GLenum func = 0x%X)", func);
1419 return gl::error(GL_INVALID_ENUM);
1422 gl::Context *context = gl::getNonLostContext();
1426 context->setDepthFunc(func);
1431 return gl::error(GL_OUT_OF_MEMORY);
1435 void __stdcall glDepthMask(GLboolean flag)
1437 EVENT("(GLboolean flag = %u)", flag);
1441 gl::Context *context = gl::getNonLostContext();
1445 context->setDepthMask(flag != GL_FALSE);
1450 return gl::error(GL_OUT_OF_MEMORY);
1454 void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar)
1456 EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar);
1460 gl::Context *context = gl::getNonLostContext();
1464 context->setDepthRange(zNear, zFar);
1469 return gl::error(GL_OUT_OF_MEMORY);
1473 void __stdcall glDetachShader(GLuint program, GLuint shader)
1475 EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader);
1479 gl::Context *context = gl::getNonLostContext();
1484 gl::Program *programObject = context->getProgram(program);
1485 gl::Shader *shaderObject = context->getShader(shader);
1489 gl::Shader *shaderByProgramHandle;
1490 shaderByProgramHandle = context->getShader(program);
1491 if (!shaderByProgramHandle)
1493 return gl::error(GL_INVALID_VALUE);
1497 return gl::error(GL_INVALID_OPERATION);
1503 gl::Program *programByShaderHandle = context->getProgram(shader);
1504 if (!programByShaderHandle)
1506 return gl::error(GL_INVALID_VALUE);
1510 return gl::error(GL_INVALID_OPERATION);
1514 if (!programObject->detachShader(shaderObject))
1516 return gl::error(GL_INVALID_OPERATION);
1522 return gl::error(GL_OUT_OF_MEMORY);
1526 void __stdcall glDisable(GLenum cap)
1528 EVENT("(GLenum cap = 0x%X)", cap);
1532 gl::Context *context = gl::getNonLostContext();
1536 if (!ValidCap(context, cap))
1538 return gl::error(GL_INVALID_ENUM);
1541 context->setCap(cap, false);
1546 return gl::error(GL_OUT_OF_MEMORY);
1550 void __stdcall glDisableVertexAttribArray(GLuint index)
1552 EVENT("(GLuint index = %d)", index);
1556 if (index >= gl::MAX_VERTEX_ATTRIBS)
1558 return gl::error(GL_INVALID_VALUE);
1561 gl::Context *context = gl::getNonLostContext();
1565 context->setEnableVertexAttribArray(index, false);
1570 return gl::error(GL_OUT_OF_MEMORY);
1574 void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count)
1576 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count);
1580 if (count < 0 || first < 0)
1582 return gl::error(GL_INVALID_VALUE);
1585 gl::Context *context = gl::getNonLostContext();
1587 // Check for mapped buffers
1588 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1590 return gl::error(GL_INVALID_OPERATION);
1595 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1596 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1597 curTransformFeedback->getDrawMode() != mode)
1599 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1600 // that does not match the current transform feedback object's draw mode (if transform feedback
1601 // is active), (3.0.2, section 2.14, pg 86)
1602 return gl::error(GL_INVALID_OPERATION);
1605 context->drawArrays(mode, first, count, 0);
1610 return gl::error(GL_OUT_OF_MEMORY);
1614 void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount)
1616 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount);
1620 if (count < 0 || first < 0 || primcount < 0)
1622 return gl::error(GL_INVALID_VALUE);
1627 gl::Context *context = gl::getNonLostContext();
1629 // Check for mapped buffers
1630 if (context->hasMappedBuffer(GL_ARRAY_BUFFER))
1632 return gl::error(GL_INVALID_OPERATION);
1637 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1638 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused() &&
1639 curTransformFeedback->getDrawMode() != mode)
1641 // It is an invalid operation to call DrawArrays or DrawArraysInstanced with a draw mode
1642 // that does not match the current transform feedback object's draw mode (if transform feedback
1643 // is active), (3.0.2, section 2.14, pg 86)
1644 return gl::error(GL_INVALID_OPERATION);
1647 context->drawArrays(mode, first, count, primcount);
1653 return gl::error(GL_OUT_OF_MEMORY);
1657 void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices)
1659 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p)",
1660 mode, count, type, indices);
1666 return gl::error(GL_INVALID_VALUE);
1669 gl::Context *context = gl::getNonLostContext();
1675 case GL_UNSIGNED_BYTE:
1676 case GL_UNSIGNED_SHORT:
1678 case GL_UNSIGNED_INT:
1679 if (!context->supports32bitIndices())
1681 return gl::error(GL_INVALID_ENUM);
1685 return gl::error(GL_INVALID_ENUM);
1688 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1689 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1691 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1692 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1693 return gl::error(GL_INVALID_OPERATION);
1696 // Check for mapped buffers
1697 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1699 return gl::error(GL_INVALID_OPERATION);
1702 context->drawElements(mode, count, type, indices, 0);
1707 return gl::error(GL_OUT_OF_MEMORY);
1711 void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount)
1713 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei primcount = %d)",
1714 mode, count, type, indices, primcount);
1718 if (count < 0 || primcount < 0)
1720 return gl::error(GL_INVALID_VALUE);
1725 gl::Context *context = gl::getNonLostContext();
1731 case GL_UNSIGNED_BYTE:
1732 case GL_UNSIGNED_SHORT:
1734 case GL_UNSIGNED_INT:
1735 if (!context->supports32bitIndices())
1737 return gl::error(GL_INVALID_ENUM);
1741 return gl::error(GL_INVALID_ENUM);
1744 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
1745 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
1747 // It is an invalid operation to call DrawElements, DrawRangeElements or DrawElementsInstanced
1748 // while transform feedback is active, (3.0.2, section 2.14, pg 86)
1749 return gl::error(GL_INVALID_OPERATION);
1752 // Check for mapped buffers
1753 if (context->hasMappedBuffer(GL_ARRAY_BUFFER) || context->hasMappedBuffer(GL_ELEMENT_ARRAY_BUFFER))
1755 return gl::error(GL_INVALID_OPERATION);
1758 context->drawElements(mode, count, type, indices, primcount);
1764 return gl::error(GL_OUT_OF_MEMORY);
1768 void __stdcall glEnable(GLenum cap)
1770 EVENT("(GLenum cap = 0x%X)", cap);
1774 gl::Context *context = gl::getNonLostContext();
1778 if (!ValidCap(context, cap))
1780 return gl::error(GL_INVALID_ENUM);
1783 context->setCap(cap, true);
1788 return gl::error(GL_OUT_OF_MEMORY);
1792 void __stdcall glEnableVertexAttribArray(GLuint index)
1794 EVENT("(GLuint index = %d)", index);
1798 if (index >= gl::MAX_VERTEX_ATTRIBS)
1800 return gl::error(GL_INVALID_VALUE);
1803 gl::Context *context = gl::getNonLostContext();
1807 context->setEnableVertexAttribArray(index, true);
1812 return gl::error(GL_OUT_OF_MEMORY);
1816 void __stdcall glEndQueryEXT(GLenum target)
1818 EVENT("GLenum target = 0x%X)", target);
1822 gl::Context *context = gl::getNonLostContext();
1826 if (!ValidateEndQuery(context, target))
1831 context->endQuery(target);
1836 return gl::error(GL_OUT_OF_MEMORY);
1840 void __stdcall glFinishFenceNV(GLuint fence)
1842 EVENT("(GLuint fence = %d)", fence);
1846 gl::Context *context = gl::getNonLostContext();
1850 gl::FenceNV *fenceObject = context->getFenceNV(fence);
1852 if (fenceObject == NULL)
1854 return gl::error(GL_INVALID_OPERATION);
1857 if (fenceObject->isFence() != GL_TRUE)
1859 return gl::error(GL_INVALID_OPERATION);
1862 fenceObject->finishFence();
1867 return gl::error(GL_OUT_OF_MEMORY);
1871 void __stdcall glFinish(void)
1877 gl::Context *context = gl::getNonLostContext();
1881 context->sync(true);
1886 return gl::error(GL_OUT_OF_MEMORY);
1890 void __stdcall glFlush(void)
1896 gl::Context *context = gl::getNonLostContext();
1900 context->sync(false);
1905 return gl::error(GL_OUT_OF_MEMORY);
1909 void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1911 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, "
1912 "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer);
1916 if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0))
1918 return gl::error(GL_INVALID_ENUM);
1921 gl::Context *context = gl::getNonLostContext();
1925 if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer))
1930 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1931 ASSERT(framebuffer);
1933 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
1935 unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
1936 framebuffer->setColorbuffer(colorAttachment, GL_RENDERBUFFER, renderbuffer, 0, 0);
1942 case GL_DEPTH_ATTACHMENT:
1943 framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1945 case GL_STENCIL_ATTACHMENT:
1946 framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1948 case GL_DEPTH_STENCIL_ATTACHMENT:
1949 framebuffer->setDepthStencilBuffer(GL_RENDERBUFFER, renderbuffer, 0, 0);
1960 return gl::error(GL_OUT_OF_MEMORY);
1964 void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1966 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum textarget = 0x%X, "
1967 "GLuint texture = %d, GLint level = %d)", target, attachment, textarget, texture, level);
1971 gl::Context *context = gl::getNonLostContext();
1974 if (context->getClientVersion() < 3 &&
1975 !ValidateES2FramebufferTextureParameters(context, target, attachment, textarget, texture, level))
1980 if (context->getClientVersion() >= 3 &&
1981 !ValidateES3FramebufferTextureParameters(context, target, attachment, textarget, texture, level, 0, false))
1988 textarget = GL_NONE;
1991 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
1993 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
1995 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
1996 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, 0);
2002 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, 0); break;
2003 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, 0); break;
2004 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, 0); break;
2011 return gl::error(GL_OUT_OF_MEMORY);
2015 void __stdcall glFrontFace(GLenum mode)
2017 EVENT("(GLenum mode = 0x%X)", mode);
2026 gl::Context *context = gl::getNonLostContext();
2030 context->setFrontFace(mode);
2035 return gl::error(GL_INVALID_ENUM);
2040 return gl::error(GL_OUT_OF_MEMORY);
2044 void __stdcall glGenBuffers(GLsizei n, GLuint* buffers)
2046 EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers);
2052 return gl::error(GL_INVALID_VALUE);
2055 gl::Context *context = gl::getNonLostContext();
2059 for (int i = 0; i < n; i++)
2061 buffers[i] = context->createBuffer();
2067 return gl::error(GL_OUT_OF_MEMORY);
2071 void __stdcall glGenerateMipmap(GLenum target)
2073 EVENT("(GLenum target = 0x%X)", target);
2077 gl::Context *context = gl::getNonLostContext();
2081 if (!ValidTextureTarget(context, target))
2083 return gl::error(GL_INVALID_ENUM);
2086 gl::Texture *texture = context->getTargetTexture(target);
2088 if (texture == NULL)
2090 return gl::error(GL_INVALID_OPERATION);
2093 GLenum internalFormat = texture->getBaseLevelInternalFormat();
2095 // Internally, all texture formats are sized so checking if the format
2096 // is color renderable and filterable will not fail.
2098 bool validRenderable = (gl::IsColorRenderingSupported(internalFormat, context) ||
2099 gl::IsSizedInternalFormat(internalFormat, context->getClientVersion()));
2101 if (gl::IsDepthRenderingSupported(internalFormat, context) ||
2102 gl::IsFormatCompressed(internalFormat, context->getClientVersion()) ||
2103 !gl::IsTextureFilteringSupported(internalFormat, context) ||
2106 return gl::error(GL_INVALID_OPERATION);
2109 // Non-power of 2 ES2 check
2110 if (!context->supportsNonPower2Texture() && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight())))
2112 ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP));
2113 return gl::error(GL_INVALID_OPERATION);
2116 // Cube completeness check
2117 if (target == GL_TEXTURE_CUBE_MAP)
2119 gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture);
2120 if (!textureCube->isCubeComplete())
2122 return gl::error(GL_INVALID_OPERATION);
2126 texture->generateMipmaps();
2131 return gl::error(GL_OUT_OF_MEMORY);
2135 void __stdcall glGenFencesNV(GLsizei n, GLuint* fences)
2137 EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences);
2143 return gl::error(GL_INVALID_VALUE);
2146 gl::Context *context = gl::getNonLostContext();
2150 for (int i = 0; i < n; i++)
2152 fences[i] = context->createFenceNV();
2158 return gl::error(GL_OUT_OF_MEMORY);
2162 void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers)
2164 EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers);
2170 return gl::error(GL_INVALID_VALUE);
2173 gl::Context *context = gl::getNonLostContext();
2177 for (int i = 0; i < n; i++)
2179 framebuffers[i] = context->createFramebuffer();
2185 return gl::error(GL_OUT_OF_MEMORY);
2189 void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids)
2191 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
2195 gl::Context *context = gl::getNonLostContext();
2201 return gl::error(GL_INVALID_VALUE);
2204 for (GLsizei i = 0; i < n; i++)
2206 ids[i] = context->createQuery();
2212 return gl::error(GL_OUT_OF_MEMORY);
2216 void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
2218 EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers);
2224 return gl::error(GL_INVALID_VALUE);
2227 gl::Context *context = gl::getNonLostContext();
2231 for (int i = 0; i < n; i++)
2233 renderbuffers[i] = context->createRenderbuffer();
2239 return gl::error(GL_OUT_OF_MEMORY);
2243 void __stdcall glGenTextures(GLsizei n, GLuint* textures)
2245 EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures);
2251 return gl::error(GL_INVALID_VALUE);
2254 gl::Context *context = gl::getNonLostContext();
2258 for (int i = 0; i < n; i++)
2260 textures[i] = context->createTexture();
2266 return gl::error(GL_OUT_OF_MEMORY);
2270 void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)
2272 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, GLsizei *length = 0x%0.8p, "
2273 "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)",
2274 program, index, bufsize, length, size, type, name);
2280 return gl::error(GL_INVALID_VALUE);
2283 gl::Context *context = gl::getNonLostContext();
2287 gl::Program *programObject = context->getProgram(program);
2291 if (context->getShader(program))
2293 return gl::error(GL_INVALID_OPERATION);
2297 return gl::error(GL_INVALID_VALUE);
2301 if (index >= (GLuint)programObject->getActiveAttributeCount())
2303 return gl::error(GL_INVALID_VALUE);
2306 programObject->getActiveAttribute(index, bufsize, length, size, type, name);
2311 return gl::error(GL_OUT_OF_MEMORY);
2315 void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)
2317 EVENT("(GLuint program = %d, GLuint index = %d, GLsizei bufsize = %d, "
2318 "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
2319 program, index, bufsize, length, size, type, name);
2325 return gl::error(GL_INVALID_VALUE);
2328 gl::Context *context = gl::getNonLostContext();
2332 gl::Program *programObject = context->getProgram(program);
2336 if (context->getShader(program))
2338 return gl::error(GL_INVALID_OPERATION);
2342 return gl::error(GL_INVALID_VALUE);
2346 if (index >= (GLuint)programObject->getActiveUniformCount())
2348 return gl::error(GL_INVALID_VALUE);
2351 programObject->getActiveUniform(index, bufsize, length, size, type, name);
2356 return gl::error(GL_OUT_OF_MEMORY);
2360 void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
2362 EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)",
2363 program, maxcount, count, shaders);
2369 return gl::error(GL_INVALID_VALUE);
2372 gl::Context *context = gl::getNonLostContext();
2376 gl::Program *programObject = context->getProgram(program);
2380 if (context->getShader(program))
2382 return gl::error(GL_INVALID_OPERATION);
2386 return gl::error(GL_INVALID_VALUE);
2390 return programObject->getAttachedShaders(maxcount, count, shaders);
2395 return gl::error(GL_OUT_OF_MEMORY);
2399 int __stdcall glGetAttribLocation(GLuint program, const GLchar* name)
2401 EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name);
2405 gl::Context *context = gl::getNonLostContext();
2410 gl::Program *programObject = context->getProgram(program);
2414 if (context->getShader(program))
2416 return gl::error(GL_INVALID_OPERATION, -1);
2420 return gl::error(GL_INVALID_VALUE, -1);
2424 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
2425 if (!programObject->isLinked() || !programBinary)
2427 return gl::error(GL_INVALID_OPERATION, -1);
2430 return programBinary->getAttributeLocation(name);
2435 return gl::error(GL_OUT_OF_MEMORY, -1);
2441 void __stdcall glGetBooleanv(GLenum pname, GLboolean* params)
2443 EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params);
2447 gl::Context *context = gl::getNonLostContext();
2452 unsigned int numParams = 0;
2453 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2458 if (nativeType == GL_BOOL)
2460 context->getBooleanv(pname, params);
2464 CastStateValues(context, nativeType, pname, numParams, params);
2470 return gl::error(GL_OUT_OF_MEMORY);
2474 void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
2476 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
2480 gl::Context *context = gl::getNonLostContext();
2484 if (!gl::ValidBufferTarget(context, target))
2486 return gl::error(GL_INVALID_ENUM);
2489 if (!gl::ValidBufferParameter(context, pname))
2491 return gl::error(GL_INVALID_ENUM);
2494 gl::Buffer *buffer = context->getTargetBuffer(target);
2498 // A null buffer means that "0" is bound to the requested buffer target
2499 return gl::error(GL_INVALID_OPERATION);
2504 case GL_BUFFER_USAGE:
2505 *params = static_cast<GLint>(buffer->usage());
2507 case GL_BUFFER_SIZE:
2508 *params = gl::clampCast<GLint>(buffer->size());
2510 case GL_BUFFER_ACCESS_FLAGS:
2511 *params = buffer->accessFlags();
2513 case GL_BUFFER_MAPPED:
2514 *params = static_cast<GLint>(buffer->mapped());
2516 case GL_BUFFER_MAP_OFFSET:
2517 *params = gl::clampCast<GLint>(buffer->mapOffset());
2519 case GL_BUFFER_MAP_LENGTH:
2520 *params = gl::clampCast<GLint>(buffer->mapLength());
2522 default: UNREACHABLE(); break;
2528 return gl::error(GL_OUT_OF_MEMORY);
2532 GLenum __stdcall glGetError(void)
2536 gl::Context *context = gl::getContext();
2540 return context->getError();
2546 void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params)
2548 EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params);
2553 gl::Context *context = gl::getNonLostContext();
2557 gl::FenceNV *fenceObject = context->getFenceNV(fence);
2559 if (fenceObject == NULL)
2561 return gl::error(GL_INVALID_OPERATION);
2564 if (fenceObject->isFence() != GL_TRUE)
2566 return gl::error(GL_INVALID_OPERATION);
2571 case GL_FENCE_STATUS_NV:
2572 case GL_FENCE_CONDITION_NV:
2575 default: return gl::error(GL_INVALID_ENUM);
2578 params[0] = fenceObject->getFencei(pname);
2583 return gl::error(GL_OUT_OF_MEMORY);
2587 void __stdcall glGetFloatv(GLenum pname, GLfloat* params)
2589 EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params);
2593 gl::Context *context = gl::getNonLostContext();
2598 unsigned int numParams = 0;
2599 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2604 if (nativeType == GL_FLOAT)
2606 context->getFloatv(pname, params);
2610 CastStateValues(context, nativeType, pname, numParams, params);
2616 return gl::error(GL_OUT_OF_MEMORY);
2620 void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
2622 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
2623 target, attachment, pname, params);
2627 gl::Context *context = gl::getNonLostContext();
2631 if (!gl::ValidFramebufferTarget(target))
2633 return gl::error(GL_INVALID_ENUM);
2638 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2639 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2640 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2641 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2643 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2644 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2645 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2646 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2647 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2648 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2649 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2650 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2651 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2652 if (context->getClientVersion() >= 3)
2657 return gl::error(GL_INVALID_ENUM);
2660 // Determine if the attachment is a valid enum
2667 case GL_DEPTH_STENCIL_ATTACHMENT:
2668 if (context->getClientVersion() < 3)
2670 return gl::error(GL_INVALID_ENUM);
2674 case GL_DEPTH_ATTACHMENT:
2675 case GL_STENCIL_ATTACHMENT:
2679 if (attachment < GL_COLOR_ATTACHMENT0_EXT ||
2680 (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getMaximumRenderTargets())
2682 return gl::error(GL_INVALID_ENUM);
2687 GLuint framebufferHandle = context->getTargetFramebufferHandle(target);
2688 ASSERT(framebufferHandle != GL_INVALID_INDEX);
2689 gl::Framebuffer *framebuffer = context->getFramebuffer(framebufferHandle);
2691 GLenum attachmentType;
2692 GLuint attachmentHandle;
2693 GLuint attachmentLevel;
2694 GLuint attachmentLayer;
2695 gl::FramebufferAttachment *attachmentObject;
2697 if (framebufferHandle == 0)
2699 if (context->getClientVersion() < 3)
2701 return gl::error(GL_INVALID_OPERATION);
2707 attachmentType = framebuffer->getColorbufferType(0);
2708 attachmentHandle = framebuffer->getColorbufferHandle(0);
2709 attachmentLevel = framebuffer->getColorbufferMipLevel(0);
2710 attachmentLayer = framebuffer->getColorbufferLayer(0);
2711 attachmentObject = framebuffer->getColorbuffer(0);
2714 attachmentType = framebuffer->getDepthbufferType();
2715 attachmentHandle = framebuffer->getDepthbufferHandle();
2716 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2717 attachmentLayer = framebuffer->getDepthbufferLayer();
2718 attachmentObject = framebuffer->getDepthbuffer();
2721 attachmentType = framebuffer->getStencilbufferType();
2722 attachmentHandle = framebuffer->getStencilbufferHandle();
2723 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2724 attachmentLayer = framebuffer->getStencilbufferLayer();
2725 attachmentObject = framebuffer->getStencilbuffer();
2728 return gl::error(GL_INVALID_OPERATION);
2733 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
2735 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
2736 attachmentType = framebuffer->getColorbufferType(colorAttachment);
2737 attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
2738 attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
2739 attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
2740 attachmentObject = framebuffer->getColorbuffer(colorAttachment);
2746 case GL_DEPTH_ATTACHMENT:
2747 attachmentType = framebuffer->getDepthbufferType();
2748 attachmentHandle = framebuffer->getDepthbufferHandle();
2749 attachmentLevel = framebuffer->getDepthbufferMipLevel();
2750 attachmentLayer = framebuffer->getDepthbufferLayer();
2751 attachmentObject = framebuffer->getDepthbuffer();
2753 case GL_STENCIL_ATTACHMENT:
2754 attachmentType = framebuffer->getStencilbufferType();
2755 attachmentHandle = framebuffer->getStencilbufferHandle();
2756 attachmentLevel = framebuffer->getStencilbufferMipLevel();
2757 attachmentLayer = framebuffer->getStencilbufferLayer();
2758 attachmentObject = framebuffer->getStencilbuffer();
2760 case GL_DEPTH_STENCIL_ATTACHMENT:
2761 if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
2763 return gl::error(GL_INVALID_OPERATION);
2765 attachmentType = framebuffer->getDepthStencilbufferType();
2766 attachmentHandle = framebuffer->getDepthStencilbufferHandle();
2767 attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
2768 attachmentLayer = framebuffer->getDepthStencilbufferLayer();
2769 attachmentObject = framebuffer->getDepthStencilBuffer();
2772 return gl::error(GL_INVALID_OPERATION);
2777 GLenum attachmentObjectType; // Type category
2778 if (framebufferHandle == 0)
2780 attachmentObjectType = GL_FRAMEBUFFER_DEFAULT;
2782 else if (attachmentType == GL_NONE || attachmentType == GL_RENDERBUFFER)
2784 attachmentObjectType = attachmentType;
2786 else if (gl::IsInternalTextureTarget(attachmentType, context->getClientVersion()))
2788 attachmentObjectType = GL_TEXTURE;
2796 if (attachmentObjectType == GL_NONE)
2798 // ES 2.0.25 spec pg 127 states that if the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
2799 // is NONE, then querying any other pname will generate INVALID_ENUM.
2801 // ES 3.0.2 spec pg 235 states that if the attachment type is none,
2802 // GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME will return zero and be an
2803 // INVALID_OPERATION for all other pnames
2807 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2808 *params = attachmentObjectType;
2811 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2812 if (context->getClientVersion() < 3)
2814 return gl::error(GL_INVALID_ENUM);
2820 if (context->getClientVersion() < 3)
2822 return gl::error(GL_INVALID_ENUM);
2826 gl::error(GL_INVALID_OPERATION);
2832 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
2833 attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
2834 ASSERT(attachmentObject != NULL);
2838 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
2839 *params = attachmentObjectType;
2842 case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
2843 if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE)
2845 return gl::error(GL_INVALID_ENUM);
2847 *params = attachmentHandle;
2850 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
2851 if (attachmentObjectType != GL_TEXTURE)
2853 return gl::error(GL_INVALID_ENUM);
2855 *params = attachmentLevel;
2858 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
2859 if (attachmentObjectType != GL_TEXTURE)
2861 return gl::error(GL_INVALID_ENUM);
2863 *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0;
2866 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
2867 *params = attachmentObject->getRedSize();
2870 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
2871 *params = attachmentObject->getGreenSize();
2874 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
2875 *params = attachmentObject->getBlueSize();
2878 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
2879 *params = attachmentObject->getAlphaSize();
2882 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
2883 *params = attachmentObject->getDepthSize();
2886 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
2887 *params = attachmentObject->getStencilSize();
2890 case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
2891 if (attachment == GL_DEPTH_STENCIL)
2893 gl::error(GL_INVALID_OPERATION);
2895 *params = attachmentObject->getComponentType();
2898 case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
2899 *params = attachmentObject->getColorEncoding();
2902 case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
2903 if (attachmentObjectType != GL_TEXTURE)
2905 return gl::error(GL_INVALID_ENUM);
2907 *params = attachmentLayer;
2919 return gl::error(GL_OUT_OF_MEMORY);
2923 GLenum __stdcall glGetGraphicsResetStatusEXT(void)
2929 gl::Context *context = gl::getContext();
2933 return context->getResetStatus();
2940 return GL_OUT_OF_MEMORY;
2944 void __stdcall glGetIntegerv(GLenum pname, GLint* params)
2946 EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params);
2950 gl::Context *context = gl::getNonLostContext();
2955 unsigned int numParams = 0;
2957 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
2962 if (nativeType == GL_INT)
2964 context->getIntegerv(pname, params);
2968 CastStateValues(context, nativeType, pname, numParams, params);
2974 return gl::error(GL_OUT_OF_MEMORY);
2978 void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
2980 EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params);
2984 gl::Context *context = gl::getNonLostContext();
2988 gl::Program *programObject = context->getProgram(program);
2992 return gl::error(GL_INVALID_VALUE);
2995 if (context->getClientVersion() < 3)
2999 case GL_ACTIVE_UNIFORM_BLOCKS:
3000 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3001 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3002 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3003 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
3004 return gl::error(GL_INVALID_ENUM);
3010 case GL_DELETE_STATUS:
3011 *params = programObject->isFlaggedForDeletion();
3013 case GL_LINK_STATUS:
3014 *params = programObject->isLinked();
3016 case GL_VALIDATE_STATUS:
3017 *params = programObject->isValidated();
3019 case GL_INFO_LOG_LENGTH:
3020 *params = programObject->getInfoLogLength();
3022 case GL_ATTACHED_SHADERS:
3023 *params = programObject->getAttachedShadersCount();
3025 case GL_ACTIVE_ATTRIBUTES:
3026 *params = programObject->getActiveAttributeCount();
3028 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
3029 *params = programObject->getActiveAttributeMaxLength();
3031 case GL_ACTIVE_UNIFORMS:
3032 *params = programObject->getActiveUniformCount();
3034 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
3035 *params = programObject->getActiveUniformMaxLength();
3037 case GL_PROGRAM_BINARY_LENGTH_OES:
3038 *params = programObject->getProgramBinaryLength();
3040 case GL_ACTIVE_UNIFORM_BLOCKS:
3041 *params = programObject->getActiveUniformBlockCount();
3043 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
3044 *params = programObject->getActiveUniformBlockMaxLength();
3046 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
3047 *params = programObject->getTransformFeedbackBufferMode();
3049 case GL_TRANSFORM_FEEDBACK_VARYINGS:
3050 *params = programObject->getTransformFeedbackVaryingCount();
3052 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
3053 *params = programObject->getTransformFeedbackVaryingMaxLength();
3056 return gl::error(GL_INVALID_ENUM);
3062 return gl::error(GL_OUT_OF_MEMORY);
3066 void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)
3068 EVENT("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
3069 program, bufsize, length, infolog);
3075 return gl::error(GL_INVALID_VALUE);
3078 gl::Context *context = gl::getNonLostContext();
3082 gl::Program *programObject = context->getProgram(program);
3086 return gl::error(GL_INVALID_VALUE);
3089 programObject->getInfoLog(bufsize, length, infolog);
3094 return gl::error(GL_OUT_OF_MEMORY);
3098 void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params)
3100 EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params);
3104 gl::Context *context = gl::getNonLostContext();
3108 if (!ValidQueryType(context, target))
3110 return gl::error(GL_INVALID_ENUM);
3115 case GL_CURRENT_QUERY_EXT:
3116 params[0] = context->getActiveQueryId(target);
3120 return gl::error(GL_INVALID_ENUM);
3126 return gl::error(GL_OUT_OF_MEMORY);
3130 void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params)
3132 EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params);
3136 gl::Context *context = gl::getNonLostContext();
3140 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
3144 return gl::error(GL_INVALID_OPERATION);
3147 if (context->getActiveQueryId(queryObject->getType()) == id)
3149 return gl::error(GL_INVALID_OPERATION);
3154 case GL_QUERY_RESULT_EXT:
3155 params[0] = queryObject->getResult();
3157 case GL_QUERY_RESULT_AVAILABLE_EXT:
3158 params[0] = queryObject->isResultAvailable();
3161 return gl::error(GL_INVALID_ENUM);
3167 return gl::error(GL_OUT_OF_MEMORY);
3171 void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
3173 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
3177 gl::Context *context = gl::getNonLostContext();
3181 if (target != GL_RENDERBUFFER)
3183 return gl::error(GL_INVALID_ENUM);
3186 if (context->getRenderbufferHandle() == 0)
3188 return gl::error(GL_INVALID_OPERATION);
3191 gl::FramebufferAttachment *attachment = context->getRenderbuffer(context->getRenderbufferHandle());
3195 case GL_RENDERBUFFER_WIDTH: *params = attachment->getWidth(); break;
3196 case GL_RENDERBUFFER_HEIGHT: *params = attachment->getHeight(); break;
3197 case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = attachment->getInternalFormat(); break;
3198 case GL_RENDERBUFFER_RED_SIZE: *params = attachment->getRedSize(); break;
3199 case GL_RENDERBUFFER_GREEN_SIZE: *params = attachment->getGreenSize(); break;
3200 case GL_RENDERBUFFER_BLUE_SIZE: *params = attachment->getBlueSize(); break;
3201 case GL_RENDERBUFFER_ALPHA_SIZE: *params = attachment->getAlphaSize(); break;
3202 case GL_RENDERBUFFER_DEPTH_SIZE: *params = attachment->getDepthSize(); break;
3203 case GL_RENDERBUFFER_STENCIL_SIZE: *params = attachment->getStencilSize(); break;
3204 case GL_RENDERBUFFER_SAMPLES_ANGLE:
3205 if (context->getMaxSupportedSamples() != 0)
3207 *params = attachment->getSamples();
3211 return gl::error(GL_INVALID_ENUM);
3215 return gl::error(GL_INVALID_ENUM);
3221 return gl::error(GL_OUT_OF_MEMORY);
3225 void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params)
3227 EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params);
3231 gl::Context *context = gl::getNonLostContext();
3235 gl::Shader *shaderObject = context->getShader(shader);
3239 return gl::error(GL_INVALID_VALUE);
3244 case GL_SHADER_TYPE:
3245 *params = shaderObject->getType();
3247 case GL_DELETE_STATUS:
3248 *params = shaderObject->isFlaggedForDeletion();
3250 case GL_COMPILE_STATUS:
3251 *params = shaderObject->isCompiled() ? GL_TRUE : GL_FALSE;
3253 case GL_INFO_LOG_LENGTH:
3254 *params = shaderObject->getInfoLogLength();
3256 case GL_SHADER_SOURCE_LENGTH:
3257 *params = shaderObject->getSourceLength();
3259 case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
3260 *params = shaderObject->getTranslatedSourceLength();
3263 return gl::error(GL_INVALID_ENUM);
3269 return gl::error(GL_OUT_OF_MEMORY);
3273 void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)
3275 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)",
3276 shader, bufsize, length, infolog);
3282 return gl::error(GL_INVALID_VALUE);
3285 gl::Context *context = gl::getNonLostContext();
3289 gl::Shader *shaderObject = context->getShader(shader);
3293 return gl::error(GL_INVALID_VALUE);
3296 shaderObject->getInfoLog(bufsize, length, infolog);
3301 return gl::error(GL_OUT_OF_MEMORY);
3305 void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
3307 EVENT("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)",
3308 shadertype, precisiontype, range, precision);
3314 case GL_VERTEX_SHADER:
3315 case GL_FRAGMENT_SHADER:
3318 return gl::error(GL_INVALID_ENUM);
3321 switch (precisiontype)
3324 case GL_MEDIUM_FLOAT:
3326 // Assume IEEE 754 precision
3334 // Some (most) hardware only supports single-precision floating-point numbers,
3335 // which can accurately represent integers up to +/-16777216
3341 return gl::error(GL_INVALID_ENUM);
3346 return gl::error(GL_OUT_OF_MEMORY);
3350 void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3352 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3353 shader, bufsize, length, source);
3359 return gl::error(GL_INVALID_VALUE);
3362 gl::Context *context = gl::getNonLostContext();
3366 gl::Shader *shaderObject = context->getShader(shader);
3370 return gl::error(GL_INVALID_OPERATION);
3373 shaderObject->getSource(bufsize, length, source);
3378 return gl::error(GL_OUT_OF_MEMORY);
3382 void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)
3384 EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)",
3385 shader, bufsize, length, source);
3391 return gl::error(GL_INVALID_VALUE);
3394 gl::Context *context = gl::getNonLostContext();
3398 gl::Shader *shaderObject = context->getShader(shader);
3402 return gl::error(GL_INVALID_OPERATION);
3405 shaderObject->getTranslatedSource(bufsize, length, source);
3410 return gl::error(GL_OUT_OF_MEMORY);
3414 const GLubyte* __stdcall glGetString(GLenum name)
3416 EVENT("(GLenum name = 0x%X)", name);
3420 gl::Context *context = gl::getNonLostContext();
3425 return (GLubyte*)"Google Inc.";
3427 return (GLubyte*)((context != NULL) ? context->getRendererString() : "ANGLE");
3429 if (context->getClientVersion() == 2)
3431 return (GLubyte*)"OpenGL ES 2.0 (ANGLE " ANGLE_VERSION_STRING ")";
3435 return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")";
3437 case GL_SHADING_LANGUAGE_VERSION:
3438 if (context->getClientVersion() == 2)
3440 return (GLubyte*)"OpenGL ES GLSL ES 1.00 (ANGLE " ANGLE_VERSION_STRING ")";
3444 return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")";
3447 return (GLubyte*)((context != NULL) ? context->getCombinedExtensionsString() : "");
3449 return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL);
3454 return gl::error(GL_OUT_OF_MEMORY, (GLubyte*)NULL);
3458 void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
3460 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params);
3464 gl::Context *context = gl::getNonLostContext();
3468 gl::Texture *texture = context->getTargetTexture(target);
3472 return gl::error(GL_INVALID_ENUM);
3477 case GL_TEXTURE_MAG_FILTER:
3478 *params = (GLfloat)texture->getMagFilter();
3480 case GL_TEXTURE_MIN_FILTER:
3481 *params = (GLfloat)texture->getMinFilter();
3483 case GL_TEXTURE_WRAP_S:
3484 *params = (GLfloat)texture->getWrapS();
3486 case GL_TEXTURE_WRAP_T:
3487 *params = (GLfloat)texture->getWrapT();
3489 case GL_TEXTURE_WRAP_R:
3490 if (context->getClientVersion() < 3)
3492 return gl::error(GL_INVALID_ENUM);
3494 *params = (GLfloat)texture->getWrapR();
3496 case GL_TEXTURE_IMMUTABLE_FORMAT:
3497 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
3498 *params = (GLfloat)(texture->isImmutable() ? GL_TRUE : GL_FALSE);
3500 case GL_TEXTURE_IMMUTABLE_LEVELS:
3501 if (context->getClientVersion() < 3)
3503 return gl::error(GL_INVALID_ENUM);
3505 *params = (GLfloat)texture->immutableLevelCount();
3507 case GL_TEXTURE_USAGE_ANGLE:
3508 *params = (GLfloat)texture->getUsage();
3510 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3511 if (!context->supportsTextureFilterAnisotropy())
3513 return gl::error(GL_INVALID_ENUM);
3515 *params = (GLfloat)texture->getMaxAnisotropy();
3517 case GL_TEXTURE_SWIZZLE_R:
3518 if (context->getClientVersion() < 3)
3520 return gl::error(GL_INVALID_ENUM);
3522 *params = (GLfloat)texture->getSwizzleRed();
3524 case GL_TEXTURE_SWIZZLE_G:
3525 if (context->getClientVersion() < 3)
3527 return gl::error(GL_INVALID_ENUM);
3529 *params = (GLfloat)texture->getSwizzleGreen();
3531 case GL_TEXTURE_SWIZZLE_B:
3532 if (context->getClientVersion() < 3)
3534 return gl::error(GL_INVALID_ENUM);
3536 *params = (GLfloat)texture->getSwizzleBlue();
3538 case GL_TEXTURE_SWIZZLE_A:
3539 if (context->getClientVersion() < 3)
3541 return gl::error(GL_INVALID_ENUM);
3543 *params = (GLfloat)texture->getSwizzleAlpha();
3545 case GL_TEXTURE_BASE_LEVEL:
3546 if (context->getClientVersion() < 3)
3548 return gl::error(GL_INVALID_ENUM);
3550 *params = (GLfloat)texture->getBaseLevel();
3552 case GL_TEXTURE_MAX_LEVEL:
3553 if (context->getClientVersion() < 3)
3555 return gl::error(GL_INVALID_ENUM);
3557 *params = (GLfloat)texture->getMaxLevel();
3559 case GL_TEXTURE_MIN_LOD:
3560 if (context->getClientVersion() < 3)
3562 return gl::error(GL_INVALID_ENUM);
3564 *params = texture->getMinLod();
3566 case GL_TEXTURE_MAX_LOD:
3567 if (context->getClientVersion() < 3)
3569 return gl::error(GL_INVALID_ENUM);
3571 *params = texture->getMaxLod();
3574 return gl::error(GL_INVALID_ENUM);
3580 return gl::error(GL_OUT_OF_MEMORY);
3584 void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
3586 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
3590 gl::Context *context = gl::getNonLostContext();
3594 gl::Texture *texture = context->getTargetTexture(target);
3598 return gl::error(GL_INVALID_ENUM);
3603 case GL_TEXTURE_MAG_FILTER:
3604 *params = texture->getMagFilter();
3606 case GL_TEXTURE_MIN_FILTER:
3607 *params = texture->getMinFilter();
3609 case GL_TEXTURE_WRAP_S:
3610 *params = texture->getWrapS();
3612 case GL_TEXTURE_WRAP_T:
3613 *params = texture->getWrapT();
3615 case GL_TEXTURE_WRAP_R:
3616 if (context->getClientVersion() < 3)
3618 return gl::error(GL_INVALID_ENUM);
3620 *params = texture->getWrapR();
3622 case GL_TEXTURE_IMMUTABLE_FORMAT:
3623 // Exposed to ES2.0 through EXT_texture_storage, no client version validation.
3624 *params = texture->isImmutable() ? GL_TRUE : GL_FALSE;
3626 case GL_TEXTURE_IMMUTABLE_LEVELS:
3627 if (context->getClientVersion() < 3)
3629 return gl::error(GL_INVALID_ENUM);
3631 *params = texture->immutableLevelCount();
3633 case GL_TEXTURE_USAGE_ANGLE:
3634 *params = texture->getUsage();
3636 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
3637 if (!context->supportsTextureFilterAnisotropy())
3639 return gl::error(GL_INVALID_ENUM);
3641 *params = (GLint)texture->getMaxAnisotropy();
3643 case GL_TEXTURE_SWIZZLE_R:
3644 if (context->getClientVersion() < 3)
3646 return gl::error(GL_INVALID_ENUM);
3648 *params = texture->getSwizzleRed();
3650 case GL_TEXTURE_SWIZZLE_G:
3651 if (context->getClientVersion() < 3)
3653 return gl::error(GL_INVALID_ENUM);
3655 *params = texture->getSwizzleGreen();
3657 case GL_TEXTURE_SWIZZLE_B:
3658 if (context->getClientVersion() < 3)
3660 return gl::error(GL_INVALID_ENUM);
3662 *params = texture->getSwizzleBlue();
3664 case GL_TEXTURE_SWIZZLE_A:
3665 if (context->getClientVersion() < 3)
3667 return gl::error(GL_INVALID_ENUM);
3669 *params = texture->getSwizzleAlpha();
3671 case GL_TEXTURE_BASE_LEVEL:
3672 if (context->getClientVersion() < 3)
3674 return gl::error(GL_INVALID_ENUM);
3676 *params = texture->getBaseLevel();
3678 case GL_TEXTURE_MAX_LEVEL:
3679 if (context->getClientVersion() < 3)
3681 return gl::error(GL_INVALID_ENUM);
3683 *params = texture->getMaxLevel();
3685 case GL_TEXTURE_MIN_LOD:
3686 if (context->getClientVersion() < 3)
3688 return gl::error(GL_INVALID_ENUM);
3690 *params = (GLint)texture->getMinLod();
3692 case GL_TEXTURE_MAX_LOD:
3693 if (context->getClientVersion() < 3)
3695 return gl::error(GL_INVALID_ENUM);
3697 *params = (GLint)texture->getMaxLod();
3700 return gl::error(GL_INVALID_ENUM);
3706 return gl::error(GL_OUT_OF_MEMORY);
3710 void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
3712 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
3713 program, location, bufSize, params);
3719 return gl::error(GL_INVALID_VALUE);
3722 gl::Context *context = gl::getNonLostContext();
3728 return gl::error(GL_INVALID_VALUE);
3731 gl::Program *programObject = context->getProgram(program);
3733 if (!programObject || !programObject->isLinked())
3735 return gl::error(GL_INVALID_OPERATION);
3738 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3741 return gl::error(GL_INVALID_OPERATION);
3744 if (!programBinary->getUniformfv(location, &bufSize, params))
3746 return gl::error(GL_INVALID_OPERATION);
3752 return gl::error(GL_OUT_OF_MEMORY);
3756 void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
3758 EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
3762 gl::Context *context = gl::getNonLostContext();
3768 return gl::error(GL_INVALID_VALUE);
3771 gl::Program *programObject = context->getProgram(program);
3773 if (!programObject || !programObject->isLinked())
3775 return gl::error(GL_INVALID_OPERATION);
3778 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3781 return gl::error(GL_INVALID_OPERATION);
3784 if (!programBinary->getUniformfv(location, NULL, params))
3786 return gl::error(GL_INVALID_OPERATION);
3792 return gl::error(GL_OUT_OF_MEMORY);
3796 void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
3798 EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
3799 program, location, bufSize, params);
3805 return gl::error(GL_INVALID_VALUE);
3808 gl::Context *context = gl::getNonLostContext();
3814 return gl::error(GL_INVALID_VALUE);
3817 gl::Program *programObject = context->getProgram(program);
3819 if (!programObject || !programObject->isLinked())
3821 return gl::error(GL_INVALID_OPERATION);
3824 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3827 return gl::error(GL_INVALID_OPERATION);
3830 if (!programBinary->getUniformiv(location, &bufSize, params))
3832 return gl::error(GL_INVALID_OPERATION);
3838 return gl::error(GL_OUT_OF_MEMORY);
3842 void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
3844 EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params);
3848 gl::Context *context = gl::getNonLostContext();
3854 return gl::error(GL_INVALID_VALUE);
3857 gl::Program *programObject = context->getProgram(program);
3859 if (!programObject || !programObject->isLinked())
3861 return gl::error(GL_INVALID_OPERATION);
3864 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3867 return gl::error(GL_INVALID_OPERATION);
3870 if (!programBinary->getUniformiv(location, NULL, params))
3872 return gl::error(GL_INVALID_OPERATION);
3878 return gl::error(GL_OUT_OF_MEMORY);
3882 int __stdcall glGetUniformLocation(GLuint program, const GLchar* name)
3884 EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name);
3888 gl::Context *context = gl::getNonLostContext();
3890 if (strstr(name, "gl_") == name)
3897 gl::Program *programObject = context->getProgram(program);
3901 if (context->getShader(program))
3903 return gl::error(GL_INVALID_OPERATION, -1);
3907 return gl::error(GL_INVALID_VALUE, -1);
3911 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
3912 if (!programObject->isLinked() || !programBinary)
3914 return gl::error(GL_INVALID_OPERATION, -1);
3917 return programBinary->getUniformLocation(name);
3922 return gl::error(GL_OUT_OF_MEMORY, -1);
3928 void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
3930 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params);
3934 gl::Context *context = gl::getNonLostContext();
3938 if (index >= gl::MAX_VERTEX_ATTRIBS)
3940 return gl::error(GL_INVALID_VALUE);
3943 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
3945 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
3950 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3952 const gl::VertexAttribCurrentValueData ¤tValueData = context->getVertexAttribCurrentValue(index);
3953 for (int i = 0; i < 4; ++i)
3955 params[i] = currentValueData.FloatValues[i];
3960 *params = attribState.querySingleParameter<GLfloat>(pname);
3966 return gl::error(GL_OUT_OF_MEMORY);
3970 void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
3972 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params);
3976 gl::Context *context = gl::getNonLostContext();
3980 if (index >= gl::MAX_VERTEX_ATTRIBS)
3982 return gl::error(GL_INVALID_VALUE);
3985 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
3987 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
3992 if (pname == GL_CURRENT_VERTEX_ATTRIB)
3994 const gl::VertexAttribCurrentValueData ¤tValueData = context->getVertexAttribCurrentValue(index);
3995 for (int i = 0; i < 4; ++i)
3997 float currentValue = currentValueData.FloatValues[i];
3998 params[i] = gl::iround<GLint>(currentValue);
4003 *params = attribState.querySingleParameter<GLint>(pname);
4009 return gl::error(GL_OUT_OF_MEMORY);
4013 void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer)
4015 EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer);
4019 gl::Context *context = gl::getNonLostContext();
4023 if (index >= gl::MAX_VERTEX_ATTRIBS)
4025 return gl::error(GL_INVALID_VALUE);
4028 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
4030 return gl::error(GL_INVALID_ENUM);
4033 *pointer = const_cast<GLvoid*>(context->getVertexAttribPointer(index));
4038 return gl::error(GL_OUT_OF_MEMORY);
4042 void __stdcall glHint(GLenum target, GLenum mode)
4044 EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode);
4055 return gl::error(GL_INVALID_ENUM);
4058 gl::Context *context = gl::getNonLostContext();
4061 case GL_GENERATE_MIPMAP_HINT:
4062 if (context) context->setGenerateMipmapHint(mode);
4064 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
4065 if (context) context->setFragmentShaderDerivativeHint(mode);
4068 return gl::error(GL_INVALID_ENUM);
4073 return gl::error(GL_OUT_OF_MEMORY);
4077 GLboolean __stdcall glIsBuffer(GLuint buffer)
4079 EVENT("(GLuint buffer = %d)", buffer);
4083 gl::Context *context = gl::getNonLostContext();
4085 if (context && buffer)
4087 gl::Buffer *bufferObject = context->getBuffer(buffer);
4097 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
4103 GLboolean __stdcall glIsEnabled(GLenum cap)
4105 EVENT("(GLenum cap = 0x%X)", cap);
4109 gl::Context *context = gl::getNonLostContext();
4113 if (!ValidCap(context, cap))
4115 return gl::error(GL_INVALID_ENUM, false);
4118 return context->getCap(cap);
4123 return gl::error(GL_OUT_OF_MEMORY, false);
4129 GLboolean __stdcall glIsFenceNV(GLuint fence)
4131 EVENT("(GLuint fence = %d)", fence);
4135 gl::Context *context = gl::getNonLostContext();
4139 gl::FenceNV *fenceObject = context->getFenceNV(fence);
4141 if (fenceObject == NULL)
4146 return fenceObject->isFence();
4151 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
4157 GLboolean __stdcall glIsFramebuffer(GLuint framebuffer)
4159 EVENT("(GLuint framebuffer = %d)", framebuffer);
4163 gl::Context *context = gl::getNonLostContext();
4165 if (context && framebuffer)
4167 gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer);
4169 if (framebufferObject)
4177 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
4183 GLboolean __stdcall glIsProgram(GLuint program)
4185 EVENT("(GLuint program = %d)", program);
4189 gl::Context *context = gl::getNonLostContext();
4191 if (context && program)
4193 gl::Program *programObject = context->getProgram(program);
4203 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
4209 GLboolean __stdcall glIsQueryEXT(GLuint id)
4211 EVENT("(GLuint id = %d)", id);
4215 gl::Context *context = gl::getNonLostContext();
4219 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
4224 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
4230 GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer)
4232 EVENT("(GLuint renderbuffer = %d)", renderbuffer);
4236 gl::Context *context = gl::getNonLostContext();
4238 if (context && renderbuffer)
4240 gl::FramebufferAttachment *renderbufferObject = context->getRenderbuffer(renderbuffer);
4242 if (renderbufferObject)
4250 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
4256 GLboolean __stdcall glIsShader(GLuint shader)
4258 EVENT("(GLuint shader = %d)", shader);
4262 gl::Context *context = gl::getNonLostContext();
4264 if (context && shader)
4266 gl::Shader *shaderObject = context->getShader(shader);
4276 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
4282 GLboolean __stdcall glIsTexture(GLuint texture)
4284 EVENT("(GLuint texture = %d)", texture);
4288 gl::Context *context = gl::getNonLostContext();
4290 if (context && texture)
4292 gl::Texture *textureObject = context->getTexture(texture);
4302 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
4308 void __stdcall glLineWidth(GLfloat width)
4310 EVENT("(GLfloat width = %f)", width);
4316 return gl::error(GL_INVALID_VALUE);
4319 gl::Context *context = gl::getNonLostContext();
4323 context->setLineWidth(width);
4328 return gl::error(GL_OUT_OF_MEMORY);
4332 void __stdcall glLinkProgram(GLuint program)
4334 EVENT("(GLuint program = %d)", program);
4338 gl::Context *context = gl::getNonLostContext();
4342 gl::Program *programObject = context->getProgram(program);
4346 if (context->getShader(program))
4348 return gl::error(GL_INVALID_OPERATION);
4352 return gl::error(GL_INVALID_VALUE);
4356 context->linkProgram(program);
4361 return gl::error(GL_OUT_OF_MEMORY);
4365 void __stdcall glPixelStorei(GLenum pname, GLint param)
4367 EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param);
4371 gl::Context *context = gl::getNonLostContext();
4377 case GL_UNPACK_ALIGNMENT:
4378 if (param != 1 && param != 2 && param != 4 && param != 8)
4380 return gl::error(GL_INVALID_VALUE);
4383 context->setUnpackAlignment(param);
4386 case GL_PACK_ALIGNMENT:
4387 if (param != 1 && param != 2 && param != 4 && param != 8)
4389 return gl::error(GL_INVALID_VALUE);
4392 context->setPackAlignment(param);
4395 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
4396 context->setPackReverseRowOrder(param != 0);
4399 case GL_UNPACK_IMAGE_HEIGHT:
4400 case GL_UNPACK_SKIP_IMAGES:
4401 case GL_UNPACK_ROW_LENGTH:
4402 case GL_UNPACK_SKIP_ROWS:
4403 case GL_UNPACK_SKIP_PIXELS:
4404 case GL_PACK_ROW_LENGTH:
4405 case GL_PACK_SKIP_ROWS:
4406 case GL_PACK_SKIP_PIXELS:
4407 if (context->getClientVersion() < 3)
4409 return gl::error(GL_INVALID_ENUM);
4415 return gl::error(GL_INVALID_ENUM);
4421 return gl::error(GL_OUT_OF_MEMORY);
4425 void __stdcall glPolygonOffset(GLfloat factor, GLfloat units)
4427 EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units);
4431 gl::Context *context = gl::getNonLostContext();
4435 context->setPolygonOffsetParams(factor, units);
4440 return gl::error(GL_OUT_OF_MEMORY);
4444 void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height,
4445 GLenum format, GLenum type, GLsizei bufSize,
4448 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4449 "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)",
4450 x, y, width, height, format, type, bufSize, data);
4454 if (width < 0 || height < 0 || bufSize < 0)
4456 return gl::error(GL_INVALID_VALUE);
4459 gl::Context *context = gl::getNonLostContext();
4463 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4464 format, type, &bufSize, data))
4469 context->readPixels(x, y, width, height, format, type, &bufSize, data);
4474 return gl::error(GL_OUT_OF_MEMORY);
4478 void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
4479 GLenum format, GLenum type, GLvoid* pixels)
4481 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
4482 "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)",
4483 x, y, width, height, format, type, pixels);
4487 if (width < 0 || height < 0)
4489 return gl::error(GL_INVALID_VALUE);
4492 gl::Context *context = gl::getNonLostContext();
4496 if (!gl::ValidateReadPixelsParameters(context, x, y, width, height,
4497 format, type, NULL, pixels))
4502 context->readPixels(x, y, width, height, format, type, NULL, pixels);
4507 return gl::error(GL_OUT_OF_MEMORY);
4511 void __stdcall glReleaseShaderCompiler(void)
4517 gl::Shader::releaseCompiler();
4521 return gl::error(GL_OUT_OF_MEMORY);
4525 void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
4527 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
4528 target, samples, internalformat, width, height);
4532 gl::Context *context = gl::getNonLostContext();
4536 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
4537 width, height, true))
4542 context->setRenderbufferStorage(width, height, internalformat, samples);
4547 return gl::error(GL_OUT_OF_MEMORY);
4551 void __stdcall glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
4553 glRenderbufferStorageMultisampleANGLE(target, 0, internalformat, width, height);
4556 void __stdcall glSampleCoverage(GLclampf value, GLboolean invert)
4558 EVENT("(GLclampf value = %f, GLboolean invert = %u)", value, invert);
4562 gl::Context* context = gl::getNonLostContext();
4566 context->setSampleCoverageParams(gl::clamp01(value), invert == GL_TRUE);
4571 return gl::error(GL_OUT_OF_MEMORY);
4575 void __stdcall glSetFenceNV(GLuint fence, GLenum condition)
4577 EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition);
4581 if (condition != GL_ALL_COMPLETED_NV)
4583 return gl::error(GL_INVALID_ENUM);
4586 gl::Context *context = gl::getNonLostContext();
4590 gl::FenceNV *fenceObject = context->getFenceNV(fence);
4592 if (fenceObject == NULL)
4594 return gl::error(GL_INVALID_OPERATION);
4597 fenceObject->setFence(condition);
4602 return gl::error(GL_OUT_OF_MEMORY);
4606 void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
4608 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
4612 if (width < 0 || height < 0)
4614 return gl::error(GL_INVALID_VALUE);
4617 gl::Context* context = gl::getNonLostContext();
4621 context->setScissorParams(x, y, width, height);
4626 return gl::error(GL_OUT_OF_MEMORY);
4630 void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)
4632 EVENT("(GLsizei n = %d, const GLuint* shaders = 0x%0.8p, GLenum binaryformat = 0x%X, "
4633 "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
4634 n, shaders, binaryformat, binary, length);
4638 // No binary shader formats are supported.
4639 return gl::error(GL_INVALID_ENUM);
4643 return gl::error(GL_OUT_OF_MEMORY);
4647 void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
4649 EVENT("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)",
4650 shader, count, string, length);
4656 return gl::error(GL_INVALID_VALUE);
4659 gl::Context *context = gl::getNonLostContext();
4663 gl::Shader *shaderObject = context->getShader(shader);
4667 if (context->getProgram(shader))
4669 return gl::error(GL_INVALID_OPERATION);
4673 return gl::error(GL_INVALID_VALUE);
4677 shaderObject->setSource(count, string, length);
4682 return gl::error(GL_OUT_OF_MEMORY);
4686 void __stdcall glStencilFunc(GLenum func, GLint ref, GLuint mask)
4688 glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
4691 void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
4693 EVENT("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask);
4701 case GL_FRONT_AND_BACK:
4704 return gl::error(GL_INVALID_ENUM);
4719 return gl::error(GL_INVALID_ENUM);
4722 gl::Context *context = gl::getNonLostContext();
4726 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4728 context->setStencilParams(func, ref, mask);
4731 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4733 context->setStencilBackParams(func, ref, mask);
4739 return gl::error(GL_OUT_OF_MEMORY);
4743 void __stdcall glStencilMask(GLuint mask)
4745 glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
4748 void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask)
4750 EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask);
4758 case GL_FRONT_AND_BACK:
4761 return gl::error(GL_INVALID_ENUM);
4764 gl::Context *context = gl::getNonLostContext();
4768 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4770 context->setStencilWritemask(mask);
4773 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4775 context->setStencilBackWritemask(mask);
4781 return gl::error(GL_OUT_OF_MEMORY);
4785 void __stdcall glStencilOp(GLenum fail, GLenum zfail, GLenum zpass)
4787 glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
4790 void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
4792 EVENT("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)",
4793 face, fail, zfail, zpass);
4801 case GL_FRONT_AND_BACK:
4804 return gl::error(GL_INVALID_ENUM);
4819 return gl::error(GL_INVALID_ENUM);
4834 return gl::error(GL_INVALID_ENUM);
4849 return gl::error(GL_INVALID_ENUM);
4852 gl::Context *context = gl::getNonLostContext();
4856 if (face == GL_FRONT || face == GL_FRONT_AND_BACK)
4858 context->setStencilOperations(fail, zfail, zpass);
4861 if (face == GL_BACK || face == GL_FRONT_AND_BACK)
4863 context->setStencilBackOperations(fail, zfail, zpass);
4869 return gl::error(GL_OUT_OF_MEMORY);
4873 GLboolean __stdcall glTestFenceNV(GLuint fence)
4875 EVENT("(GLuint fence = %d)", fence);
4879 gl::Context *context = gl::getNonLostContext();
4883 gl::FenceNV *fenceObject = context->getFenceNV(fence);
4885 if (fenceObject == NULL)
4887 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4890 if (fenceObject->isFence() != GL_TRUE)
4892 return gl::error(GL_INVALID_OPERATION, GL_TRUE);
4895 return fenceObject->testFence();
4900 gl::error(GL_OUT_OF_MEMORY);
4906 void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
4907 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
4909 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, GLsizei height = %d, "
4910 "GLint border = %d, GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
4911 target, level, internalformat, width, height, border, format, type, pixels);
4915 gl::Context *context = gl::getNonLostContext();
4919 if (context->getClientVersion() < 3 &&
4920 !ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
4921 0, 0, width, height, border, format, type, pixels))
4926 if (context->getClientVersion() >= 3 &&
4927 !ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
4928 0, 0, 0, width, height, 1, border, format, type, pixels))
4937 gl::Texture2D *texture = context->getTexture2D();
4938 texture->setImage(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
4941 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
4943 gl::TextureCubeMap *texture = context->getTextureCubeMap();
4944 texture->setImagePosX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
4947 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
4949 gl::TextureCubeMap *texture = context->getTextureCubeMap();
4950 texture->setImageNegX(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
4953 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
4955 gl::TextureCubeMap *texture = context->getTextureCubeMap();
4956 texture->setImagePosY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
4959 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
4961 gl::TextureCubeMap *texture = context->getTextureCubeMap();
4962 texture->setImageNegY(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
4965 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
4967 gl::TextureCubeMap *texture = context->getTextureCubeMap();
4968 texture->setImagePosZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
4971 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
4973 gl::TextureCubeMap *texture = context->getTextureCubeMap();
4974 texture->setImageNegZ(level, width, height, internalformat, format, type, context->getUnpackState(), pixels);
4977 default: UNREACHABLE();
4983 return gl::error(GL_OUT_OF_MEMORY);
4987 void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param)
4989 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param);
4993 gl::Context *context = gl::getNonLostContext();
4997 if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
5002 gl::Texture *texture = context->getTargetTexture(target);
5006 return gl::error(GL_INVALID_ENUM);
5011 case GL_TEXTURE_WRAP_S: texture->setWrapS(gl::uiround<GLenum>(param)); break;
5012 case GL_TEXTURE_WRAP_T: texture->setWrapT(gl::uiround<GLenum>(param)); break;
5013 case GL_TEXTURE_WRAP_R: texture->setWrapR(gl::uiround<GLenum>(param)); break;
5014 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter(gl::uiround<GLenum>(param)); break;
5015 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter(gl::uiround<GLenum>(param)); break;
5016 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage(gl::uiround<GLenum>(param)); break;
5017 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy(param, context->getTextureMaxAnisotropy()); break;
5018 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode(gl::uiround<GLenum>(param)); break;
5019 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc(gl::uiround<GLenum>(param)); break;
5020 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed(gl::uiround<GLenum>(param)); break;
5021 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen(gl::uiround<GLenum>(param)); break;
5022 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue(gl::uiround<GLenum>(param)); break;
5023 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha(gl::uiround<GLenum>(param)); break;
5024 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(gl::iround<GLint>(param)); break;
5025 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(gl::iround<GLint>(param)); break;
5026 case GL_TEXTURE_MIN_LOD: texture->setMinLod(param); break;
5027 case GL_TEXTURE_MAX_LOD: texture->setMaxLod(param); break;
5028 default: UNREACHABLE(); break;
5034 return gl::error(GL_OUT_OF_MEMORY);
5038 void __stdcall glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
5040 glTexParameterf(target, pname, (GLfloat)*params);
5043 void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param)
5045 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param);
5049 gl::Context *context = gl::getNonLostContext();
5053 if (!ValidateTexParamParameters(context, pname, param))
5058 gl::Texture *texture = context->getTargetTexture(target);
5062 return gl::error(GL_INVALID_ENUM);
5067 case GL_TEXTURE_WRAP_S: texture->setWrapS((GLenum)param); break;
5068 case GL_TEXTURE_WRAP_T: texture->setWrapT((GLenum)param); break;
5069 case GL_TEXTURE_WRAP_R: texture->setWrapR((GLenum)param); break;
5070 case GL_TEXTURE_MIN_FILTER: texture->setMinFilter((GLenum)param); break;
5071 case GL_TEXTURE_MAG_FILTER: texture->setMagFilter((GLenum)param); break;
5072 case GL_TEXTURE_USAGE_ANGLE: texture->setUsage((GLenum)param); break;
5073 case GL_TEXTURE_MAX_ANISOTROPY_EXT: texture->setMaxAnisotropy((float)param, context->getTextureMaxAnisotropy()); break;
5074 case GL_TEXTURE_COMPARE_MODE: texture->setCompareMode((GLenum)param); break;
5075 case GL_TEXTURE_COMPARE_FUNC: texture->setCompareFunc((GLenum)param); break;
5076 case GL_TEXTURE_SWIZZLE_R: texture->setSwizzleRed((GLenum)param); break;
5077 case GL_TEXTURE_SWIZZLE_G: texture->setSwizzleGreen((GLenum)param); break;
5078 case GL_TEXTURE_SWIZZLE_B: texture->setSwizzleBlue((GLenum)param); break;
5079 case GL_TEXTURE_SWIZZLE_A: texture->setSwizzleAlpha((GLenum)param); break;
5080 case GL_TEXTURE_BASE_LEVEL: texture->setBaseLevel(param); break;
5081 case GL_TEXTURE_MAX_LEVEL: texture->setMaxLevel(param); break;
5082 case GL_TEXTURE_MIN_LOD: texture->setMinLod((GLfloat)param); break;
5083 case GL_TEXTURE_MAX_LOD: texture->setMaxLod((GLfloat)param); break;
5084 default: UNREACHABLE(); break;
5090 return gl::error(GL_OUT_OF_MEMORY);
5094 void __stdcall glTexParameteriv(GLenum target, GLenum pname, const GLint* params)
5096 glTexParameteri(target, pname, *params);
5099 void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
5101 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
5102 target, levels, internalformat, width, height);
5106 gl::Context *context = gl::getNonLostContext();
5110 if (context->getClientVersion() < 3 &&
5111 !ValidateES2TexStorageParameters(context, target, levels, internalformat, width, height))
5116 if (context->getClientVersion() >= 3 &&
5117 !ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
5126 gl::Texture2D *texture2d = context->getTexture2D();
5127 texture2d->storage(levels, internalformat, width, height);
5131 case GL_TEXTURE_CUBE_MAP:
5133 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
5134 textureCube->storage(levels, internalformat, width);
5139 return gl::error(GL_INVALID_ENUM);
5145 return gl::error(GL_OUT_OF_MEMORY);
5149 void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
5150 GLenum format, GLenum type, const GLvoid* pixels)
5152 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
5153 "GLsizei width = %d, GLsizei height = %d, GLenum format = 0x%X, GLenum type = 0x%X, "
5154 "const GLvoid* pixels = 0x%0.8p)",
5155 target, level, xoffset, yoffset, width, height, format, type, pixels);
5159 gl::Context *context = gl::getNonLostContext();
5163 if (context->getClientVersion() < 3 &&
5164 !ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true,
5165 xoffset, yoffset, width, height, 0, format, type, pixels))
5170 if (context->getClientVersion() >= 3 &&
5171 !ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
5172 xoffset, yoffset, 0, width, height, 1, 0, format, type, pixels))
5177 // Zero sized uploads are valid but no-ops
5178 if (width == 0 || height == 0)
5187 gl::Texture2D *texture = context->getTexture2D();
5188 texture->subImage(level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
5192 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5193 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5194 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5195 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5196 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5197 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5199 gl::TextureCubeMap *texture = context->getTextureCubeMap();
5200 texture->subImage(target, level, xoffset, yoffset, width, height, format, type, context->getUnpackState(), pixels);
5211 return gl::error(GL_OUT_OF_MEMORY);
5215 void __stdcall glUniform1f(GLint location, GLfloat x)
5217 glUniform1fv(location, 1, &x);
5220 void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v)
5222 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
5226 gl::Context *context = gl::getNonLostContext();
5230 if (!ValidateUniform(context, GL_FLOAT, location, count))
5235 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5236 programBinary->setUniform1fv(location, count, v);
5241 return gl::error(GL_OUT_OF_MEMORY);
5245 void __stdcall glUniform1i(GLint location, GLint x)
5247 glUniform1iv(location, 1, &x);
5250 void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v)
5252 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
5256 gl::Context *context = gl::getNonLostContext();
5260 if (!ValidateUniform(context, GL_INT, location, count))
5265 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5266 programBinary->setUniform1iv(location, count, v);
5271 return gl::error(GL_OUT_OF_MEMORY);
5275 void __stdcall glUniform2f(GLint location, GLfloat x, GLfloat y)
5277 GLfloat xy[2] = {x, y};
5279 glUniform2fv(location, 1, xy);
5282 void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v)
5284 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
5288 gl::Context *context = gl::getNonLostContext();
5292 if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count))
5297 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5298 programBinary->setUniform2fv(location, count, v);
5303 return gl::error(GL_OUT_OF_MEMORY);
5307 void __stdcall glUniform2i(GLint location, GLint x, GLint y)
5309 GLint xy[2] = {x, y};
5311 glUniform2iv(location, 1, xy);
5314 void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v)
5316 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
5320 gl::Context *context = gl::getNonLostContext();
5324 if (!ValidateUniform(context, GL_INT_VEC2, location, count))
5329 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5330 programBinary->setUniform2iv(location, count, v);
5335 return gl::error(GL_OUT_OF_MEMORY);
5339 void __stdcall glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
5341 GLfloat xyz[3] = {x, y, z};
5343 glUniform3fv(location, 1, xyz);
5346 void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v)
5348 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
5352 gl::Context *context = gl::getNonLostContext();
5356 if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count))
5361 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5362 programBinary->setUniform3fv(location, count, v);
5367 return gl::error(GL_OUT_OF_MEMORY);
5371 void __stdcall glUniform3i(GLint location, GLint x, GLint y, GLint z)
5373 GLint xyz[3] = {x, y, z};
5375 glUniform3iv(location, 1, xyz);
5378 void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v)
5380 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
5384 gl::Context *context = gl::getNonLostContext();
5388 if (!ValidateUniform(context, GL_INT_VEC3, location, count))
5393 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5394 programBinary->setUniform3iv(location, count, v);
5399 return gl::error(GL_OUT_OF_MEMORY);
5403 void __stdcall glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5405 GLfloat xyzw[4] = {x, y, z, w};
5407 glUniform4fv(location, 1, xyzw);
5410 void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v)
5412 EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v);
5416 gl::Context *context = gl::getNonLostContext();
5420 if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count))
5425 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5426 programBinary->setUniform4fv(location, count, v);
5431 return gl::error(GL_OUT_OF_MEMORY);
5435 void __stdcall glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
5437 GLint xyzw[4] = {x, y, z, w};
5439 glUniform4iv(location, 1, xyzw);
5442 void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v)
5444 EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v);
5448 gl::Context *context = gl::getNonLostContext();
5452 if (!ValidateUniform(context, GL_INT_VEC4, location, count))
5457 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5458 programBinary->setUniform4iv(location, count, v);
5463 return gl::error(GL_OUT_OF_MEMORY);
5467 void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5469 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5470 location, count, transpose, value);
5474 gl::Context *context = gl::getNonLostContext();
5478 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose))
5483 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5484 programBinary->setUniformMatrix2fv(location, count, transpose, value);
5489 return gl::error(GL_OUT_OF_MEMORY);
5493 void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5495 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5496 location, count, transpose, value);
5500 gl::Context *context = gl::getNonLostContext();
5504 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose))
5509 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5510 programBinary->setUniformMatrix3fv(location, count, transpose, value);
5515 return gl::error(GL_OUT_OF_MEMORY);
5519 void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
5521 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
5522 location, count, transpose, value);
5526 gl::Context *context = gl::getNonLostContext();
5530 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose))
5535 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
5536 programBinary->setUniformMatrix4fv(location, count, transpose, value);
5541 return gl::error(GL_OUT_OF_MEMORY);
5545 void __stdcall glUseProgram(GLuint program)
5547 EVENT("(GLuint program = %d)", program);
5551 gl::Context *context = gl::getNonLostContext();
5555 gl::Program *programObject = context->getProgram(program);
5557 if (!programObject && program != 0)
5559 if (context->getShader(program))
5561 return gl::error(GL_INVALID_OPERATION);
5565 return gl::error(GL_INVALID_VALUE);
5569 if (program != 0 && !programObject->isLinked())
5571 return gl::error(GL_INVALID_OPERATION);
5574 context->useProgram(program);
5579 return gl::error(GL_OUT_OF_MEMORY);
5583 void __stdcall glValidateProgram(GLuint program)
5585 EVENT("(GLuint program = %d)", program);
5589 gl::Context *context = gl::getNonLostContext();
5593 gl::Program *programObject = context->getProgram(program);
5597 if (context->getShader(program))
5599 return gl::error(GL_INVALID_OPERATION);
5603 return gl::error(GL_INVALID_VALUE);
5607 programObject->validate();
5612 return gl::error(GL_OUT_OF_MEMORY);
5616 void __stdcall glVertexAttrib1f(GLuint index, GLfloat x)
5618 EVENT("(GLuint index = %d, GLfloat x = %f)", index, x);
5622 if (index >= gl::MAX_VERTEX_ATTRIBS)
5624 return gl::error(GL_INVALID_VALUE);
5627 gl::Context *context = gl::getNonLostContext();
5631 GLfloat vals[4] = { x, 0, 0, 1 };
5632 context->setVertexAttribf(index, vals);
5637 return gl::error(GL_OUT_OF_MEMORY);
5641 void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values)
5643 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
5647 if (index >= gl::MAX_VERTEX_ATTRIBS)
5649 return gl::error(GL_INVALID_VALUE);
5652 gl::Context *context = gl::getNonLostContext();
5656 GLfloat vals[4] = { values[0], 0, 0, 1 };
5657 context->setVertexAttribf(index, vals);
5662 return gl::error(GL_OUT_OF_MEMORY);
5666 void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y)
5668 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y);
5672 if (index >= gl::MAX_VERTEX_ATTRIBS)
5674 return gl::error(GL_INVALID_VALUE);
5677 gl::Context *context = gl::getNonLostContext();
5681 GLfloat vals[4] = { x, y, 0, 1 };
5682 context->setVertexAttribf(index, vals);
5687 return gl::error(GL_OUT_OF_MEMORY);
5691 void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values)
5693 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
5697 if (index >= gl::MAX_VERTEX_ATTRIBS)
5699 return gl::error(GL_INVALID_VALUE);
5702 gl::Context *context = gl::getNonLostContext();
5706 GLfloat vals[4] = { values[0], values[1], 0, 1 };
5707 context->setVertexAttribf(index, vals);
5712 return gl::error(GL_OUT_OF_MEMORY);
5716 void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z)
5718 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z);
5722 if (index >= gl::MAX_VERTEX_ATTRIBS)
5724 return gl::error(GL_INVALID_VALUE);
5727 gl::Context *context = gl::getNonLostContext();
5731 GLfloat vals[4] = { x, y, z, 1 };
5732 context->setVertexAttribf(index, vals);
5737 return gl::error(GL_OUT_OF_MEMORY);
5741 void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values)
5743 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
5747 if (index >= gl::MAX_VERTEX_ATTRIBS)
5749 return gl::error(GL_INVALID_VALUE);
5752 gl::Context *context = gl::getNonLostContext();
5756 GLfloat vals[4] = { values[0], values[1], values[2], 1 };
5757 context->setVertexAttribf(index, vals);
5762 return gl::error(GL_OUT_OF_MEMORY);
5766 void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5768 EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w);
5772 if (index >= gl::MAX_VERTEX_ATTRIBS)
5774 return gl::error(GL_INVALID_VALUE);
5777 gl::Context *context = gl::getNonLostContext();
5781 GLfloat vals[4] = { x, y, z, w };
5782 context->setVertexAttribf(index, vals);
5787 return gl::error(GL_OUT_OF_MEMORY);
5791 void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values)
5793 EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values);
5797 if (index >= gl::MAX_VERTEX_ATTRIBS)
5799 return gl::error(GL_INVALID_VALUE);
5802 gl::Context *context = gl::getNonLostContext();
5806 context->setVertexAttribf(index, values);
5811 return gl::error(GL_OUT_OF_MEMORY);
5815 void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor)
5817 EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor);
5821 if (index >= gl::MAX_VERTEX_ATTRIBS)
5823 return gl::error(GL_INVALID_VALUE);
5826 gl::Context *context = gl::getNonLostContext();
5830 context->setVertexAttribDivisor(index, divisor);
5835 return gl::error(GL_OUT_OF_MEMORY);
5839 void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
5841 EVENT("(GLuint index = %d, GLint size = %d, GLenum type = 0x%X, "
5842 "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)",
5843 index, size, type, normalized, stride, ptr);
5847 if (index >= gl::MAX_VERTEX_ATTRIBS)
5849 return gl::error(GL_INVALID_VALUE);
5852 if (size < 1 || size > 4)
5854 return gl::error(GL_INVALID_VALUE);
5857 gl::Context *context = gl::getNonLostContext();
5862 case GL_UNSIGNED_BYTE:
5864 case GL_UNSIGNED_SHORT:
5870 case GL_UNSIGNED_INT:
5871 case GL_INT_2_10_10_10_REV:
5872 case GL_UNSIGNED_INT_2_10_10_10_REV:
5873 if (context && context->getClientVersion() < 3)
5875 return gl::error(GL_INVALID_ENUM);
5882 return gl::error(GL_INVALID_ENUM);
5887 return gl::error(GL_INVALID_VALUE);
5890 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
5892 return gl::error(GL_INVALID_OPERATION);
5897 // [OpenGL ES 3.0.2] Section 2.8 page 24:
5898 // An INVALID_OPERATION error is generated when a non-zero vertex array object
5899 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
5900 // and the pointer argument is not NULL.
5901 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && ptr != NULL)
5903 return gl::error(GL_INVALID_OPERATION);
5906 context->setVertexAttribState(index, context->getArrayBuffer(), size, type,
5907 normalized == GL_TRUE, false, stride, ptr);
5912 return gl::error(GL_OUT_OF_MEMORY);
5916 void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
5918 EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height);
5922 if (width < 0 || height < 0)
5924 return gl::error(GL_INVALID_VALUE);
5927 gl::Context *context = gl::getNonLostContext();
5931 context->setViewportParams(x, y, width, height);
5936 return gl::error(GL_OUT_OF_MEMORY);
5940 // OpenGL ES 3.0 functions
5942 void __stdcall glReadBuffer(GLenum mode)
5944 EVENT("(GLenum mode = 0x%X)", mode);
5948 gl::Context *context = gl::getNonLostContext();
5952 if (context->getClientVersion() < 3)
5954 return gl::error(GL_INVALID_OPERATION);
5963 return gl::error(GL_OUT_OF_MEMORY);
5967 void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
5969 EVENT("(GLenum mode = 0x%X, GLuint start = %u, GLuint end = %u, GLsizei count = %d, GLenum type = 0x%X, "
5970 "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices);
5974 gl::Context *context = gl::getNonLostContext();
5978 if (context->getClientVersion() < 3)
5980 return gl::error(GL_INVALID_OPERATION);
5983 // glDrawRangeElements
5989 return gl::error(GL_OUT_OF_MEMORY);
5993 void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
5995 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint internalformat = %d, GLsizei width = %d, "
5996 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLenum format = 0x%X, "
5997 "GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
5998 target, level, internalformat, width, height, depth, border, format, type, pixels);
6002 gl::Context *context = gl::getNonLostContext();
6006 if (context->getClientVersion() < 3)
6008 return gl::error(GL_INVALID_OPERATION);
6011 // validateES3TexImageFormat sets the error code if there is an error
6012 if (!ValidateES3TexImageParameters(context, target, level, internalformat, false, false,
6013 0, 0, 0, width, height, depth, border, format, type, pixels))
6022 gl::Texture3D *texture = context->getTexture3D();
6023 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
6027 case GL_TEXTURE_2D_ARRAY:
6029 gl::Texture2DArray *texture = context->getTexture2DArray();
6030 texture->setImage(level, width, height, depth, internalformat, format, type, context->getUnpackState(), pixels);
6035 return gl::error(GL_INVALID_ENUM);
6041 return gl::error(GL_OUT_OF_MEMORY);
6045 void __stdcall glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
6047 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6048 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6049 "GLenum format = 0x%X, GLenum type = 0x%X, const GLvoid* pixels = 0x%0.8p)",
6050 target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
6054 gl::Context *context = gl::getNonLostContext();
6058 if (context->getClientVersion() < 3)
6060 return gl::error(GL_INVALID_OPERATION);
6063 // validateES3TexImageFormat sets the error code if there is an error
6064 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, false, true,
6065 xoffset, yoffset, zoffset, width, height, depth, 0,
6066 format, type, pixels))
6071 // Zero sized uploads are valid but no-ops
6072 if (width == 0 || height == 0 || depth == 0)
6081 gl::Texture3D *texture = context->getTexture3D();
6082 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackState(), pixels);
6086 case GL_TEXTURE_2D_ARRAY:
6088 gl::Texture2DArray *texture = context->getTexture2DArray();
6089 texture->subImage(level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackState(), pixels);
6094 return gl::error(GL_INVALID_ENUM);
6100 return gl::error(GL_OUT_OF_MEMORY);
6104 void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
6106 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6107 "GLint zoffset = %d, GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
6108 target, level, xoffset, yoffset, zoffset, x, y, width, height);
6112 gl::Context *context = gl::getNonLostContext();
6116 if (context->getClientVersion() < 3)
6118 return gl::error(GL_INVALID_OPERATION);
6121 if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset,
6122 x, y, width, height, 0))
6127 gl::Framebuffer *framebuffer = context->getReadFramebuffer();
6128 gl::Texture *texture = NULL;
6132 texture = context->getTexture3D();
6135 case GL_TEXTURE_2D_ARRAY:
6136 texture = context->getTexture2DArray();
6140 return gl::error(GL_INVALID_ENUM);
6143 texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer);
6148 return gl::error(GL_OUT_OF_MEMORY);
6152 void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
6154 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
6155 "GLsizei height = %d, GLsizei depth = %d, GLint border = %d, GLsizei imageSize = %d, "
6156 "const GLvoid* data = 0x%0.8p)",
6157 target, level, internalformat, width, height, depth, border, imageSize, data);
6161 gl::Context *context = gl::getNonLostContext();
6165 if (context->getClientVersion() < 3)
6167 return gl::error(GL_INVALID_OPERATION);
6170 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
6172 return gl::error(GL_INVALID_VALUE);
6175 // validateES3TexImageFormat sets the error code if there is an error
6176 if (!ValidateES3TexImageParameters(context, target, level, internalformat, true, false,
6177 0, 0, 0, width, height, depth, border, GL_NONE, GL_NONE, data))
6186 gl::Texture3D *texture = context->getTexture3D();
6187 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6191 case GL_TEXTURE_2D_ARRAY:
6193 gl::Texture2DArray *texture = context->getTexture2DArray();
6194 texture->setCompressedImage(level, internalformat, width, height, depth, imageSize, data);
6199 return gl::error(GL_INVALID_ENUM);
6205 return gl::error(GL_OUT_OF_MEMORY);
6209 void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
6211 EVENT("(GLenum target = 0x%X, GLint level = %d, GLint xoffset = %d, GLint yoffset = %d, "
6212 "GLint zoffset = %d, GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, "
6213 "GLenum format = 0x%X, GLsizei imageSize = %d, const GLvoid* data = 0x%0.8p)",
6214 target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
6218 gl::Context *context = gl::getNonLostContext();
6222 if (context->getClientVersion() < 3)
6224 return gl::error(GL_INVALID_OPERATION);
6227 if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, context->getClientVersion(), width, height))
6229 return gl::error(GL_INVALID_VALUE);
6234 return gl::error(GL_INVALID_VALUE);
6237 // validateES3TexImageFormat sets the error code if there is an error
6238 if (!ValidateES3TexImageParameters(context, target, level, GL_NONE, true, true,
6239 0, 0, 0, width, height, depth, 0, GL_NONE, GL_NONE, data))
6244 // Zero sized uploads are valid but no-ops
6245 if (width == 0 || height == 0)
6254 gl::Texture3D *texture = context->getTexture3D();
6255 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6256 format, imageSize, data);
6260 case GL_TEXTURE_2D_ARRAY:
6262 gl::Texture2DArray *texture = context->getTexture2DArray();
6263 texture->subImageCompressed(level, xoffset, yoffset, zoffset, width, height, depth,
6264 format, imageSize, data);
6269 return gl::error(GL_INVALID_ENUM);
6275 return gl::error(GL_OUT_OF_MEMORY);
6279 void __stdcall glGenQueries(GLsizei n, GLuint* ids)
6281 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6285 gl::Context *context = gl::getNonLostContext();
6289 if (context->getClientVersion() < 3)
6291 return gl::error(GL_INVALID_OPERATION);
6296 return gl::error(GL_INVALID_VALUE);
6299 for (GLsizei i = 0; i < n; i++)
6301 ids[i] = context->createQuery();
6307 return gl::error(GL_OUT_OF_MEMORY);
6311 void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids)
6313 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
6317 gl::Context *context = gl::getNonLostContext();
6321 if (context->getClientVersion() < 3)
6323 return gl::error(GL_INVALID_OPERATION);
6328 return gl::error(GL_INVALID_VALUE);
6331 for (GLsizei i = 0; i < n; i++)
6333 context->deleteQuery(ids[i]);
6339 return gl::error(GL_OUT_OF_MEMORY);
6343 GLboolean __stdcall glIsQuery(GLuint id)
6345 EVENT("(GLuint id = %u)", id);
6349 gl::Context *context = gl::getNonLostContext();
6353 if (context->getClientVersion() < 3)
6355 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6358 return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE;
6363 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6369 void __stdcall glBeginQuery(GLenum target, GLuint id)
6371 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
6375 gl::Context *context = gl::getNonLostContext();
6379 if (context->getClientVersion() < 3)
6381 return gl::error(GL_INVALID_OPERATION);
6384 if (!ValidateBeginQuery(context, target, id))
6388 context->beginQuery(target, id);
6393 return gl::error(GL_OUT_OF_MEMORY);
6397 void __stdcall glEndQuery(GLenum target)
6399 EVENT("(GLenum target = 0x%X)", target);
6403 gl::Context *context = gl::getNonLostContext();
6407 if (context->getClientVersion() < 3)
6409 return gl::error(GL_INVALID_OPERATION);
6412 if (!ValidateEndQuery(context, target))
6417 context->endQuery(target);
6422 return gl::error(GL_OUT_OF_MEMORY);
6426 void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params)
6428 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params);
6432 gl::Context *context = gl::getNonLostContext();
6436 if (context->getClientVersion() < 3)
6438 return gl::error(GL_INVALID_OPERATION);
6441 if (!ValidQueryType(context, target))
6443 return gl::error(GL_INVALID_ENUM);
6448 case GL_CURRENT_QUERY:
6449 params[0] = static_cast<GLint>(context->getActiveQueryId(target));
6453 return gl::error(GL_INVALID_ENUM);
6459 return gl::error(GL_OUT_OF_MEMORY);
6463 void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
6465 EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params);
6469 gl::Context *context = gl::getNonLostContext();
6473 if (context->getClientVersion() < 3)
6475 return gl::error(GL_INVALID_OPERATION);
6478 gl::Query *queryObject = context->getQuery(id, false, GL_NONE);
6482 return gl::error(GL_INVALID_OPERATION);
6485 if (context->getActiveQueryId(queryObject->getType()) == id)
6487 return gl::error(GL_INVALID_OPERATION);
6492 case GL_QUERY_RESULT:
6493 params[0] = queryObject->getResult();
6495 case GL_QUERY_RESULT_AVAILABLE:
6496 params[0] = queryObject->isResultAvailable();
6499 return gl::error(GL_INVALID_ENUM);
6505 return gl::error(GL_OUT_OF_MEMORY);
6509 GLboolean __stdcall glUnmapBuffer(GLenum target)
6511 EVENT("(GLenum target = 0x%X)", target);
6515 gl::Context *context = gl::getNonLostContext();
6519 if (context->getClientVersion() < 3)
6521 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
6524 return glUnmapBufferOES(target);
6529 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
6535 void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
6537 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
6541 gl::Context *context = gl::getNonLostContext();
6545 if (context->getClientVersion() < 3)
6547 return gl::error(GL_INVALID_OPERATION);
6550 glGetBufferPointervOES(target, pname, params);
6555 return gl::error(GL_OUT_OF_MEMORY);
6559 void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs)
6563 gl::Context *context = gl::getNonLostContext();
6567 if (context->getClientVersion() < 3)
6569 return gl::error(GL_INVALID_OPERATION);
6572 glDrawBuffersEXT(n, bufs);
6577 return gl::error(GL_OUT_OF_MEMORY);
6581 void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6583 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6584 location, count, transpose, value);
6588 gl::Context *context = gl::getNonLostContext();
6592 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose))
6597 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6598 programBinary->setUniformMatrix2x3fv(location, count, transpose, value);
6603 return gl::error(GL_OUT_OF_MEMORY);
6607 void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6609 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6610 location, count, transpose, value);
6614 gl::Context *context = gl::getNonLostContext();
6618 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose))
6623 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6624 programBinary->setUniformMatrix3x2fv(location, count, transpose, value);
6629 return gl::error(GL_OUT_OF_MEMORY);
6633 void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6635 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6636 location, count, transpose, value);
6640 gl::Context *context = gl::getNonLostContext();
6644 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose))
6649 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6650 programBinary->setUniformMatrix2x4fv(location, count, transpose, value);
6655 return gl::error(GL_OUT_OF_MEMORY);
6659 void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6661 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6662 location, count, transpose, value);
6666 gl::Context *context = gl::getNonLostContext();
6670 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose))
6675 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6676 programBinary->setUniformMatrix4x2fv(location, count, transpose, value);
6681 return gl::error(GL_OUT_OF_MEMORY);
6685 void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6687 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6688 location, count, transpose, value);
6692 gl::Context *context = gl::getNonLostContext();
6696 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose))
6701 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6702 programBinary->setUniformMatrix3x4fv(location, count, transpose, value);
6707 return gl::error(GL_OUT_OF_MEMORY);
6711 void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
6713 EVENT("(GLint location = %d, GLsizei count = %d, GLboolean transpose = %u, const GLfloat* value = 0x%0.8p)",
6714 location, count, transpose, value);
6718 gl::Context *context = gl::getNonLostContext();
6722 if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose))
6727 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
6728 programBinary->setUniformMatrix4x3fv(location, count, transpose, value);
6733 return gl::error(GL_OUT_OF_MEMORY);
6737 void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
6739 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, GLint dstX0 = %d, "
6740 "GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
6741 srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
6745 gl::Context *context = gl::getNonLostContext();
6748 if (context->getClientVersion() < 3)
6750 return gl::error(GL_INVALID_OPERATION);
6753 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
6754 dstX0, dstY0, dstX1, dstY1, mask, filter,
6760 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
6766 return gl::error(GL_OUT_OF_MEMORY);
6770 void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
6772 EVENT("(GLenum target = 0x%X, GLsizei samples = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
6773 target, samples, internalformat, width, height);
6777 gl::Context *context = gl::getNonLostContext();
6781 if (context->getClientVersion() < 3)
6783 return gl::error(GL_INVALID_OPERATION);
6786 if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat,
6787 width, height, false))
6792 context->setRenderbufferStorage(width, height, internalformat, samples);
6797 return gl::error(GL_OUT_OF_MEMORY);
6801 void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
6803 EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLuint texture = %u, GLint level = %d, GLint layer = %d)",
6804 target, attachment, texture, level, layer);
6808 gl::Context *context = gl::getNonLostContext();
6812 if (context->getClientVersion() < 3)
6814 return gl::error(GL_INVALID_OPERATION);
6817 if (!ValidateES3FramebufferTextureParameters(context, target, attachment, GL_NONE, texture, level, layer, true))
6822 gl::Framebuffer *framebuffer = context->getTargetFramebuffer(target);
6823 ASSERT(framebuffer);
6825 gl::Texture *textureObject = context->getTexture(texture);
6826 GLenum textarget = textureObject ? textureObject->getTarget() : GL_NONE;
6828 if (attachment >= GL_COLOR_ATTACHMENT0_EXT && attachment <= GL_COLOR_ATTACHMENT15_EXT)
6830 const unsigned int colorAttachment = (attachment - GL_COLOR_ATTACHMENT0_EXT);
6831 framebuffer->setColorbuffer(colorAttachment, textarget, texture, level, layer);
6837 case GL_DEPTH_ATTACHMENT: framebuffer->setDepthbuffer(textarget, texture, level, layer); break;
6838 case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level, layer); break;
6839 case GL_DEPTH_STENCIL_ATTACHMENT: framebuffer->setDepthStencilBuffer(textarget, texture, level, layer); break;
6846 return gl::error(GL_OUT_OF_MEMORY);
6850 GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
6852 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
6853 target, offset, length, access);
6857 gl::Context *context = gl::getNonLostContext();
6861 if (context->getClientVersion() < 3)
6863 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
6866 return glMapBufferRangeEXT(target, offset, length, access);
6871 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
6877 void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
6879 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
6883 gl::Context *context = gl::getNonLostContext();
6887 if (context->getClientVersion() < 3)
6889 return gl::error(GL_INVALID_OPERATION);
6892 glFlushMappedBufferRangeEXT(target, offset, length);
6897 return gl::error(GL_OUT_OF_MEMORY);
6901 void __stdcall glBindVertexArray(GLuint array)
6903 EVENT("(GLuint array = %u)", array);
6907 gl::Context *context = gl::getNonLostContext();
6911 if (context->getClientVersion() < 3)
6913 return gl::error(GL_INVALID_OPERATION);
6916 gl::VertexArray *vao = context->getVertexArray(array);
6920 // The default VAO should always exist
6922 return gl::error(GL_INVALID_OPERATION);
6925 context->bindVertexArray(array);
6930 return gl::error(GL_OUT_OF_MEMORY);
6934 void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays)
6936 EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays);
6940 gl::Context *context = gl::getNonLostContext();
6944 if (context->getClientVersion() < 3)
6946 return gl::error(GL_INVALID_OPERATION);
6951 return gl::error(GL_INVALID_VALUE);
6954 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6956 if (arrays[arrayIndex] != 0)
6958 context->deleteVertexArray(arrays[arrayIndex]);
6965 return gl::error(GL_OUT_OF_MEMORY);
6969 void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays)
6971 EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays);
6975 gl::Context *context = gl::getNonLostContext();
6979 if (context->getClientVersion() < 3)
6981 return gl::error(GL_INVALID_OPERATION);
6986 return gl::error(GL_INVALID_VALUE);
6989 for (int arrayIndex = 0; arrayIndex < n; arrayIndex++)
6991 arrays[arrayIndex] = context->createVertexArray();
6997 return gl::error(GL_OUT_OF_MEMORY);
7001 GLboolean __stdcall glIsVertexArray(GLuint array)
7003 EVENT("(GLuint array = %u)", array);
7007 gl::Context *context = gl::getNonLostContext();
7011 if (context->getClientVersion() < 3)
7013 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
7021 gl::VertexArray *vao = context->getVertexArray(array);
7023 return (vao != NULL ? GL_TRUE : GL_FALSE);
7028 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
7034 void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
7036 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint* data = 0x%0.8p)",
7037 target, index, data);
7041 gl::Context *context = gl::getNonLostContext();
7045 if (context->getClientVersion() < 3)
7047 return gl::error(GL_INVALID_OPERATION);
7052 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
7053 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
7054 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
7055 if (index >= context->getMaxTransformFeedbackBufferBindings())
7056 return gl::error(GL_INVALID_VALUE);
7058 case GL_UNIFORM_BUFFER_START:
7059 case GL_UNIFORM_BUFFER_SIZE:
7060 case GL_UNIFORM_BUFFER_BINDING:
7061 if (index >= context->getMaximumCombinedUniformBufferBindings())
7062 return gl::error(GL_INVALID_VALUE);
7065 return gl::error(GL_INVALID_ENUM);
7068 if (!(context->getIndexedIntegerv(target, index, data)))
7071 unsigned int numParams = 0;
7072 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
7073 return gl::error(GL_INVALID_ENUM);
7076 return; // it is known that pname is valid, but there are no parameters to return
7078 if (nativeType == GL_INT_64_ANGLEX)
7080 GLint64 minIntValue = static_cast<GLint64>(std::numeric_limits<int>::min());
7081 GLint64 maxIntValue = static_cast<GLint64>(std::numeric_limits<int>::max());
7082 GLint64 *int64Params = new GLint64[numParams];
7084 context->getIndexedInteger64v(target, index, int64Params);
7086 for (unsigned int i = 0; i < numParams; ++i)
7088 GLint64 clampedValue = std::max(std::min(int64Params[i], maxIntValue), minIntValue);
7089 data[i] = static_cast<GLint>(clampedValue);
7092 delete [] int64Params;
7103 return gl::error(GL_OUT_OF_MEMORY);
7107 void __stdcall glBeginTransformFeedback(GLenum primitiveMode)
7109 EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode);
7113 gl::Context *context = gl::getNonLostContext();
7117 if (context->getClientVersion() < 3)
7119 return gl::error(GL_INVALID_OPERATION);
7122 switch (primitiveMode)
7129 return gl::error(GL_INVALID_ENUM);
7132 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7133 ASSERT(transformFeedback != NULL);
7135 if (transformFeedback->isStarted())
7137 return gl::error(GL_INVALID_OPERATION);
7140 if (transformFeedback->isPaused())
7142 transformFeedback->resume();
7146 transformFeedback->start(primitiveMode);
7152 return gl::error(GL_OUT_OF_MEMORY);
7156 void __stdcall glEndTransformFeedback(void)
7162 gl::Context *context = gl::getNonLostContext();
7166 if (context->getClientVersion() < 3)
7168 return gl::error(GL_INVALID_OPERATION);
7171 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
7172 ASSERT(transformFeedback != NULL);
7174 if (!transformFeedback->isStarted())
7176 return gl::error(GL_INVALID_OPERATION);
7179 transformFeedback->stop();
7184 return gl::error(GL_OUT_OF_MEMORY);
7188 void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
7190 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u, GLintptr offset = %d, GLsizeiptr size = %d)",
7191 target, index, buffer, offset, size);
7195 gl::Context *context = gl::getNonLostContext();
7199 if (context->getClientVersion() < 3)
7201 return gl::error(GL_INVALID_OPERATION);
7206 case GL_TRANSFORM_FEEDBACK_BUFFER:
7207 if (index >= context->getMaxTransformFeedbackBufferBindings())
7209 return gl::error(GL_INVALID_VALUE);
7213 case GL_UNIFORM_BUFFER:
7214 if (index >= context->getMaximumCombinedUniformBufferBindings())
7216 return gl::error(GL_INVALID_VALUE);
7221 return gl::error(GL_INVALID_ENUM);
7224 if (buffer != 0 && size <= 0)
7226 return gl::error(GL_INVALID_VALUE);
7231 case GL_TRANSFORM_FEEDBACK_BUFFER:
7233 // size and offset must be a multiple of 4
7234 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0))
7236 return gl::error(GL_INVALID_VALUE);
7239 context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size);
7240 context->bindGenericTransformFeedbackBuffer(buffer);
7243 case GL_UNIFORM_BUFFER:
7245 // it is an error to bind an offset not a multiple of the alignment
7246 if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0)
7248 return gl::error(GL_INVALID_VALUE);
7251 context->bindIndexedUniformBuffer(buffer, index, offset, size);
7252 context->bindGenericUniformBuffer(buffer);
7262 return gl::error(GL_OUT_OF_MEMORY);
7266 void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
7268 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLuint buffer = %u)",
7269 target, index, buffer);
7273 gl::Context *context = gl::getNonLostContext();
7277 if (context->getClientVersion() < 3)
7279 return gl::error(GL_INVALID_OPERATION);
7284 case GL_TRANSFORM_FEEDBACK_BUFFER:
7285 if (index >= context->getMaxTransformFeedbackBufferBindings())
7287 return gl::error(GL_INVALID_VALUE);
7291 case GL_UNIFORM_BUFFER:
7292 if (index >= context->getMaximumCombinedUniformBufferBindings())
7294 return gl::error(GL_INVALID_VALUE);
7299 return gl::error(GL_INVALID_ENUM);
7304 case GL_TRANSFORM_FEEDBACK_BUFFER:
7305 context->bindIndexedTransformFeedbackBuffer(buffer, index, 0, 0);
7306 context->bindGenericTransformFeedbackBuffer(buffer);
7309 case GL_UNIFORM_BUFFER:
7310 context->bindIndexedUniformBuffer(buffer, index, 0, 0);
7311 context->bindGenericUniformBuffer(buffer);
7321 return gl::error(GL_OUT_OF_MEMORY);
7325 void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
7327 EVENT("(GLuint program = %u, GLsizei count = %d, const GLchar* const* varyings = 0x%0.8p, GLenum bufferMode = 0x%X)",
7328 program, count, varyings, bufferMode);
7332 gl::Context *context = gl::getNonLostContext();
7336 if (context->getClientVersion() < 3)
7338 return gl::error(GL_INVALID_OPERATION);
7343 return gl::error(GL_INVALID_VALUE);
7348 case GL_INTERLEAVED_ATTRIBS:
7350 case GL_SEPARATE_ATTRIBS:
7351 if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings())
7353 return gl::error(GL_INVALID_VALUE);
7357 return gl::error(GL_INVALID_ENUM);
7360 if (!gl::ValidProgram(context, program))
7365 gl::Program *programObject = context->getProgram(program);
7366 ASSERT(programObject);
7368 programObject->setTransformFeedbackVaryings(count, varyings, bufferMode);
7373 return gl::error(GL_OUT_OF_MEMORY);
7377 void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
7379 EVENT("(GLuint program = %u, GLuint index = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, "
7380 "GLsizei* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)",
7381 program, index, bufSize, length, size, type, name);
7385 gl::Context *context = gl::getNonLostContext();
7389 if (context->getClientVersion() < 3)
7391 return gl::error(GL_INVALID_OPERATION);
7396 return gl::error(GL_INVALID_VALUE);
7399 if (!gl::ValidProgram(context, program))
7404 gl::Program *programObject = context->getProgram(program);
7405 ASSERT(programObject);
7407 if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount()))
7409 return gl::error(GL_INVALID_VALUE);
7412 programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name);
7417 return gl::error(GL_OUT_OF_MEMORY);
7421 void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
7423 EVENT("(GLuint index = %u, GLint size = %d, GLenum type = 0x%X, GLsizei stride = %d, const GLvoid* pointer = 0x%0.8p)",
7424 index, size, type, stride, pointer);
7428 gl::Context *context = gl::getNonLostContext();
7432 if (context->getClientVersion() < 3)
7434 return gl::error(GL_INVALID_OPERATION);
7438 if (index >= gl::MAX_VERTEX_ATTRIBS)
7440 return gl::error(GL_INVALID_VALUE);
7443 if (size < 1 || size > 4)
7445 return gl::error(GL_INVALID_VALUE);
7451 case GL_UNSIGNED_BYTE:
7453 case GL_UNSIGNED_SHORT:
7455 case GL_UNSIGNED_INT:
7456 case GL_INT_2_10_10_10_REV:
7457 case GL_UNSIGNED_INT_2_10_10_10_REV:
7460 return gl::error(GL_INVALID_ENUM);
7465 return gl::error(GL_INVALID_VALUE);
7468 if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4)
7470 return gl::error(GL_INVALID_OPERATION);
7475 // [OpenGL ES 3.0.2] Section 2.8 page 24:
7476 // An INVALID_OPERATION error is generated when a non-zero vertex array object
7477 // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
7478 // and the pointer argument is not NULL.
7479 if (context->getVertexArrayHandle() != 0 && context->getArrayBufferHandle() == 0 && pointer != NULL)
7481 return gl::error(GL_INVALID_OPERATION);
7484 context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true,
7490 return gl::error(GL_OUT_OF_MEMORY);
7494 void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
7496 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
7497 index, pname, params);
7501 gl::Context *context = gl::getNonLostContext();
7505 if (context->getClientVersion() < 3)
7507 return gl::error(GL_INVALID_OPERATION);
7510 if (index >= gl::MAX_VERTEX_ATTRIBS)
7512 return gl::error(GL_INVALID_VALUE);
7515 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7517 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
7522 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7524 const gl::VertexAttribCurrentValueData ¤tValueData = context->getVertexAttribCurrentValue(index);
7525 for (int i = 0; i < 4; ++i)
7527 params[i] = currentValueData.IntValues[i];
7532 *params = attribState.querySingleParameter<GLint>(pname);
7538 return gl::error(GL_OUT_OF_MEMORY);
7542 void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
7544 EVENT("(GLuint index = %u, GLenum pname = 0x%X, GLuint* params = 0x%0.8p)",
7545 index, pname, params);
7549 gl::Context *context = gl::getNonLostContext();
7553 if (context->getClientVersion() < 3)
7555 return gl::error(GL_INVALID_OPERATION);
7558 if (index >= gl::MAX_VERTEX_ATTRIBS)
7560 return gl::error(GL_INVALID_VALUE);
7563 const gl::VertexAttribute &attribState = context->getVertexAttribState(index);
7565 if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion()))
7570 if (pname == GL_CURRENT_VERTEX_ATTRIB)
7572 const gl::VertexAttribCurrentValueData ¤tValueData = context->getVertexAttribCurrentValue(index);
7573 for (int i = 0; i < 4; ++i)
7575 params[i] = currentValueData.UnsignedIntValues[i];
7580 *params = attribState.querySingleParameter<GLuint>(pname);
7586 return gl::error(GL_OUT_OF_MEMORY);
7590 void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
7592 EVENT("(GLuint index = %u, GLint x = %d, GLint y = %d, GLint z = %d, GLint w = %d)",
7597 gl::Context *context = gl::getNonLostContext();
7601 if (context->getClientVersion() < 3)
7603 return gl::error(GL_INVALID_OPERATION);
7606 if (index >= gl::MAX_VERTEX_ATTRIBS)
7608 return gl::error(GL_INVALID_VALUE);
7611 GLint vals[4] = { x, y, z, w };
7612 context->setVertexAttribi(index, vals);
7617 return gl::error(GL_OUT_OF_MEMORY);
7621 void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
7623 EVENT("(GLuint index = %u, GLuint x = %u, GLuint y = %u, GLuint z = %u, GLuint w = %u)",
7628 gl::Context *context = gl::getNonLostContext();
7632 if (context->getClientVersion() < 3)
7634 return gl::error(GL_INVALID_OPERATION);
7637 if (index >= gl::MAX_VERTEX_ATTRIBS)
7639 return gl::error(GL_INVALID_VALUE);
7642 GLuint vals[4] = { x, y, z, w };
7643 context->setVertexAttribu(index, vals);
7648 return gl::error(GL_OUT_OF_MEMORY);
7652 void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v)
7654 EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v);
7658 gl::Context *context = gl::getNonLostContext();
7662 if (context->getClientVersion() < 3)
7664 return gl::error(GL_INVALID_OPERATION);
7667 if (index >= gl::MAX_VERTEX_ATTRIBS)
7669 return gl::error(GL_INVALID_VALUE);
7672 context->setVertexAttribi(index, v);
7677 return gl::error(GL_OUT_OF_MEMORY);
7681 void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v)
7683 EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v);
7687 gl::Context *context = gl::getNonLostContext();
7691 if (context->getClientVersion() < 3)
7693 return gl::error(GL_INVALID_OPERATION);
7696 if (index >= gl::MAX_VERTEX_ATTRIBS)
7698 return gl::error(GL_INVALID_VALUE);
7701 context->setVertexAttribu(index, v);
7706 return gl::error(GL_OUT_OF_MEMORY);
7710 void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params)
7712 EVENT("(GLuint program = %u, GLint location = %d, GLuint* params = 0x%0.8p)",
7713 program, location, params);
7717 gl::Context *context = gl::getNonLostContext();
7721 if (context->getClientVersion() < 3)
7723 return gl::error(GL_INVALID_OPERATION);
7728 return gl::error(GL_INVALID_VALUE);
7731 gl::Program *programObject = context->getProgram(program);
7733 if (!programObject || !programObject->isLinked())
7735 return gl::error(GL_INVALID_OPERATION);
7738 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7741 return gl::error(GL_INVALID_OPERATION);
7744 if (!programBinary->getUniformuiv(location, NULL, params))
7746 return gl::error(GL_INVALID_OPERATION);
7752 return gl::error(GL_OUT_OF_MEMORY);
7756 GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name)
7758 EVENT("(GLuint program = %u, const GLchar *name = 0x%0.8p)",
7763 gl::Context *context = gl::getNonLostContext();
7767 if (context->getClientVersion() < 3)
7769 return gl::error(GL_INVALID_OPERATION, -1);
7774 return gl::error(GL_INVALID_VALUE, -1);
7777 gl::Program *programObject = context->getProgram(program);
7779 if (!programObject || !programObject->isLinked())
7781 return gl::error(GL_INVALID_OPERATION, -1);
7784 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
7787 return gl::error(GL_INVALID_OPERATION, -1);
7790 return programBinary->getFragDataLocation(name);
7795 return gl::error(GL_OUT_OF_MEMORY, 0);
7801 void __stdcall glUniform1ui(GLint location, GLuint v0)
7803 glUniform1uiv(location, 1, &v0);
7806 void __stdcall glUniform2ui(GLint location, GLuint v0, GLuint v1)
7808 const GLuint xy[] = { v0, v1 };
7809 glUniform2uiv(location, 1, xy);
7812 void __stdcall glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
7814 const GLuint xyz[] = { v0, v1, v2 };
7815 glUniform3uiv(location, 1, xyz);
7818 void __stdcall glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
7820 const GLuint xyzw[] = { v0, v1, v2, v3 };
7821 glUniform4uiv(location, 1, xyzw);
7824 void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value)
7826 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7827 location, count, value);
7831 gl::Context *context = gl::getNonLostContext();
7835 if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
7840 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7841 programBinary->setUniform1uiv(location, count, value);
7846 return gl::error(GL_OUT_OF_MEMORY);
7850 void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value)
7852 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7853 location, count, value);
7857 gl::Context *context = gl::getNonLostContext();
7861 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
7866 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7867 programBinary->setUniform2uiv(location, count, value);
7872 return gl::error(GL_OUT_OF_MEMORY);
7876 void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value)
7878 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value)",
7879 location, count, value);
7883 gl::Context *context = gl::getNonLostContext();
7887 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
7892 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7893 programBinary->setUniform3uiv(location, count, value);
7898 return gl::error(GL_OUT_OF_MEMORY);
7902 void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value)
7904 EVENT("(GLint location = %d, GLsizei count = %d, const GLuint* value = 0x%0.8p)",
7905 location, count, value);
7909 gl::Context *context = gl::getNonLostContext();
7913 if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
7918 gl::ProgramBinary *programBinary = context->getCurrentProgramBinary();
7919 programBinary->setUniform4uiv(location, count, value);
7924 return gl::error(GL_OUT_OF_MEMORY);
7928 void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
7930 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLint* value = 0x%0.8p)",
7931 buffer, drawbuffer, value);
7935 gl::Context *context = gl::getNonLostContext();
7939 if (context->getClientVersion() < 3)
7941 return gl::error(GL_INVALID_OPERATION);
7947 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7949 return gl::error(GL_INVALID_VALUE);
7953 if (drawbuffer != 0)
7955 return gl::error(GL_INVALID_VALUE);
7959 return gl::error(GL_INVALID_ENUM);
7962 context->clearBufferiv(buffer, drawbuffer, value);
7967 return gl::error(GL_OUT_OF_MEMORY);
7971 void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
7973 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLuint* value = 0x%0.8p)",
7974 buffer, drawbuffer, value);
7978 gl::Context *context = gl::getNonLostContext();
7982 if (context->getClientVersion() < 3)
7984 return gl::error(GL_INVALID_OPERATION);
7990 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
7992 return gl::error(GL_INVALID_VALUE);
7996 return gl::error(GL_INVALID_ENUM);
7999 context->clearBufferuiv(buffer, drawbuffer, value);
8004 return gl::error(GL_OUT_OF_MEMORY);
8008 void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
8010 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, const GLfloat* value = 0x%0.8p)",
8011 buffer, drawbuffer, value);
8015 gl::Context *context = gl::getNonLostContext();
8019 if (context->getClientVersion() < 3)
8021 return gl::error(GL_INVALID_OPERATION);
8027 if (drawbuffer < 0 || drawbuffer >= static_cast<GLint>(context->getMaximumRenderTargets()))
8029 return gl::error(GL_INVALID_VALUE);
8033 if (drawbuffer != 0)
8035 return gl::error(GL_INVALID_VALUE);
8039 return gl::error(GL_INVALID_ENUM);
8042 context->clearBufferfv(buffer, drawbuffer, value);
8047 return gl::error(GL_OUT_OF_MEMORY);
8051 void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
8053 EVENT("(GLenum buffer = 0x%X, GLint drawbuffer = %d, GLfloat depth, GLint stencil = %d)",
8054 buffer, drawbuffer, depth, stencil);
8058 gl::Context *context = gl::getNonLostContext();
8062 if (context->getClientVersion() < 3)
8064 return gl::error(GL_INVALID_OPERATION);
8069 case GL_DEPTH_STENCIL:
8070 if (drawbuffer != 0)
8072 return gl::error(GL_INVALID_VALUE);
8076 return gl::error(GL_INVALID_ENUM);
8079 context->clearBufferfi(buffer, drawbuffer, depth, stencil);
8084 return gl::error(GL_OUT_OF_MEMORY);
8088 const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index)
8090 EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index);
8094 gl::Context *context = gl::getNonLostContext();
8098 if (context->getClientVersion() < 3)
8100 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL));
8103 if (name != GL_EXTENSIONS)
8105 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL));
8108 if (index >= context->getNumExtensions())
8110 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL));
8113 return reinterpret_cast<const GLubyte*>(context->getExtensionString(index));
8118 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLubyte*>(NULL));
8124 void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
8126 EVENT("(GLenum readTarget = 0x%X, GLenum writeTarget = 0x%X, GLintptr readOffset = %d, GLintptr writeOffset = %d, GLsizeiptr size = %d)",
8127 readTarget, writeTarget, readOffset, writeOffset, size);
8131 gl::Context *context = gl::getNonLostContext();
8135 if (context->getClientVersion() < 3)
8137 return gl::error(GL_INVALID_OPERATION);
8140 if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget))
8142 return gl::error(GL_INVALID_ENUM);
8145 gl::Buffer *readBuffer = context->getTargetBuffer(readTarget);
8146 gl::Buffer *writeBuffer = context->getTargetBuffer(writeTarget);
8148 if (!readBuffer || !writeBuffer)
8150 return gl::error(GL_INVALID_OPERATION);
8153 if (readBuffer->mapped() || writeBuffer->mapped())
8155 return gl::error(GL_INVALID_OPERATION);
8158 if (readOffset < 0 || writeOffset < 0 || size < 0 ||
8159 static_cast<unsigned int>(readOffset + size) > readBuffer->size() ||
8160 static_cast<unsigned int>(writeOffset + size) > writeBuffer->size())
8162 return gl::error(GL_INVALID_VALUE);
8165 if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size)
8167 return gl::error(GL_INVALID_VALUE);
8170 // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION)
8172 // if size is zero, the copy is a successful no-op
8175 writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size);
8181 return gl::error(GL_OUT_OF_MEMORY);
8185 void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
8187 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLchar* const* uniformNames = 0x%0.8p, GLuint* uniformIndices = 0x%0.8p)",
8188 program, uniformCount, uniformNames, uniformIndices);
8192 gl::Context *context = gl::getNonLostContext();
8196 if (context->getClientVersion() < 3)
8198 return gl::error(GL_INVALID_OPERATION);
8201 if (uniformCount < 0)
8203 return gl::error(GL_INVALID_VALUE);
8206 gl::Program *programObject = context->getProgram(program);
8210 if (context->getShader(program))
8212 return gl::error(GL_INVALID_OPERATION);
8216 return gl::error(GL_INVALID_VALUE);
8220 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8221 if (!programObject->isLinked() || !programBinary)
8223 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8225 uniformIndices[uniformId] = GL_INVALID_INDEX;
8230 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8232 uniformIndices[uniformId] = programBinary->getUniformIndex(uniformNames[uniformId]);
8239 return gl::error(GL_OUT_OF_MEMORY);
8243 void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
8245 EVENT("(GLuint program = %u, GLsizei uniformCount = %d, const GLuint* uniformIndices = 0x%0.8p, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8246 program, uniformCount, uniformIndices, pname, params);
8250 gl::Context *context = gl::getNonLostContext();
8254 if (context->getClientVersion() < 3)
8256 return gl::error(GL_INVALID_OPERATION);
8259 if (uniformCount < 0)
8261 return gl::error(GL_INVALID_VALUE);
8264 gl::Program *programObject = context->getProgram(program);
8268 if (context->getShader(program))
8270 return gl::error(GL_INVALID_OPERATION);
8274 return gl::error(GL_INVALID_VALUE);
8280 case GL_UNIFORM_TYPE:
8281 case GL_UNIFORM_SIZE:
8282 case GL_UNIFORM_NAME_LENGTH:
8283 case GL_UNIFORM_BLOCK_INDEX:
8284 case GL_UNIFORM_OFFSET:
8285 case GL_UNIFORM_ARRAY_STRIDE:
8286 case GL_UNIFORM_MATRIX_STRIDE:
8287 case GL_UNIFORM_IS_ROW_MAJOR:
8290 return gl::error(GL_INVALID_ENUM);
8293 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8295 if (!programBinary && uniformCount > 0)
8297 return gl::error(GL_INVALID_VALUE);
8300 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8302 const GLuint index = uniformIndices[uniformId];
8304 if (index >= (GLuint)programBinary->getActiveUniformCount())
8306 return gl::error(GL_INVALID_VALUE);
8310 for (int uniformId = 0; uniformId < uniformCount; uniformId++)
8312 const GLuint index = uniformIndices[uniformId];
8313 params[uniformId] = programBinary->getActiveUniformi(index, pname);
8319 return gl::error(GL_OUT_OF_MEMORY);
8323 GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
8325 EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName);
8329 gl::Context *context = gl::getNonLostContext();
8333 if (context->getClientVersion() < 3)
8335 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8338 gl::Program *programObject = context->getProgram(program);
8342 if (context->getShader(program))
8344 return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
8348 return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX);
8352 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8355 return GL_INVALID_INDEX;
8358 return programBinary->getUniformBlockIndex(uniformBlockName);
8363 return gl::error(GL_OUT_OF_MEMORY, 0);
8369 void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
8371 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)",
8372 program, uniformBlockIndex, pname, params);
8376 gl::Context *context = gl::getNonLostContext();
8380 if (context->getClientVersion() < 3)
8382 return gl::error(GL_INVALID_OPERATION);
8384 gl::Program *programObject = context->getProgram(program);
8388 if (context->getShader(program))
8390 return gl::error(GL_INVALID_OPERATION);
8394 return gl::error(GL_INVALID_VALUE);
8398 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8400 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8402 return gl::error(GL_INVALID_VALUE);
8407 case GL_UNIFORM_BLOCK_BINDING:
8408 *params = static_cast<GLint>(programObject->getUniformBlockBinding(uniformBlockIndex));
8411 case GL_UNIFORM_BLOCK_DATA_SIZE:
8412 case GL_UNIFORM_BLOCK_NAME_LENGTH:
8413 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
8414 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
8415 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
8416 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
8417 programBinary->getActiveUniformBlockiv(uniformBlockIndex, pname, params);
8421 return gl::error(GL_INVALID_ENUM);
8427 return gl::error(GL_OUT_OF_MEMORY);
8431 void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
8433 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLchar* uniformBlockName = 0x%0.8p)",
8434 program, uniformBlockIndex, bufSize, length, uniformBlockName);
8438 gl::Context *context = gl::getNonLostContext();
8442 if (context->getClientVersion() < 3)
8444 return gl::error(GL_INVALID_OPERATION);
8447 gl::Program *programObject = context->getProgram(program);
8451 if (context->getShader(program))
8453 return gl::error(GL_INVALID_OPERATION);
8457 return gl::error(GL_INVALID_VALUE);
8461 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8463 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8465 return gl::error(GL_INVALID_VALUE);
8468 programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
8473 return gl::error(GL_OUT_OF_MEMORY);
8477 void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
8479 EVENT("(GLuint program = %u, GLuint uniformBlockIndex = %u, GLuint uniformBlockBinding = %u)",
8480 program, uniformBlockIndex, uniformBlockBinding);
8484 gl::Context *context = gl::getNonLostContext();
8488 if (context->getClientVersion() < 3)
8490 return gl::error(GL_INVALID_OPERATION);
8493 if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
8495 return gl::error(GL_INVALID_VALUE);
8498 gl::Program *programObject = context->getProgram(program);
8502 if (context->getShader(program))
8504 return gl::error(GL_INVALID_OPERATION);
8508 return gl::error(GL_INVALID_VALUE);
8512 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
8514 // if never linked, there won't be any uniform blocks
8515 if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
8517 return gl::error(GL_INVALID_VALUE);
8520 programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
8525 return gl::error(GL_OUT_OF_MEMORY);
8529 void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
8531 EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei instanceCount = %d)",
8532 mode, first, count, instanceCount);
8536 gl::Context *context = gl::getNonLostContext();
8540 if (context->getClientVersion() < 3)
8542 return gl::error(GL_INVALID_OPERATION);
8545 // glDrawArraysInstanced
8551 return gl::error(GL_OUT_OF_MEMORY);
8555 void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
8557 EVENT("(GLenum mode = 0x%X, GLsizei count = %d, GLenum type = 0x%X, const GLvoid* indices = 0x%0.8p, GLsizei instanceCount = %d)",
8558 mode, count, type, indices, instanceCount);
8562 gl::Context *context = gl::getNonLostContext();
8566 if (context->getClientVersion() < 3)
8568 return gl::error(GL_INVALID_OPERATION);
8571 // glDrawElementsInstanced
8577 return gl::error(GL_OUT_OF_MEMORY);
8581 GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags)
8583 EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags);
8587 gl::Context *context = gl::getNonLostContext();
8591 if (context->getClientVersion() < 3)
8593 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0));
8596 if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
8598 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0));
8603 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0));
8606 return context->createFenceSync(condition);
8611 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLsync>(NULL));
8617 GLboolean __stdcall glIsSync(GLsync sync)
8619 EVENT("(GLsync sync = 0x%0.8p)", sync);
8623 gl::Context *context = gl::getNonLostContext();
8627 if (context->getClientVersion() < 3)
8629 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
8632 return (context->getFenceSync(sync) != NULL);
8637 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8643 void __stdcall glDeleteSync(GLsync sync)
8645 EVENT("(GLsync sync = 0x%0.8p)", sync);
8649 gl::Context *context = gl::getNonLostContext();
8653 if (context->getClientVersion() < 3)
8655 return gl::error(GL_INVALID_OPERATION);
8658 if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync))
8660 return gl::error(GL_INVALID_VALUE);
8663 context->deleteFenceSync(sync);
8668 return gl::error(GL_OUT_OF_MEMORY);
8672 GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8674 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8675 sync, flags, timeout);
8679 gl::Context *context = gl::getNonLostContext();
8683 if (context->getClientVersion() < 3)
8685 return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED);
8688 if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
8690 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8693 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8697 return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED);
8700 return fenceSync->clientWait(flags, timeout);
8705 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
8711 void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8713 EVENT("(GLsync sync = 0x%0.8p, GLbitfield flags = 0x%X, GLuint64 timeout = %llu)",
8714 sync, flags, timeout);
8718 gl::Context *context = gl::getNonLostContext();
8722 if (context->getClientVersion() < 3)
8724 return gl::error(GL_INVALID_OPERATION);
8729 return gl::error(GL_INVALID_VALUE);
8732 if (timeout != GL_TIMEOUT_IGNORED)
8734 return gl::error(GL_INVALID_VALUE);
8737 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8741 return gl::error(GL_INVALID_VALUE);
8744 fenceSync->serverWait();
8749 return gl::error(GL_OUT_OF_MEMORY);
8753 void __stdcall glGetInteger64v(GLenum pname, GLint64* params)
8755 EVENT("(GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8760 gl::Context *context = gl::getNonLostContext();
8764 if (context->getClientVersion() < 3)
8766 return gl::error(GL_INVALID_OPERATION);
8770 unsigned int numParams = 0;
8771 if (!ValidateStateQuery(context, pname, &nativeType, &numParams))
8776 if (nativeType == GL_INT_64_ANGLEX)
8778 context->getInteger64v(pname, params);
8782 CastStateValues(context, nativeType, pname, numParams, params);
8788 return gl::error(GL_OUT_OF_MEMORY);
8792 void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
8794 EVENT("(GLsync sync = 0x%0.8p, GLenum pname = 0x%X, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLint* values = 0x%0.8p)",
8795 sync, pname, bufSize, length, values);
8799 gl::Context *context = gl::getNonLostContext();
8803 if (context->getClientVersion() < 3)
8805 return gl::error(GL_INVALID_OPERATION);
8810 return gl::error(GL_INVALID_VALUE);
8813 gl::FenceSync *fenceSync = context->getFenceSync(sync);
8817 return gl::error(GL_INVALID_VALUE);
8822 case GL_OBJECT_TYPE: values[0] = static_cast<GLint>(GL_SYNC_FENCE); break;
8823 case GL_SYNC_STATUS: values[0] = static_cast<GLint>(fenceSync->getStatus()); break;
8824 case GL_SYNC_CONDITION: values[0] = static_cast<GLint>(fenceSync->getCondition()); break;
8825 case GL_SYNC_FLAGS: values[0] = 0; break;
8828 return gl::error(GL_INVALID_ENUM);
8834 return gl::error(GL_OUT_OF_MEMORY);
8838 void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
8840 EVENT("(GLenum target = 0x%X, GLuint index = %u, GLint64* data = 0x%0.8p)",
8841 target, index, data);
8845 gl::Context *context = gl::getNonLostContext();
8849 if (context->getClientVersion() < 3)
8851 return gl::error(GL_INVALID_OPERATION);
8856 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
8857 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
8858 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
8859 if (index >= context->getMaxTransformFeedbackBufferBindings())
8860 return gl::error(GL_INVALID_VALUE);
8862 case GL_UNIFORM_BUFFER_START:
8863 case GL_UNIFORM_BUFFER_SIZE:
8864 case GL_UNIFORM_BUFFER_BINDING:
8865 if (index >= context->getMaximumCombinedUniformBufferBindings())
8866 return gl::error(GL_INVALID_VALUE);
8869 return gl::error(GL_INVALID_ENUM);
8872 if (!(context->getIndexedInteger64v(target, index, data)))
8875 unsigned int numParams = 0;
8876 if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams))
8877 return gl::error(GL_INVALID_ENUM);
8880 return; // it is known that pname is valid, but there are no parameters to return
8882 if (nativeType == GL_INT)
8884 GLint *intParams = new GLint[numParams];
8886 context->getIndexedIntegerv(target, index, intParams);
8888 for (unsigned int i = 0; i < numParams; ++i)
8890 data[i] = static_cast<GLint64>(intParams[i]);
8893 delete [] intParams;
8904 return gl::error(GL_OUT_OF_MEMORY);
8908 void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
8910 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint64* params = 0x%0.8p)",
8911 target, pname, params);
8915 gl::Context *context = gl::getNonLostContext();
8919 if (context->getClientVersion() < 3)
8921 return gl::error(GL_INVALID_OPERATION);
8924 if (!gl::ValidBufferTarget(context, target))
8926 return gl::error(GL_INVALID_ENUM);
8929 if (!gl::ValidBufferParameter(context, pname))
8931 return gl::error(GL_INVALID_ENUM);
8934 gl::Buffer *buffer = context->getTargetBuffer(target);
8938 // A null buffer means that "0" is bound to the requested buffer target
8939 return gl::error(GL_INVALID_OPERATION);
8944 case GL_BUFFER_USAGE:
8945 *params = static_cast<GLint64>(buffer->usage());
8947 case GL_BUFFER_SIZE:
8948 *params = buffer->size();
8950 case GL_BUFFER_ACCESS_FLAGS:
8951 *params = static_cast<GLint64>(buffer->accessFlags());
8953 case GL_BUFFER_MAPPED:
8954 *params = static_cast<GLint64>(buffer->mapped());
8956 case GL_BUFFER_MAP_OFFSET:
8957 *params = buffer->mapOffset();
8959 case GL_BUFFER_MAP_LENGTH:
8960 *params = buffer->mapLength();
8962 default: UNREACHABLE(); break;
8968 return gl::error(GL_OUT_OF_MEMORY);
8972 void __stdcall glGenSamplers(GLsizei count, GLuint* samplers)
8974 EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers);
8978 gl::Context *context = gl::getNonLostContext();
8982 if (context->getClientVersion() < 3)
8984 return gl::error(GL_INVALID_OPERATION);
8989 return gl::error(GL_INVALID_VALUE);
8992 for (int i = 0; i < count; i++)
8994 samplers[i] = context->createSampler();
9000 return gl::error(GL_OUT_OF_MEMORY);
9004 void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers)
9006 EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers);
9010 gl::Context *context = gl::getNonLostContext();
9014 if (context->getClientVersion() < 3)
9016 return gl::error(GL_INVALID_OPERATION);
9021 return gl::error(GL_INVALID_VALUE);
9024 for (int i = 0; i < count; i++)
9026 context->deleteSampler(samplers[i]);
9032 return gl::error(GL_OUT_OF_MEMORY);
9036 GLboolean __stdcall glIsSampler(GLuint sampler)
9038 EVENT("(GLuint sampler = %u)", sampler);
9042 gl::Context *context = gl::getNonLostContext();
9046 if (context->getClientVersion() < 3)
9048 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9051 return context->isSampler(sampler);
9056 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9062 void __stdcall glBindSampler(GLuint unit, GLuint sampler)
9064 EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler);
9068 gl::Context *context = gl::getNonLostContext();
9072 if (context->getClientVersion() < 3)
9074 return gl::error(GL_INVALID_OPERATION);
9077 if (sampler != 0 && !context->isSampler(sampler))
9079 return gl::error(GL_INVALID_OPERATION);
9082 if (unit >= context->getMaximumCombinedTextureImageUnits())
9084 return gl::error(GL_INVALID_VALUE);
9087 context->bindSampler(unit, sampler);
9092 return gl::error(GL_OUT_OF_MEMORY);
9096 void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)
9098 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param);
9102 gl::Context *context = gl::getNonLostContext();
9106 if (context->getClientVersion() < 3)
9108 return gl::error(GL_INVALID_OPERATION);
9111 if (!gl::ValidateSamplerObjectParameter(pname))
9116 if (!gl::ValidateTexParamParameters(context, pname, param))
9121 if (!context->isSampler(sampler))
9123 return gl::error(GL_INVALID_OPERATION);
9126 context->samplerParameteri(sampler, pname, param);
9131 return gl::error(GL_OUT_OF_MEMORY);
9135 void __stdcall glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
9137 glSamplerParameteri(sampler, pname, *param);
9140 void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
9142 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param);
9146 gl::Context *context = gl::getNonLostContext();
9150 if (context->getClientVersion() < 3)
9152 return gl::error(GL_INVALID_OPERATION);
9155 if (!gl::ValidateSamplerObjectParameter(pname))
9160 if (!gl::ValidateTexParamParameters(context, pname, static_cast<GLint>(param)))
9165 if (!context->isSampler(sampler))
9167 return gl::error(GL_INVALID_OPERATION);
9170 context->samplerParameterf(sampler, pname, param);
9175 return gl::error(GL_OUT_OF_MEMORY);
9179 void __stdcall glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
9181 glSamplerParameterf(sampler, pname, *param);
9184 void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
9186 EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params);
9190 gl::Context *context = gl::getNonLostContext();
9194 if (context->getClientVersion() < 3)
9196 return gl::error(GL_INVALID_OPERATION);
9199 if (!gl::ValidateSamplerObjectParameter(pname))
9204 if (!context->isSampler(sampler))
9206 return gl::error(GL_INVALID_OPERATION);
9209 *params = context->getSamplerParameteri(sampler, pname);
9214 return gl::error(GL_OUT_OF_MEMORY);
9218 void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
9220 EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params);
9224 gl::Context *context = gl::getNonLostContext();
9228 if (context->getClientVersion() < 3)
9230 return gl::error(GL_INVALID_OPERATION);
9233 if (!gl::ValidateSamplerObjectParameter(pname))
9238 if (!context->isSampler(sampler))
9240 return gl::error(GL_INVALID_OPERATION);
9243 *params = context->getSamplerParameterf(sampler, pname);
9248 return gl::error(GL_OUT_OF_MEMORY);
9252 void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor)
9254 EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor);
9258 if (index >= gl::MAX_VERTEX_ATTRIBS)
9260 return gl::error(GL_INVALID_VALUE);
9263 gl::Context *context = gl::getNonLostContext();
9267 if (context->getClientVersion() < 3)
9269 return gl::error(GL_INVALID_OPERATION);
9272 context->setVertexAttribDivisor(index, divisor);
9277 return gl::error(GL_OUT_OF_MEMORY);
9281 void __stdcall glBindTransformFeedback(GLenum target, GLuint id)
9283 EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id);
9287 gl::Context *context = gl::getNonLostContext();
9291 if (context->getClientVersion() < 3)
9293 return gl::error(GL_INVALID_OPERATION);
9298 case GL_TRANSFORM_FEEDBACK:
9300 // Cannot bind a transform feedback object if the current one is started and not paused (3.0.2 pg 85 section 2.14.1)
9301 gl::TransformFeedback *curTransformFeedback = context->getCurrentTransformFeedback();
9302 if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused())
9304 return gl::error(GL_INVALID_OPERATION);
9307 // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1)
9308 if (context->getTransformFeedback(id) == NULL)
9310 return gl::error(GL_INVALID_OPERATION);
9313 context->bindTransformFeedback(id);
9318 return gl::error(GL_INVALID_ENUM);
9324 return gl::error(GL_OUT_OF_MEMORY);
9328 void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
9330 EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids);
9334 gl::Context *context = gl::getNonLostContext();
9338 if (context->getClientVersion() < 3)
9340 return gl::error(GL_INVALID_OPERATION);
9343 for (int i = 0; i < n; i++)
9345 context->deleteTransformFeedback(ids[i]);
9351 return gl::error(GL_OUT_OF_MEMORY);
9355 void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids)
9357 EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids);
9361 gl::Context *context = gl::getNonLostContext();
9365 if (context->getClientVersion() < 3)
9367 return gl::error(GL_INVALID_OPERATION);
9370 for (int i = 0; i < n; i++)
9372 ids[i] = context->createTransformFeedback();
9378 return gl::error(GL_OUT_OF_MEMORY);
9382 GLboolean __stdcall glIsTransformFeedback(GLuint id)
9384 EVENT("(GLuint id = %u)", id);
9388 gl::Context *context = gl::getNonLostContext();
9392 if (context->getClientVersion() < 3)
9394 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
9397 return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE);
9402 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
9408 void __stdcall glPauseTransformFeedback(void)
9414 gl::Context *context = gl::getNonLostContext();
9418 if (context->getClientVersion() < 3)
9420 return gl::error(GL_INVALID_OPERATION);
9423 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9424 ASSERT(transformFeedback != NULL);
9426 // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86)
9427 if (!transformFeedback->isStarted() || transformFeedback->isPaused())
9429 return gl::error(GL_INVALID_OPERATION);
9432 transformFeedback->pause();
9437 return gl::error(GL_OUT_OF_MEMORY);
9441 void __stdcall glResumeTransformFeedback(void)
9447 gl::Context *context = gl::getNonLostContext();
9451 if (context->getClientVersion() < 3)
9453 return gl::error(GL_INVALID_OPERATION);
9456 gl::TransformFeedback *transformFeedback = context->getCurrentTransformFeedback();
9457 ASSERT(transformFeedback != NULL);
9459 // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86)
9460 if (!transformFeedback->isStarted() || !transformFeedback->isPaused())
9462 return gl::error(GL_INVALID_OPERATION);
9465 transformFeedback->resume();
9470 return gl::error(GL_OUT_OF_MEMORY);
9474 void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
9476 EVENT("(GLuint program = %u, GLsizei bufSize = %d, GLsizei* length = 0x%0.8p, GLenum* binaryFormat = 0x%0.8p, GLvoid* binary = 0x%0.8p)",
9477 program, bufSize, length, binaryFormat, binary);
9481 gl::Context *context = gl::getNonLostContext();
9485 if (context->getClientVersion() < 3)
9487 return gl::error(GL_INVALID_OPERATION);
9490 // glGetProgramBinary
9496 return gl::error(GL_OUT_OF_MEMORY);
9500 void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
9502 EVENT("(GLuint program = %u, GLenum binaryFormat = 0x%X, const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
9503 program, binaryFormat, binary, length);
9507 gl::Context *context = gl::getNonLostContext();
9511 if (context->getClientVersion() < 3)
9513 return gl::error(GL_INVALID_OPERATION);
9522 return gl::error(GL_OUT_OF_MEMORY);
9526 void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value)
9528 EVENT("(GLuint program = %u, GLenum pname = 0x%X, GLint value = %d)",
9529 program, pname, value);
9533 gl::Context *context = gl::getNonLostContext();
9537 if (context->getClientVersion() < 3)
9539 return gl::error(GL_INVALID_OPERATION);
9542 // glProgramParameteri
9548 return gl::error(GL_OUT_OF_MEMORY);
9552 void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
9554 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p)",
9555 target, numAttachments, attachments);
9559 gl::Context *context = gl::getNonLostContext();
9563 if (context->getClientVersion() < 3)
9565 return gl::error(GL_INVALID_OPERATION);
9568 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
9573 int maxDimension = context->getMaximumRenderbufferDimension();
9574 context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension);
9579 return gl::error(GL_OUT_OF_MEMORY);
9583 void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
9585 EVENT("(GLenum target = 0x%X, GLsizei numAttachments = %d, const GLenum* attachments = 0x%0.8p, GLint x = %d, "
9586 "GLint y = %d, GLsizei width = %d, GLsizei height = %d)",
9587 target, numAttachments, attachments, x, y, width, height);
9591 gl::Context *context = gl::getNonLostContext();
9595 if (context->getClientVersion() < 3)
9597 return gl::error(GL_INVALID_OPERATION);
9600 if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments))
9605 context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height);
9610 return gl::error(GL_OUT_OF_MEMORY);
9614 void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
9616 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, GLsizei height = %d)",
9617 target, levels, internalformat, width, height);
9621 gl::Context *context = gl::getNonLostContext();
9625 if (context->getClientVersion() < 3)
9627 return gl::error(GL_INVALID_OPERATION);
9630 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1))
9639 gl::Texture2D *texture2d = context->getTexture2D();
9640 texture2d->storage(levels, internalformat, width, height);
9644 case GL_TEXTURE_CUBE_MAP:
9646 gl::TextureCubeMap *textureCube = context->getTextureCubeMap();
9647 textureCube->storage(levels, internalformat, width);
9652 return gl::error(GL_INVALID_ENUM);
9658 return gl::error(GL_OUT_OF_MEMORY);
9662 void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
9664 EVENT("(GLenum target = 0x%X, GLsizei levels = %d, GLenum internalformat = 0x%X, GLsizei width = %d, "
9665 "GLsizei height = %d, GLsizei depth = %d)",
9666 target, levels, internalformat, width, height, depth);
9670 gl::Context *context = gl::getNonLostContext();
9674 if (context->getClientVersion() < 3)
9676 return gl::error(GL_INVALID_OPERATION);
9679 if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth))
9688 gl::Texture3D *texture3d = context->getTexture3D();
9689 texture3d->storage(levels, internalformat, width, height, depth);
9693 case GL_TEXTURE_2D_ARRAY:
9695 gl::Texture2DArray *texture2darray = context->getTexture2DArray();
9696 texture2darray->storage(levels, internalformat, width, height, depth);
9707 return gl::error(GL_OUT_OF_MEMORY);
9711 void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
9713 EVENT("(GLenum target = 0x%X, GLenum internalformat = 0x%X, GLenum pname = 0x%X, GLsizei bufSize = %d, "
9714 "GLint* params = 0x%0.8p)",
9715 target, internalformat, pname, bufSize, params);
9719 gl::Context *context = gl::getNonLostContext();
9723 if (context->getClientVersion() < 3)
9725 return gl::error(GL_INVALID_OPERATION);
9728 if (!gl::IsColorRenderingSupported(internalformat, context) &&
9729 !gl::IsDepthRenderingSupported(internalformat, context) &&
9730 !gl::IsStencilRenderingSupported(internalformat, context))
9732 return gl::error(GL_INVALID_ENUM);
9735 if (target != GL_RENDERBUFFER)
9737 return gl::error(GL_INVALID_ENUM);
9742 return gl::error(GL_INVALID_VALUE);
9747 case GL_NUM_SAMPLE_COUNTS:
9749 *params = context->getNumSampleCounts(internalformat);
9752 context->getSampleCounts(internalformat, bufSize, params);
9755 return gl::error(GL_INVALID_ENUM);
9761 return gl::error(GL_OUT_OF_MEMORY);
9765 // Extension functions
9767 void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
9768 GLbitfield mask, GLenum filter)
9770 EVENT("(GLint srcX0 = %d, GLint srcY0 = %d, GLint srcX1 = %d, GLint srcY1 = %d, "
9771 "GLint dstX0 = %d, GLint dstY0 = %d, GLint dstX1 = %d, GLint dstY1 = %d, "
9772 "GLbitfield mask = 0x%X, GLenum filter = 0x%X)",
9773 srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter);
9777 gl::Context *context = gl::getNonLostContext();
9781 if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1,
9782 dstX0, dstY0, dstX1, dstY1, mask, filter,
9788 context->blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1,
9794 return gl::error(GL_OUT_OF_MEMORY);
9798 void __stdcall glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
9799 GLint border, GLenum format, GLenum type, const GLvoid* pixels)
9801 EVENT("(GLenum target = 0x%X, GLint level = %d, GLenum internalformat = 0x%X, "
9802 "GLsizei width = %d, GLsizei height = %d, GLsizei depth = %d, GLint border = %d, "
9803 "GLenum format = 0x%X, GLenum type = 0x%x, const GLvoid* pixels = 0x%0.8p)",
9804 target, level, internalformat, width, height, depth, border, format, type, pixels);
9808 UNIMPLEMENTED(); // FIXME
9812 return gl::error(GL_OUT_OF_MEMORY);
9816 void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *length,
9817 GLenum *binaryFormat, void *binary)
9819 EVENT("(GLenum program = 0x%X, bufSize = %d, length = 0x%0.8p, binaryFormat = 0x%0.8p, binary = 0x%0.8p)",
9820 program, bufSize, length, binaryFormat, binary);
9824 gl::Context *context = gl::getNonLostContext();
9828 gl::Program *programObject = context->getProgram(program);
9830 if (!programObject || !programObject->isLinked())
9832 return gl::error(GL_INVALID_OPERATION);
9835 gl::ProgramBinary *programBinary = programObject->getProgramBinary();
9839 return gl::error(GL_INVALID_OPERATION);
9842 if (!programBinary->save(binary, bufSize, length))
9844 return gl::error(GL_INVALID_OPERATION);
9847 *binaryFormat = GL_PROGRAM_BINARY_ANGLE;
9852 return gl::error(GL_OUT_OF_MEMORY);
9856 void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
9857 const void *binary, GLint length)
9859 EVENT("(GLenum program = 0x%X, binaryFormat = 0x%x, binary = 0x%0.8p, length = %d)",
9860 program, binaryFormat, binary, length);
9864 gl::Context *context = gl::getNonLostContext();
9868 if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
9870 return gl::error(GL_INVALID_ENUM);
9873 gl::Program *programObject = context->getProgram(program);
9877 return gl::error(GL_INVALID_OPERATION);
9880 context->setProgramBinary(program, binary, length);
9885 return gl::error(GL_OUT_OF_MEMORY);
9889 void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs)
9891 EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs);
9895 gl::Context *context = gl::getNonLostContext();
9899 if (n < 0 || (unsigned int)n > context->getMaximumRenderTargets())
9901 return gl::error(GL_INVALID_VALUE);
9904 if (context->getDrawFramebufferHandle() == 0)
9908 return gl::error(GL_INVALID_OPERATION);
9911 if (bufs[0] != GL_NONE && bufs[0] != GL_BACK)
9913 return gl::error(GL_INVALID_OPERATION);
9918 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9920 const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment;
9921 if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment)
9923 return gl::error(GL_INVALID_OPERATION);
9928 gl::Framebuffer *framebuffer = context->getDrawFramebuffer();
9930 for (int colorAttachment = 0; colorAttachment < n; colorAttachment++)
9932 framebuffer->setDrawBufferState(colorAttachment, bufs[colorAttachment]);
9935 for (int colorAttachment = n; colorAttachment < (int)context->getMaximumRenderTargets(); colorAttachment++)
9937 framebuffer->setDrawBufferState(colorAttachment, GL_NONE);
9943 return gl::error(GL_OUT_OF_MEMORY);
9947 void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params)
9949 EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params);
9953 gl::Context *context = gl::getNonLostContext();
9957 if (!context->supportsPBOs())
9959 return gl::error(GL_INVALID_OPERATION);
9962 if (!gl::ValidBufferTarget(context, target))
9964 return gl::error(GL_INVALID_ENUM);
9967 if (pname != GL_BUFFER_MAP_POINTER)
9969 return gl::error(GL_INVALID_ENUM);
9972 gl::Buffer *buffer = context->getTargetBuffer(target);
9974 if (!buffer || !buffer->mapped())
9979 *params = buffer->mapPointer();
9984 return gl::error(GL_OUT_OF_MEMORY);
9988 void * __stdcall glMapBufferOES(GLenum target, GLenum access)
9990 EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access);
9994 gl::Context *context = gl::getNonLostContext();
9998 if (!gl::ValidBufferTarget(context, target))
10000 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10003 gl::Buffer *buffer = context->getTargetBuffer(target);
10005 if (buffer == NULL)
10007 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10010 if (access != GL_WRITE_ONLY_OES)
10012 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10015 if (buffer->mapped())
10017 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10020 return buffer->mapRange(0, buffer->size(), GL_MAP_WRITE_BIT);
10025 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10031 GLboolean __stdcall glUnmapBufferOES(GLenum target)
10033 EVENT("(GLenum target = 0x%X)", target);
10037 gl::Context *context = gl::getNonLostContext();
10041 if (!gl::ValidBufferTarget(context, target))
10043 return gl::error(GL_INVALID_ENUM, GL_FALSE);
10046 gl::Buffer *buffer = context->getTargetBuffer(target);
10048 if (buffer == NULL || !buffer->mapped())
10050 return gl::error(GL_INVALID_OPERATION, GL_FALSE);
10053 // TODO: detect if we had corruption. if so, throw an error and return false.
10062 return gl::error(GL_OUT_OF_MEMORY, GL_FALSE);
10068 void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
10070 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d, GLbitfield access = 0x%X)",
10071 target, offset, length, access);
10075 gl::Context *context = gl::getNonLostContext();
10079 if (!gl::ValidBufferTarget(context, target))
10081 return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL));
10084 if (offset < 0 || length < 0)
10086 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10089 gl::Buffer *buffer = context->getTargetBuffer(target);
10091 if (buffer == NULL)
10093 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10096 // Check for buffer overflow
10097 size_t offsetSize = static_cast<size_t>(offset);
10098 size_t lengthSize = static_cast<size_t>(length);
10100 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10101 offsetSize + lengthSize > static_cast<size_t>(buffer->size()))
10103 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10106 // Check for invalid bits in the mask
10107 GLbitfield allAccessBits = GL_MAP_READ_BIT |
10109 GL_MAP_INVALIDATE_RANGE_BIT |
10110 GL_MAP_INVALIDATE_BUFFER_BIT |
10111 GL_MAP_FLUSH_EXPLICIT_BIT |
10112 GL_MAP_UNSYNCHRONIZED_BIT;
10114 if (access & ~(allAccessBits))
10116 return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL));
10119 if (length == 0 || buffer->mapped())
10121 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10124 // Check for invalid bit combinations
10125 if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0)
10127 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10130 GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT |
10131 GL_MAP_INVALIDATE_BUFFER_BIT |
10132 GL_MAP_UNSYNCHRONIZED_BIT;
10134 if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0)
10136 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10139 if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0)
10141 return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL));
10144 return buffer->mapRange(offset, length, access);
10149 return gl::error(GL_OUT_OF_MEMORY, reinterpret_cast<GLvoid*>(NULL));
10155 void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length)
10157 EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length);
10161 gl::Context *context = gl::getNonLostContext();
10165 if (offset < 0 || length < 0)
10167 return gl::error(GL_INVALID_VALUE);
10170 if (!gl::ValidBufferTarget(context, target))
10172 return gl::error(GL_INVALID_ENUM);
10175 gl::Buffer *buffer = context->getTargetBuffer(target);
10177 if (buffer == NULL)
10179 return gl::error(GL_INVALID_OPERATION);
10182 if (!buffer->mapped() || (buffer->accessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0)
10184 return gl::error(GL_INVALID_OPERATION);
10187 // Check for buffer overflow
10188 size_t offsetSize = static_cast<size_t>(offset);
10189 size_t lengthSize = static_cast<size_t>(length);
10191 if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) ||
10192 offsetSize + lengthSize > static_cast<size_t>(buffer->mapLength()))
10194 return gl::error(GL_INVALID_VALUE);
10197 // We do not currently support a non-trivial implementation of FlushMappedBufferRange
10202 return gl::error(GL_OUT_OF_MEMORY);
10206 __eglMustCastToProperFunctionPointerType __stdcall glGetProcAddress(const char *procname)
10211 __eglMustCastToProperFunctionPointerType address;
10214 static const Extension glExtensions[] =
10216 {"glTexImage3DOES", (__eglMustCastToProperFunctionPointerType)glTexImage3DOES},
10217 {"glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)glBlitFramebufferANGLE},
10218 {"glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)glRenderbufferStorageMultisampleANGLE},
10219 {"glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)glDeleteFencesNV},
10220 {"glGenFencesNV", (__eglMustCastToProperFunctionPointerType)glGenFencesNV},
10221 {"glIsFenceNV", (__eglMustCastToProperFunctionPointerType)glIsFenceNV},
10222 {"glTestFenceNV", (__eglMustCastToProperFunctionPointerType)glTestFenceNV},
10223 {"glGetFenceivNV", (__eglMustCastToProperFunctionPointerType)glGetFenceivNV},
10224 {"glFinishFenceNV", (__eglMustCastToProperFunctionPointerType)glFinishFenceNV},
10225 {"glSetFenceNV", (__eglMustCastToProperFunctionPointerType)glSetFenceNV},
10226 {"glGetTranslatedShaderSourceANGLE", (__eglMustCastToProperFunctionPointerType)glGetTranslatedShaderSourceANGLE},
10227 {"glTexStorage2DEXT", (__eglMustCastToProperFunctionPointerType)glTexStorage2DEXT},
10228 {"glGetGraphicsResetStatusEXT", (__eglMustCastToProperFunctionPointerType)glGetGraphicsResetStatusEXT},
10229 {"glReadnPixelsEXT", (__eglMustCastToProperFunctionPointerType)glReadnPixelsEXT},
10230 {"glGetnUniformfvEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformfvEXT},
10231 {"glGetnUniformivEXT", (__eglMustCastToProperFunctionPointerType)glGetnUniformivEXT},
10232 {"glGenQueriesEXT", (__eglMustCastToProperFunctionPointerType)glGenQueriesEXT},
10233 {"glDeleteQueriesEXT", (__eglMustCastToProperFunctionPointerType)glDeleteQueriesEXT},
10234 {"glIsQueryEXT", (__eglMustCastToProperFunctionPointerType)glIsQueryEXT},
10235 {"glBeginQueryEXT", (__eglMustCastToProperFunctionPointerType)glBeginQueryEXT},
10236 {"glEndQueryEXT", (__eglMustCastToProperFunctionPointerType)glEndQueryEXT},
10237 {"glGetQueryivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryivEXT},
10238 {"glGetQueryObjectuivEXT", (__eglMustCastToProperFunctionPointerType)glGetQueryObjectuivEXT},
10239 {"glDrawBuffersEXT", (__eglMustCastToProperFunctionPointerType)glDrawBuffersEXT},
10240 {"glVertexAttribDivisorANGLE", (__eglMustCastToProperFunctionPointerType)glVertexAttribDivisorANGLE},
10241 {"glDrawArraysInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawArraysInstancedANGLE},
10242 {"glDrawElementsInstancedANGLE", (__eglMustCastToProperFunctionPointerType)glDrawElementsInstancedANGLE},
10243 {"glGetProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glGetProgramBinaryOES},
10244 {"glProgramBinaryOES", (__eglMustCastToProperFunctionPointerType)glProgramBinaryOES},
10245 {"glGetBufferPointervOES", (__eglMustCastToProperFunctionPointerType)glGetBufferPointervOES},
10246 {"glMapBufferOES", (__eglMustCastToProperFunctionPointerType)glMapBufferOES},
10247 {"glUnmapBufferOES", (__eglMustCastToProperFunctionPointerType)glUnmapBufferOES},
10248 {"glMapBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glMapBufferRangeEXT},
10249 {"glFlushMappedBufferRangeEXT", (__eglMustCastToProperFunctionPointerType)glFlushMappedBufferRangeEXT}, };
10251 for (unsigned int ext = 0; ext < ArraySize(glExtensions); ext++)
10253 if (strcmp(procname, glExtensions[ext].name) == 0)
10255 return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address;
10262 // Non-public functions used by EGL
10264 bool __stdcall glBindTexImage(egl::Surface *surface)
10266 EVENT("(egl::Surface* surface = 0x%0.8p)",
10271 gl::Context *context = gl::getNonLostContext();
10275 gl::Texture2D *textureObject = context->getTexture2D();
10276 ASSERT(textureObject != NULL);
10278 if (textureObject->isImmutable())
10283 textureObject->bindTexImage(surface);
10288 return gl::error(GL_OUT_OF_MEMORY, false);