diff options
Diffstat (limited to 'src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp | 3334 |
1 files changed, 1868 insertions, 1466 deletions
diff --git a/src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp b/src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp index 5e2ec4a4ee..07f5d47473 100644 --- a/src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp +++ b/src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp @@ -1,4 +1,3 @@ -#include "precompiled.h" // // Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be @@ -7,10 +6,14 @@ // libGLESv2.cpp: Implements the exported OpenGL ES 2.0 functions. +#undef GL_APICALL +#define GL_APICALL +#define GL_GLEXT_PROTOTYPES + #include "common/version.h" +#include "common/utilities.h" #include "libGLESv2/main.h" -#include "common/utilities.h" #include "libGLESv2/formatutils.h" #include "libGLESv2/Buffer.h" #include "libGLESv2/Fence.h" @@ -31,6 +34,7 @@ #include "libGLESv2/validationES3.h" #include "libGLESv2/queryconversions.h" + extern "C" { @@ -41,12 +45,12 @@ void __stdcall glActiveTexture(GLenum texture) EVENT("(GLenum texture = 0x%X)", texture); gl::Context *context = gl::getNonLostContext(); - if (context) { - if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1) + if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getCaps().maxCombinedTextureImageUnits - 1) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } context->getState().setActiveSampler(texture - GL_TEXTURE0); @@ -58,7 +62,6 @@ void __stdcall glAttachShader(GLuint program, GLuint shader) EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Program *programObject = context->getProgram(program); @@ -68,11 +71,13 @@ void __stdcall glAttachShader(GLuint program, GLuint shader) { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -80,17 +85,20 @@ void __stdcall glAttachShader(GLuint program, GLuint shader) { if (context->getProgram(shader)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } if (!programObject->attachShader(shaderObject)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } } } @@ -100,7 +108,6 @@ void __stdcall glBeginQueryEXT(GLenum target, GLuint id) EVENT("(GLenum target = 0x%X, GLuint %d)", target, id); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateBeginQuery(context, target, id)) @@ -108,7 +115,12 @@ void __stdcall glBeginQueryEXT(GLenum target, GLuint id) return; } - context->beginQuery(target, id); + gl::Error error = context->beginQuery(target, id); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -116,32 +128,35 @@ void __stdcall glBindAttribLocation(GLuint program, GLuint index, const GLchar* { EVENT("(GLuint program = %d, GLuint index = %d, const GLchar* name = 0x%0.8p)", program, index, name); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + gl::Program *programObject = context->getProgram(program); if (!programObject) { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } if (strncmp(name, "gl_", 3) == 0) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } programObject->bindAttributeLocation(index, name); @@ -153,12 +168,12 @@ void __stdcall glBindBuffer(GLenum target, GLuint buffer) EVENT("(GLenum target = 0x%X, GLuint buffer = %d)", target, buffer); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!gl::ValidBufferTarget(context, target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } switch (target) @@ -187,8 +202,10 @@ void __stdcall glBindBuffer(GLenum target, GLuint buffer) case GL_TRANSFORM_FEEDBACK_BUFFER: context->bindGenericTransformFeedbackBuffer(buffer); return; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -197,15 +214,15 @@ void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer) { EVENT("(GLenum target = 0x%X, GLuint framebuffer = %d)", target, framebuffer); - if (!gl::ValidFramebufferTarget(target)) - { - return gl::error(GL_INVALID_ENUM); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (!gl::ValidFramebufferTarget(target)) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER) { context->bindReadFramebuffer(framebuffer); @@ -222,15 +239,15 @@ void __stdcall glBindRenderbuffer(GLenum target, GLuint renderbuffer) { EVENT("(GLenum target = 0x%X, GLuint renderbuffer = %d)", target, renderbuffer); - if (target != GL_RENDERBUFFER) - { - return gl::error(GL_INVALID_ENUM); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (target != GL_RENDERBUFFER) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + context->bindRenderbuffer(renderbuffer); } } @@ -240,41 +257,37 @@ void __stdcall glBindTexture(GLenum target, GLuint texture) EVENT("(GLenum target = 0x%X, GLuint texture = %d)", target, texture); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Texture *textureObject = context->getTexture(texture); if (textureObject && textureObject->getTarget() != target && texture != 0) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } switch (target) { case GL_TEXTURE_2D: - context->bindTexture2D(texture); - return; case GL_TEXTURE_CUBE_MAP: - context->bindTextureCubeMap(texture); - return; + break; + case GL_TEXTURE_3D: - if (context->getClientVersion() < 3) - { - return gl::error(GL_INVALID_ENUM); - } - context->bindTexture3D(texture); - return; case GL_TEXTURE_2D_ARRAY: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } - context->bindTexture2DArray(texture); - return; + break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } + + context->bindTexture(target, texture); } } @@ -301,35 +314,36 @@ void __stdcall glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha); gl::Context *context = gl::getNonLostContext(); - - switch (modeRGB) + if (context) { - case GL_FUNC_ADD: - case GL_FUNC_SUBTRACT: - case GL_FUNC_REVERSE_SUBTRACT: - case GL_MIN: - case GL_MAX: - break; + switch (modeRGB) + { + case GL_FUNC_ADD: + case GL_FUNC_SUBTRACT: + case GL_FUNC_REVERSE_SUBTRACT: + case GL_MIN: + case GL_MAX: + break; - default: - return gl::error(GL_INVALID_ENUM); - } + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - switch (modeAlpha) - { - case GL_FUNC_ADD: - case GL_FUNC_SUBTRACT: - case GL_FUNC_REVERSE_SUBTRACT: - case GL_MIN: - case GL_MAX: - break; + switch (modeAlpha) + { + case GL_FUNC_ADD: + case GL_FUNC_SUBTRACT: + case GL_FUNC_REVERSE_SUBTRACT: + case GL_MIN: + case GL_MAX: + break; - default: - return gl::error(GL_INVALID_ENUM); - } + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - if (context) - { context->getState().setBlendEquation(modeRGB, modeAlpha); } } @@ -345,123 +359,131 @@ void __stdcall glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha srcRGB, dstRGB, srcAlpha, dstAlpha); gl::Context *context = gl::getNonLostContext(); - - switch (srcRGB) - { - case GL_ZERO: - case GL_ONE: - case GL_SRC_COLOR: - case GL_ONE_MINUS_SRC_COLOR: - case GL_DST_COLOR: - case GL_ONE_MINUS_DST_COLOR: - case GL_SRC_ALPHA: - case GL_ONE_MINUS_SRC_ALPHA: - case GL_DST_ALPHA: - case GL_ONE_MINUS_DST_ALPHA: - case GL_CONSTANT_COLOR: - case GL_ONE_MINUS_CONSTANT_COLOR: - case GL_CONSTANT_ALPHA: - case GL_ONE_MINUS_CONSTANT_ALPHA: - case GL_SRC_ALPHA_SATURATE: - break; - default: - return gl::error(GL_INVALID_ENUM); - } - - switch (dstRGB) + if (context) { - case GL_ZERO: - case GL_ONE: - case GL_SRC_COLOR: - case GL_ONE_MINUS_SRC_COLOR: - case GL_DST_COLOR: - case GL_ONE_MINUS_DST_COLOR: - case GL_SRC_ALPHA: - case GL_ONE_MINUS_SRC_ALPHA: - case GL_DST_ALPHA: - case GL_ONE_MINUS_DST_ALPHA: - case GL_CONSTANT_COLOR: - case GL_ONE_MINUS_CONSTANT_COLOR: - case GL_CONSTANT_ALPHA: - case GL_ONE_MINUS_CONSTANT_ALPHA: - break; - - case GL_SRC_ALPHA_SATURATE: - if (!context || context->getClientVersion() < 3) + switch (srcRGB) { - return gl::error(GL_INVALID_ENUM); + case GL_ZERO: + case GL_ONE: + case GL_SRC_COLOR: + case GL_ONE_MINUS_SRC_COLOR: + case GL_DST_COLOR: + case GL_ONE_MINUS_DST_COLOR: + case GL_SRC_ALPHA: + case GL_ONE_MINUS_SRC_ALPHA: + case GL_DST_ALPHA: + case GL_ONE_MINUS_DST_ALPHA: + case GL_CONSTANT_COLOR: + case GL_ONE_MINUS_CONSTANT_COLOR: + case GL_CONSTANT_ALPHA: + case GL_ONE_MINUS_CONSTANT_ALPHA: + case GL_SRC_ALPHA_SATURATE: + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } - break; - default: - return gl::error(GL_INVALID_ENUM); - } - - switch (srcAlpha) - { - case GL_ZERO: - case GL_ONE: - case GL_SRC_COLOR: - case GL_ONE_MINUS_SRC_COLOR: - case GL_DST_COLOR: - case GL_ONE_MINUS_DST_COLOR: - case GL_SRC_ALPHA: - case GL_ONE_MINUS_SRC_ALPHA: - case GL_DST_ALPHA: - case GL_ONE_MINUS_DST_ALPHA: - case GL_CONSTANT_COLOR: - case GL_ONE_MINUS_CONSTANT_COLOR: - case GL_CONSTANT_ALPHA: - case GL_ONE_MINUS_CONSTANT_ALPHA: - case GL_SRC_ALPHA_SATURATE: - break; - default: - return gl::error(GL_INVALID_ENUM); - } + switch (dstRGB) + { + case GL_ZERO: + case GL_ONE: + case GL_SRC_COLOR: + case GL_ONE_MINUS_SRC_COLOR: + case GL_DST_COLOR: + case GL_ONE_MINUS_DST_COLOR: + case GL_SRC_ALPHA: + case GL_ONE_MINUS_SRC_ALPHA: + case GL_DST_ALPHA: + case GL_ONE_MINUS_DST_ALPHA: + case GL_CONSTANT_COLOR: + case GL_ONE_MINUS_CONSTANT_COLOR: + case GL_CONSTANT_ALPHA: + case GL_ONE_MINUS_CONSTANT_ALPHA: + break; - switch (dstAlpha) - { - case GL_ZERO: - case GL_ONE: - case GL_SRC_COLOR: - case GL_ONE_MINUS_SRC_COLOR: - case GL_DST_COLOR: - case GL_ONE_MINUS_DST_COLOR: - case GL_SRC_ALPHA: - case GL_ONE_MINUS_SRC_ALPHA: - case GL_DST_ALPHA: - case GL_ONE_MINUS_DST_ALPHA: - case GL_CONSTANT_COLOR: - case GL_ONE_MINUS_CONSTANT_COLOR: - case GL_CONSTANT_ALPHA: - case GL_ONE_MINUS_CONSTANT_ALPHA: - break; + case GL_SRC_ALPHA_SATURATE: + if (context->getClientVersion() < 3) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - case GL_SRC_ALPHA_SATURATE: - if (!context || context->getClientVersion() < 3) + switch (srcAlpha) { - return gl::error(GL_INVALID_ENUM); + case GL_ZERO: + case GL_ONE: + case GL_SRC_COLOR: + case GL_ONE_MINUS_SRC_COLOR: + case GL_DST_COLOR: + case GL_ONE_MINUS_DST_COLOR: + case GL_SRC_ALPHA: + case GL_ONE_MINUS_SRC_ALPHA: + case GL_DST_ALPHA: + case GL_ONE_MINUS_DST_ALPHA: + case GL_CONSTANT_COLOR: + case GL_ONE_MINUS_CONSTANT_COLOR: + case GL_CONSTANT_ALPHA: + case GL_ONE_MINUS_CONSTANT_ALPHA: + case GL_SRC_ALPHA_SATURATE: + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } - break; - default: - return gl::error(GL_INVALID_ENUM); - } + switch (dstAlpha) + { + case GL_ZERO: + case GL_ONE: + case GL_SRC_COLOR: + case GL_ONE_MINUS_SRC_COLOR: + case GL_DST_COLOR: + case GL_ONE_MINUS_DST_COLOR: + case GL_SRC_ALPHA: + case GL_ONE_MINUS_SRC_ALPHA: + case GL_DST_ALPHA: + case GL_ONE_MINUS_DST_ALPHA: + case GL_CONSTANT_COLOR: + case GL_ONE_MINUS_CONSTANT_COLOR: + case GL_CONSTANT_ALPHA: + case GL_ONE_MINUS_CONSTANT_ALPHA: + break; + + case GL_SRC_ALPHA_SATURATE: + if (context->getClientVersion() < 3) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + break; - bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR || - dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR); + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA || - dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA); + bool constantColorUsed = (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR || + dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR); - if (constantColorUsed && constantAlphaUsed) - { - ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL"); - return gl::error(GL_INVALID_OPERATION); - } + bool constantAlphaUsed = (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA || + dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA); + + if (constantColorUsed && constantAlphaUsed) + { + ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR invalid under WebGL"); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; + } - if (context) - { context->getState().setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha); } } @@ -471,51 +493,60 @@ void __stdcall glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, EVENT("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)", target, size, data, usage); - if (size < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - - switch (usage) + if (context) { - case GL_STREAM_DRAW: - case GL_STATIC_DRAW: - case GL_DYNAMIC_DRAW: - break; - - case GL_STREAM_READ: - case GL_STREAM_COPY: - case GL_STATIC_READ: - case GL_STATIC_COPY: - case GL_DYNAMIC_READ: - case GL_DYNAMIC_COPY: - if (context && context->getClientVersion() < 3) + if (size < 0) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } - break; - default: - return gl::error(GL_INVALID_ENUM); - } + switch (usage) + { + case GL_STREAM_DRAW: + case GL_STATIC_DRAW: + case GL_DYNAMIC_DRAW: + break; + + case GL_STREAM_READ: + case GL_STREAM_COPY: + case GL_STATIC_READ: + case GL_STATIC_COPY: + case GL_DYNAMIC_READ: + case GL_DYNAMIC_COPY: + if (context->getClientVersion() < 3) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - if (context) - { if (!gl::ValidBufferTarget(context, target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::Buffer *buffer = context->getState().getTargetBuffer(target); if (!buffer) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - buffer->bufferData(data, size, usage); + gl::Error error = buffer->bufferData(data, size, usage); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -524,49 +555,59 @@ void __stdcall glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)", target, offset, size, data); - if (size < 0 || offset < 0) - { - return gl::error(GL_INVALID_VALUE); - } - - if (data == NULL) - { - return; - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (size < 0 || offset < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + + if (data == NULL) + { + return; + } + if (!gl::ValidBufferTarget(context, target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::Buffer *buffer = context->getState().getTargetBuffer(target); if (!buffer) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (buffer->isMapped()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // Check for possible overflow of size + offset if (!rx::IsUnsignedAdditionSafe<size_t>(size, offset)) { - return gl::error(GL_OUT_OF_MEMORY); + context->recordError(gl::Error(GL_OUT_OF_MEMORY)); + return; } if (size + offset > buffer->getSize()) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } - buffer->bufferSubData(data, size, offset); + gl::Error error = buffer->bufferSubData(data, size, offset); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -574,15 +615,15 @@ GLenum __stdcall glCheckFramebufferStatus(GLenum target) { EVENT("(GLenum target = 0x%X)", target); - if (!gl::ValidFramebufferTarget(target)) - { - return gl::error(GL_INVALID_ENUM, 0); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (!gl::ValidFramebufferTarget(target)) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return 0; + } + gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); ASSERT(framebuffer); return framebuffer->completeness(); @@ -596,22 +637,28 @@ void __stdcall glClear(GLbitfield mask) EVENT("(GLbitfield mask = 0x%X)", mask); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Framebuffer *framebufferObject = context->getState().getDrawFramebuffer(); if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE) { - return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION); + context->recordError(gl::Error(GL_INVALID_FRAMEBUFFER_OPERATION)); + return; } if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } - context->clear(mask); + gl::Error error = context->clear(mask); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -621,7 +668,6 @@ void __stdcall glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclamp red, green, blue, alpha); gl::Context *context = gl::getNonLostContext(); - if (context) { context->getState().setClearColor(red, green, blue, alpha); @@ -633,7 +679,6 @@ void __stdcall glClearDepthf(GLclampf depth) EVENT("(GLclampf depth = %f)", depth); gl::Context *context = gl::getNonLostContext(); - if (context) { context->getState().setClearDepth(depth); @@ -645,7 +690,6 @@ void __stdcall glClearStencil(GLint s) EVENT("(GLint s = %d)", s); gl::Context *context = gl::getNonLostContext(); - if (context) { context->getState().setClearStencil(s); @@ -658,7 +702,6 @@ void __stdcall glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboo red, green, blue, alpha); gl::Context *context = gl::getNonLostContext(); - if (context) { context->getState().setColorMask(red == GL_TRUE, green == GL_TRUE, blue == GL_TRUE, alpha == GL_TRUE); @@ -670,7 +713,6 @@ void __stdcall glCompileShader(GLuint shader) EVENT("(GLuint shader = %d)", shader); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Shader *shaderObject = context->getShader(shader); @@ -679,11 +721,13 @@ void __stdcall glCompileShader(GLuint shader) { if (context->getProgram(shader)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -699,7 +743,6 @@ void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum interna target, level, internalformat, width, height, border, imageSize, data); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3 && @@ -716,9 +759,11 @@ void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum interna return; } - if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, width, height)) + const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalformat); + if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height)) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } switch (target) @@ -743,7 +788,8 @@ void __stdcall glCompressedTexImage2D(GLenum target, GLint level, GLenum interna break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -757,7 +803,6 @@ void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs target, level, xoffset, yoffset, width, height, format, imageSize, data); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3 && @@ -774,9 +819,11 @@ void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs return; } - if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, width, height)) + const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(format); + if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height)) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } switch (target) @@ -801,7 +848,8 @@ void __stdcall glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffs break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -813,7 +861,6 @@ void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalforma target, level, internalformat, x, y, width, height, border); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3 && @@ -853,8 +900,9 @@ void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalforma } break; - default: - return gl::error(GL_INVALID_ENUM); + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -866,7 +914,6 @@ void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL target, level, xoffset, yoffset, x, y, width, height); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3 && @@ -907,7 +954,8 @@ void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -930,7 +978,6 @@ GLuint __stdcall glCreateShader(GLenum type) EVENT("(GLenum type = 0x%X)", type); gl::Context *context = gl::getNonLostContext(); - if (context) { switch (type) @@ -938,8 +985,10 @@ GLuint __stdcall glCreateShader(GLenum type) case GL_FRAGMENT_SHADER: case GL_VERTEX_SHADER: return context->createShader(type); + default: - return gl::error(GL_INVALID_ENUM, 0); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return 0; } } @@ -950,22 +999,22 @@ void __stdcall glCullFace(GLenum mode) { EVENT("(GLenum mode = 0x%X)", mode); - switch (mode) + gl::Context *context = gl::getNonLostContext(); + if (context) { - case GL_FRONT: - case GL_BACK: - case GL_FRONT_AND_BACK: + switch (mode) { - gl::Context *context = gl::getNonLostContext(); + case GL_FRONT: + case GL_BACK: + case GL_FRONT_AND_BACK: + break; - if (context) - { - context->getState().setCullMode(mode); - } + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } - break; - default: - return gl::error(GL_INVALID_ENUM); + + context->getState().setCullMode(mode); } } @@ -973,15 +1022,15 @@ void __stdcall glDeleteBuffers(GLsizei n, const GLuint* buffers) { EVENT("(GLsizei n = %d, const GLuint* buffers = 0x%0.8p)", n, buffers); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { context->deleteBuffer(buffers[i]); @@ -993,15 +1042,15 @@ void __stdcall glDeleteFencesNV(GLsizei n, const GLuint* fences) { EVENT("(GLsizei n = %d, const GLuint* fences = 0x%0.8p)", n, fences); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { context->deleteFenceNV(fences[i]); @@ -1013,15 +1062,15 @@ void __stdcall glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) { EVENT("(GLsizei n = %d, const GLuint* framebuffers = 0x%0.8p)", n, framebuffers); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { if (framebuffers[i] != 0) @@ -1036,24 +1085,25 @@ void __stdcall glDeleteProgram(GLuint program) { EVENT("(GLuint program = %d)", program); - if (program == 0) - { - return; - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (program == 0) + { + return; + } + if (!context->getProgram(program)) { if(context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -1065,15 +1115,15 @@ void __stdcall glDeleteQueriesEXT(GLsizei n, const GLuint *ids) { EVENT("(GLsizei n = %d, const GLuint *ids = 0x%0.8p)", n, ids); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { context->deleteQuery(ids[i]); @@ -1085,15 +1135,15 @@ void __stdcall glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { EVENT("(GLsizei n = %d, const GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { context->deleteRenderbuffer(renderbuffers[i]); @@ -1105,24 +1155,25 @@ void __stdcall glDeleteShader(GLuint shader) { EVENT("(GLuint shader = %d)", shader); - if (shader == 0) - { - return; - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (shader == 0) + { + return; + } + if (!context->getShader(shader)) { if(context->getProgram(shader)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -1134,15 +1185,15 @@ void __stdcall glDeleteTextures(GLsizei n, const GLuint* textures) { EVENT("(GLsizei n = %d, const GLuint* textures = 0x%0.8p)", n, textures); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { if (textures[i] != 0) @@ -1157,26 +1208,26 @@ void __stdcall glDepthFunc(GLenum func) { EVENT("(GLenum func = 0x%X)", func); - switch (func) - { - case GL_NEVER: - case GL_ALWAYS: - case GL_LESS: - case GL_LEQUAL: - case GL_EQUAL: - case GL_GREATER: - case GL_GEQUAL: - case GL_NOTEQUAL: - break; - default: - return gl::error(GL_INVALID_ENUM); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { - context->getState().setDepthFunc(func); + switch (func) + { + case GL_NEVER: + case GL_ALWAYS: + case GL_LESS: + case GL_LEQUAL: + case GL_EQUAL: + case GL_GREATER: + case GL_GEQUAL: + case GL_NOTEQUAL: + context->getState().setDepthFunc(func); + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } } } @@ -1185,7 +1236,6 @@ void __stdcall glDepthMask(GLboolean flag) EVENT("(GLboolean flag = %u)", flag); gl::Context *context = gl::getNonLostContext(); - if (context) { context->getState().setDepthMask(flag != GL_FALSE); @@ -1197,7 +1247,6 @@ void __stdcall glDepthRangef(GLclampf zNear, GLclampf zFar) EVENT("(GLclampf zNear = %f, GLclampf zFar = %f)", zNear, zFar); gl::Context *context = gl::getNonLostContext(); - if (context) { context->getState().setDepthRange(zNear, zFar); @@ -1209,10 +1258,8 @@ void __stdcall glDetachShader(GLuint program, GLuint shader) EVENT("(GLuint program = %d, GLuint shader = %d)", program, shader); gl::Context *context = gl::getNonLostContext(); - if (context) { - gl::Program *programObject = context->getProgram(program); gl::Shader *shaderObject = context->getShader(shader); @@ -1222,11 +1269,13 @@ void __stdcall glDetachShader(GLuint program, GLuint shader) shaderByProgramHandle = context->getShader(program); if (!shaderByProgramHandle) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } else { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } } @@ -1235,17 +1284,20 @@ void __stdcall glDetachShader(GLuint program, GLuint shader) gl::Program *programByShaderHandle = context->getProgram(shader); if (!programByShaderHandle) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } else { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } } if (!programObject->detachShader(shaderObject)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } } } @@ -1255,12 +1307,12 @@ void __stdcall glDisable(GLenum cap) EVENT("(GLenum cap = 0x%X)", cap); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidCap(context, cap)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } context->getState().setEnableFeature(cap, false); @@ -1271,15 +1323,15 @@ void __stdcall glDisableVertexAttribArray(GLuint index) { EVENT("(GLuint index = %d)", index); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + context->getState().setEnableVertexAttribArray(index, false); } } @@ -1289,15 +1341,19 @@ void __stdcall glDrawArrays(GLenum mode, GLint first, GLsizei count) EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d)", mode, first, count); gl::Context *context = gl::getNonLostContext(); - if (context) { - if (!ValidateDrawArrays(context, mode, first, count)) + if (!ValidateDrawArrays(context, mode, first, count, 0)) { return; } - context->drawArrays(mode, first, count, 0); + gl::Error error = context->drawArrays(mode, first, count, 0); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -1306,15 +1362,19 @@ void __stdcall glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei coun EVENT("(GLenum mode = 0x%X, GLint first = %d, GLsizei count = %d, GLsizei primcount = %d)", mode, first, count, primcount); gl::Context *context = gl::getNonLostContext(); - if (context) { - if (!ValidateDrawArraysInstanced(context, mode, first, count, primcount)) + if (!ValidateDrawArraysInstancedANGLE(context, mode, first, count, primcount)) { return; } - context->drawArrays(mode, first, count, primcount); + gl::Error error = context->drawArrays(mode, first, count, primcount); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -1324,15 +1384,20 @@ void __stdcall glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLv mode, count, type, indices); gl::Context *context = gl::getNonLostContext(); - if (context) { - if (!ValidateDrawElements(context, mode, count, type, indices)) + rx::RangeUI indexRange; + if (!ValidateDrawElements(context, mode, count, type, indices, 0, &indexRange)) { return; } - context->drawElements(mode, count, type, indices, 0); + gl::Error error = context->drawElements(mode, count, type, indices, 0, indexRange); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -1342,15 +1407,20 @@ void __stdcall glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum t mode, count, type, indices, primcount); gl::Context *context = gl::getNonLostContext(); - if (context) { - if (!ValidateDrawElementsInstanced(context, mode, count, type, indices, primcount)) + rx::RangeUI indexRange; + if (!ValidateDrawElementsInstancedANGLE(context, mode, count, type, indices, primcount, &indexRange)) { return; } - context->drawElements(mode, count, type, indices, primcount); + gl::Error error = context->drawElements(mode, count, type, indices, primcount, indexRange); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -1359,12 +1429,12 @@ void __stdcall glEnable(GLenum cap) EVENT("(GLenum cap = 0x%X)", cap); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidCap(context, cap)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } context->getState().setEnableFeature(cap, true); @@ -1375,15 +1445,15 @@ void __stdcall glEnableVertexAttribArray(GLuint index) { EVENT("(GLuint index = %d)", index); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + context->getState().setEnableVertexAttribArray(index, true); } } @@ -1393,7 +1463,6 @@ void __stdcall glEndQueryEXT(GLenum target) EVENT("GLenum target = 0x%X)", target); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateEndQuery(context, target)) @@ -1401,7 +1470,12 @@ void __stdcall glEndQueryEXT(GLenum target) return; } - context->endQuery(target); + gl::Error error = context->endQuery(target); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -1410,19 +1484,20 @@ void __stdcall glFinishFenceNV(GLuint fence) EVENT("(GLuint fence = %d)", fence); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::FenceNV *fenceObject = context->getFenceNV(fence); if (fenceObject == NULL) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (fenceObject->isFence() != GL_TRUE) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } fenceObject->finishFence(); @@ -1434,7 +1509,6 @@ void __stdcall glFinish(void) EVENT("()"); gl::Context *context = gl::getNonLostContext(); - if (context) { context->sync(true); @@ -1446,7 +1520,6 @@ void __stdcall glFlush(void) EVENT("()"); gl::Context *context = gl::getNonLostContext(); - if (context) { context->sync(false); @@ -1458,15 +1531,15 @@ void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenu EVENT("(GLenum target = 0x%X, GLenum attachment = 0x%X, GLenum renderbuffertarget = 0x%X, " "GLuint renderbuffer = %d)", target, attachment, renderbuffertarget, renderbuffer); - if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0)) - { - return gl::error(GL_INVALID_ENUM); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (!gl::ValidFramebufferTarget(target) || (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0)) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + if (!gl::ValidateFramebufferRenderbufferParameters(context, target, attachment, renderbuffertarget, renderbuffer)) { return; @@ -1542,21 +1615,19 @@ void __stdcall glFrontFace(GLenum mode) { EVENT("(GLenum mode = 0x%X)", mode); - switch (mode) + gl::Context *context = gl::getNonLostContext(); + if (context) { - case GL_CW: - case GL_CCW: + switch (mode) { - gl::Context *context = gl::getNonLostContext(); - - if (context) - { - context->getState().setFrontFace(mode); - } + case GL_CW: + case GL_CCW: + context->getState().setFrontFace(mode); + break; + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } - break; - default: - return gl::error(GL_INVALID_ENUM); } } @@ -1564,15 +1635,15 @@ void __stdcall glGenBuffers(GLsizei n, GLuint* buffers) { EVENT("(GLsizei n = %d, GLuint* buffers = 0x%0.8p)", n, buffers); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { buffers[i] = context->createBuffer(); @@ -1585,23 +1656,25 @@ void __stdcall glGenerateMipmap(GLenum target) EVENT("(GLenum target = 0x%X)", target); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidTextureTarget(context, target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::Texture *texture = context->getTargetTexture(target); if (texture == NULL) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } GLenum internalFormat = texture->getBaseLevelInternalFormat(); const gl::TextureCaps &formatCaps = context->getTextureCaps().get(internalFormat); + const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat); // GenerateMipmap should not generate an INVALID_OPERATION for textures created with // unsized formats or that are color renderable and filterable. Since we do not track if @@ -1615,23 +1688,26 @@ void __stdcall glGenerateMipmap(GLenum target) internalFormat == GL_LUMINANCE8_ALPHA8_EXT || internalFormat == GL_ALPHA8_EXT; - if (gl::GetDepthBits(internalFormat) > 0 || gl::GetStencilBits(internalFormat) > 0 || !formatCaps.filterable || - (!formatCaps.renderable && !isLUMA) || gl::IsFormatCompressed(internalFormat)) + if (formatInfo.depthBits > 0 || formatInfo.stencilBits > 0 || !formatCaps.filterable || + (!formatCaps.renderable && !isLUMA) || formatInfo.compressed) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // GL_EXT_sRGB does not support mipmap generation on sRGB textures - if (context->getClientVersion() == 2 && gl::GetColorEncoding(internalFormat) == GL_SRGB) + if (context->getClientVersion() == 2 && formatInfo.colorEncoding == GL_SRGB) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // Non-power of 2 ES2 check if (!context->getExtensions().textureNPOT && (!gl::isPow2(texture->getBaseLevelWidth()) || !gl::isPow2(texture->getBaseLevelHeight()))) { ASSERT(context->getClientVersion() <= 2 && (target == GL_TEXTURE_2D || target == GL_TEXTURE_CUBE_MAP)); - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // Cube completeness check @@ -1640,7 +1716,8 @@ void __stdcall glGenerateMipmap(GLenum target) gl::TextureCubeMap *textureCube = static_cast<gl::TextureCubeMap *>(texture); if (!textureCube->isCubeComplete()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } } @@ -1652,15 +1729,15 @@ void __stdcall glGenFencesNV(GLsizei n, GLuint* fences) { EVENT("(GLsizei n = %d, GLuint* fences = 0x%0.8p)", n, fences); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { fences[i] = context->createFenceNV(); @@ -1672,15 +1749,15 @@ void __stdcall glGenFramebuffers(GLsizei n, GLuint* framebuffers) { EVENT("(GLsizei n = %d, GLuint* framebuffers = 0x%0.8p)", n, framebuffers); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { framebuffers[i] = context->createFramebuffer(); @@ -1693,12 +1770,12 @@ void __stdcall glGenQueriesEXT(GLsizei n, GLuint* ids) EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids); gl::Context *context = gl::getNonLostContext(); - if (context) { if (n < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } for (GLsizei i = 0; i < n; i++) @@ -1712,15 +1789,15 @@ void __stdcall glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) { EVENT("(GLsizei n = %d, GLuint* renderbuffers = 0x%0.8p)", n, renderbuffers); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { renderbuffers[i] = context->createRenderbuffer(); @@ -1732,15 +1809,15 @@ void __stdcall glGenTextures(GLsizei n, GLuint* textures) { EVENT("(GLsizei n = %d, GLuint* textures = 0x%0.8p)", n, textures); - if (n < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (n < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + for (int i = 0; i < n; i++) { textures[i] = context->createTexture(); @@ -1754,32 +1831,35 @@ void __stdcall glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, "GLint *size = 0x%0.8p, GLenum *type = %0.8p, GLchar *name = %0.8p)", program, index, bufsize, length, size, type, name); - if (bufsize < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (bufsize < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + gl::Program *programObject = context->getProgram(program); if (!programObject) { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } if (index >= (GLuint)programObject->getActiveAttributeCount()) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } programObject->getActiveAttribute(index, bufsize, length, size, type, name); @@ -1792,32 +1872,36 @@ void __stdcall glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, "GLsizei* length = 0x%0.8p, GLint* size = 0x%0.8p, GLenum* type = 0x%0.8p, GLchar* name = 0x%0.8p)", program, index, bufsize, length, size, type, name); - if (bufsize < 0) - { - return gl::error(GL_INVALID_VALUE); - } gl::Context *context = gl::getNonLostContext(); - if (context) { + if (bufsize < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + gl::Program *programObject = context->getProgram(program); if (!programObject) { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } if (index >= (GLuint)programObject->getActiveUniformCount()) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } programObject->getActiveUniform(index, bufsize, length, size, type, name); @@ -1829,26 +1913,28 @@ void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* c EVENT("(GLuint program = %d, GLsizei maxcount = %d, GLsizei* count = 0x%0.8p, GLuint* shaders = 0x%0.8p)", program, maxcount, count, shaders); - if (maxcount < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (maxcount < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + gl::Program *programObject = context->getProgram(program); if (!programObject) { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -1856,33 +1942,34 @@ void __stdcall glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* c } } -int __stdcall glGetAttribLocation(GLuint program, const GLchar* name) +GLint __stdcall glGetAttribLocation(GLuint program, const GLchar* name) { EVENT("(GLuint program = %d, const GLchar* name = %s)", program, name); gl::Context *context = gl::getNonLostContext(); - if (context) { - gl::Program *programObject = context->getProgram(program); if (!programObject) { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION, -1); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return -1; } else { - return gl::error(GL_INVALID_VALUE, -1); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return -1; } } gl::ProgramBinary *programBinary = programObject->getProgramBinary(); if (!programObject->isLinked() || !programBinary) { - return gl::error(GL_INVALID_OPERATION, -1); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return -1; } return programBinary->getAttributeLocation(name); @@ -1896,7 +1983,6 @@ void __stdcall glGetBooleanv(GLenum pname, GLboolean* params) EVENT("(GLenum pname = 0x%X, GLboolean* params = 0x%0.8p)", pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { GLenum nativeType; @@ -1922,17 +2008,18 @@ void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!gl::ValidBufferTarget(context, target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } if (!gl::ValidBufferParameter(context, pname)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::Buffer *buffer = context->getState().getTargetBuffer(target); @@ -1940,7 +2027,8 @@ void __stdcall glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params if (!buffer) { // A null buffer means that "0" is bound to the requested buffer target - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } switch (pname) @@ -1986,21 +2074,21 @@ void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params) { EVENT("(GLuint fence = %d, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", fence, pname, params); - gl::Context *context = gl::getNonLostContext(); - if (context) { gl::FenceNV *fenceObject = context->getFenceNV(fence); if (fenceObject == NULL) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (fenceObject->isFence() != GL_TRUE) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } switch (pname) @@ -2009,7 +2097,9 @@ void __stdcall glGetFenceivNV(GLuint fence, GLenum pname, GLint *params) case GL_FENCE_CONDITION_NV: break; - default: return gl::error(GL_INVALID_ENUM); + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } params[0] = fenceObject->getFencei(pname); @@ -2021,7 +2111,6 @@ void __stdcall glGetFloatv(GLenum pname, GLfloat* params) EVENT("(GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { GLenum nativeType; @@ -2048,12 +2137,12 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac target, attachment, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!gl::ValidFramebufferTarget(target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } int clientVersion = context->getClientVersion(); @@ -2065,12 +2154,15 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: break; + case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: if (clientVersion < 3 && !context->getExtensions().sRGB) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } break; + case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: @@ -2081,11 +2173,14 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: if (clientVersion < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } // Determine if the attachment is a valid enum @@ -2098,7 +2193,8 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac case GL_DEPTH_STENCIL_ATTACHMENT: if (clientVersion < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } break; @@ -2110,7 +2206,8 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac if (attachment < GL_COLOR_ATTACHMENT0_EXT || (attachment - GL_COLOR_ATTACHMENT0_EXT) >= context->getCaps().maxColorAttachments) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } break; } @@ -2122,7 +2219,8 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac { if (clientVersion < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } switch (attachment) @@ -2131,8 +2229,10 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac case GL_DEPTH: case GL_STENCIL: break; + default: - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } } else @@ -2148,14 +2248,18 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac case GL_DEPTH_ATTACHMENT: case GL_STENCIL_ATTACHMENT: break; + case GL_DEPTH_STENCIL_ATTACHMENT: if (framebuffer->hasValidDepthStencil()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } break; + default: - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } } } @@ -2212,7 +2316,8 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: if (clientVersion < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = 0; break; @@ -2220,11 +2325,13 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac default: if (clientVersion < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } else { - gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } } } @@ -2243,7 +2350,8 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: if (attachmentObjectType != GL_RENDERBUFFER && attachmentObjectType != GL_TEXTURE) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = attachmentHandle; break; @@ -2251,7 +2359,8 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: if (attachmentObjectType != GL_TEXTURE) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = attachmentLevel; break; @@ -2259,7 +2368,8 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: if (attachmentObjectType != GL_TEXTURE) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = gl::IsCubemapTextureTarget(attachmentType) ? attachmentType : 0; break; @@ -2289,9 +2399,10 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac break; case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: - if (attachment == GL_DEPTH_STENCIL) + if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { - gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } *params = attachmentObject->getComponentType(); break; @@ -2303,7 +2414,8 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: if (attachmentObjectType != GL_TEXTURE) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = attachmentLayer; break; @@ -2335,7 +2447,6 @@ void __stdcall glGetIntegerv(GLenum pname, GLint* params) EVENT("(GLenum pname = 0x%X, GLint* params = 0x%0.8p)", pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { GLenum nativeType; @@ -2362,14 +2473,14 @@ void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params) EVENT("(GLuint program = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", program, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Program *programObject = context->getProgram(program); if (!programObject) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } if (context->getClientVersion() < 3) @@ -2381,7 +2492,8 @@ void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params) case GL_TRANSFORM_FEEDBACK_BUFFER_MODE: case GL_TRANSFORM_FEEDBACK_VARYINGS: case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } @@ -2432,8 +2544,10 @@ void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params) case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: *params = programObject->getTransformFeedbackVaryingMaxLength(); break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -2443,20 +2557,21 @@ void __stdcall glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* len EVENT("(GLuint program = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)", program, bufsize, length, infolog); - if (bufsize < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (bufsize < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + gl::Program *programObject = context->getProgram(program); if (!programObject) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } programObject->getInfoLog(bufsize, length, infolog); @@ -2468,12 +2583,12 @@ void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params) EVENT("GLenum target = 0x%X, GLenum pname = 0x%X, GLint *params = 0x%0.8p)", target, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidQueryType(context, target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } switch (pname) @@ -2483,7 +2598,8 @@ void __stdcall glGetQueryivEXT(GLenum target, GLenum pname, GLint *params) break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -2493,31 +2609,49 @@ void __stdcall glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint *params) EVENT("(GLuint id = %d, GLenum pname = 0x%X, GLuint *params = 0x%0.8p)", id, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Query *queryObject = context->getQuery(id, false, GL_NONE); if (!queryObject) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (context->getState().getActiveQueryId(queryObject->getType()) == id) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } switch(pname) { case GL_QUERY_RESULT_EXT: - params[0] = queryObject->getResult(); + { + gl::Error error = queryObject->getResult(params); + if (error.isError()) + { + context->recordError(error); + return; + } + } break; + case GL_QUERY_RESULT_AVAILABLE_EXT: - params[0] = queryObject->isResultAvailable(); + { + gl::Error error = queryObject->isResultAvailable(params); + if (error.isError()) + { + context->recordError(error); + return; + } + } break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -2527,17 +2661,18 @@ void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (target != GL_RENDERBUFFER) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } if (context->getState().getRenderbufferId() == 0) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getState().getRenderbufferId()); @@ -2553,15 +2688,19 @@ void __stdcall glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* case GL_RENDERBUFFER_ALPHA_SIZE: *params = renderbuffer->getAlphaSize(); break; case GL_RENDERBUFFER_DEPTH_SIZE: *params = renderbuffer->getDepthSize(); break; case GL_RENDERBUFFER_STENCIL_SIZE: *params = renderbuffer->getStencilSize(); break; + case GL_RENDERBUFFER_SAMPLES_ANGLE: if (!context->getExtensions().framebufferMultisample) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = renderbuffer->getSamples(); break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -2571,14 +2710,14 @@ void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params) EVENT("(GLuint shader = %d, GLenum pname = %d, GLint* params = 0x%0.8p)", shader, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Shader *shaderObject = context->getShader(shader); if (!shaderObject) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } switch (pname) @@ -2601,8 +2740,10 @@ void __stdcall glGetShaderiv(GLuint shader, GLenum pname, GLint* params) case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE: *params = shaderObject->getTranslatedSourceLength(); return; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -2612,20 +2753,21 @@ void __stdcall glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* lengt EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* infolog = 0x%0.8p)", shader, bufsize, length, infolog); - if (bufsize < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (bufsize < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + gl::Shader *shaderObject = context->getShader(shader); if (!shaderObject) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } shaderObject->getInfoLog(bufsize, length, infolog); @@ -2637,36 +2779,45 @@ void __stdcall glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontyp EVENT("(GLenum shadertype = 0x%X, GLenum precisiontype = 0x%X, GLint* range = 0x%0.8p, GLint* precision = 0x%0.8p)", shadertype, precisiontype, range, precision); - switch (shadertype) + gl::Context *context = gl::getNonLostContext(); + if (context) { - case GL_VERTEX_SHADER: - case GL_FRAGMENT_SHADER: - break; - default: - return gl::error(GL_INVALID_ENUM); - } - - switch (precisiontype) - { - case GL_LOW_FLOAT: - case GL_MEDIUM_FLOAT: - case GL_HIGH_FLOAT: - // Assume IEEE 754 precision - range[0] = 127; - range[1] = 127; - *precision = 23; - break; - case GL_LOW_INT: - case GL_MEDIUM_INT: - case GL_HIGH_INT: - // Some (most) hardware only supports single-precision floating-point numbers, - // which can accurately represent integers up to +/-16777216 - range[0] = 24; - range[1] = 24; - *precision = 0; - break; - default: - return gl::error(GL_INVALID_ENUM); + switch (shadertype) + { + case GL_VERTEX_SHADER: + case GL_FRAGMENT_SHADER: + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + + switch (precisiontype) + { + case GL_LOW_FLOAT: + case GL_MEDIUM_FLOAT: + case GL_HIGH_FLOAT: + // Assume IEEE 754 precision + range[0] = 127; + range[1] = 127; + *precision = 23; + break; + + case GL_LOW_INT: + case GL_MEDIUM_INT: + case GL_HIGH_INT: + // Some (most) hardware only supports single-precision floating-point numbers, + // which can accurately represent integers up to +/-16777216 + range[0] = 24; + range[1] = 24; + *precision = 0; + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } } } @@ -2675,20 +2826,21 @@ void __stdcall glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)", shader, bufsize, length, source); - if (bufsize < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (bufsize < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + gl::Shader *shaderObject = context->getShader(shader); if (!shaderObject) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } shaderObject->getSource(bufsize, length, source); @@ -2700,20 +2852,21 @@ void __stdcall glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, EVENT("(GLuint shader = %d, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, GLchar* source = 0x%0.8p)", shader, bufsize, length, source); - if (bufsize < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (bufsize < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + gl::Shader *shaderObject = context->getShader(shader); if (!shaderObject) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } shaderObject->getTranslatedSource(bufsize, length, source); @@ -2730,8 +2883,10 @@ const GLubyte* __stdcall glGetString(GLenum name) { case GL_VENDOR: return (GLubyte*)"Google Inc."; + case GL_RENDERER: return (GLubyte*)((context != NULL) ? context->getRendererString().c_str() : "ANGLE"); + case GL_VERSION: if (context->getClientVersion() == 2) { @@ -2741,6 +2896,7 @@ const GLubyte* __stdcall glGetString(GLenum name) { return (GLubyte*)"OpenGL ES 3.0 (ANGLE " ANGLE_VERSION_STRING ")"; } + case GL_SHADING_LANGUAGE_VERSION: if (context->getClientVersion() == 2) { @@ -2750,10 +2906,16 @@ const GLubyte* __stdcall glGetString(GLenum name) { return (GLubyte*)"OpenGL ES GLSL ES 3.00 (ANGLE " ANGLE_VERSION_STRING ")"; } + case GL_EXTENSIONS: return (GLubyte*)((context != NULL) ? context->getExtensionString().c_str() : ""); + default: - return gl::error(GL_INVALID_ENUM, (GLubyte*)NULL); + if (context) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + } + return NULL; } } @@ -2762,14 +2924,14 @@ void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", target, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Texture *texture = context->getTargetTexture(target); if (!texture) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } switch (pname) @@ -2789,7 +2951,8 @@ void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) case GL_TEXTURE_WRAP_R: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLfloat)texture->getSamplerState().wrapR; break; @@ -2800,7 +2963,8 @@ void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) case GL_TEXTURE_IMMUTABLE_LEVELS: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLfloat)texture->immutableLevelCount(); break; @@ -2810,68 +2974,79 @@ void __stdcall glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) case GL_TEXTURE_MAX_ANISOTROPY_EXT: if (!context->getExtensions().textureFilterAnisotropic) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLfloat)texture->getSamplerState().maxAnisotropy; break; case GL_TEXTURE_SWIZZLE_R: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLfloat)texture->getSamplerState().swizzleRed; break; case GL_TEXTURE_SWIZZLE_G: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLfloat)texture->getSamplerState().swizzleGreen; break; case GL_TEXTURE_SWIZZLE_B: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLfloat)texture->getSamplerState().swizzleBlue; break; case GL_TEXTURE_SWIZZLE_A: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLfloat)texture->getSamplerState().swizzleAlpha; break; case GL_TEXTURE_BASE_LEVEL: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLfloat)texture->getSamplerState().baseLevel; break; case GL_TEXTURE_MAX_LEVEL: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLfloat)texture->getSamplerState().maxLevel; break; case GL_TEXTURE_MIN_LOD: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = texture->getSamplerState().minLod; break; case GL_TEXTURE_MAX_LOD: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = texture->getSamplerState().maxLod; break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -2881,14 +3056,14 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Texture *texture = context->getTargetTexture(target); if (!texture) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } switch (pname) @@ -2908,7 +3083,8 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) case GL_TEXTURE_WRAP_R: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = texture->getSamplerState().wrapR; break; @@ -2919,7 +3095,8 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) case GL_TEXTURE_IMMUTABLE_LEVELS: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = texture->immutableLevelCount(); break; @@ -2929,68 +3106,79 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) case GL_TEXTURE_MAX_ANISOTROPY_EXT: if (!context->getExtensions().textureFilterAnisotropic) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLint)texture->getSamplerState().maxAnisotropy; break; case GL_TEXTURE_SWIZZLE_R: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = texture->getSamplerState().swizzleRed; break; case GL_TEXTURE_SWIZZLE_G: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = texture->getSamplerState().swizzleGreen; break; case GL_TEXTURE_SWIZZLE_B: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = texture->getSamplerState().swizzleBlue; break; case GL_TEXTURE_SWIZZLE_A: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = texture->getSamplerState().swizzleAlpha; break; case GL_TEXTURE_BASE_LEVEL: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = texture->getSamplerState().baseLevel; break; case GL_TEXTURE_MAX_LEVEL: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = texture->getSamplerState().maxLevel; break; case GL_TEXTURE_MIN_LOD: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLint)texture->getSamplerState().minLod; break; case GL_TEXTURE_MAX_LOD: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *params = (GLint)texture->getSamplerState().maxLod; break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -3000,37 +3188,20 @@ void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSiz EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)", program, location, bufSize, params); - if (bufSize < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { - if (program == 0) + if (!ValidateGetnUniformfvEXT(context, program, location, bufSize, params)) { - return gl::error(GL_INVALID_VALUE); + return; } gl::Program *programObject = context->getProgram(program); - - if (!programObject || !programObject->isLinked()) - { - return gl::error(GL_INVALID_OPERATION); - } - + ASSERT(programObject); gl::ProgramBinary *programBinary = programObject->getProgramBinary(); - if (!programBinary) - { - return gl::error(GL_INVALID_OPERATION); - } + ASSERT(programBinary); - if (!programBinary->getUniformfv(location, &bufSize, params)) - { - return gl::error(GL_INVALID_OPERATION); - } + programBinary->getUniformfv(location, params); } } @@ -3039,31 +3210,19 @@ void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params) EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params); gl::Context *context = gl::getNonLostContext(); - if (context) { - if (program == 0) + if (!ValidateGetUniformfv(context, program, location, params)) { - return gl::error(GL_INVALID_VALUE); + return; } gl::Program *programObject = context->getProgram(program); - - if (!programObject || !programObject->isLinked()) - { - return gl::error(GL_INVALID_OPERATION); - } - + ASSERT(programObject); gl::ProgramBinary *programBinary = programObject->getProgramBinary(); - if (!programBinary) - { - return gl::error(GL_INVALID_OPERATION); - } + ASSERT(programBinary); - if (!programBinary->getUniformfv(location, NULL, params)) - { - return gl::error(GL_INVALID_OPERATION); - } + programBinary->getUniformfv(location, params); } } @@ -3072,37 +3231,20 @@ void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSiz EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)", program, location, bufSize, params); - if (bufSize < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { - if (program == 0) + if (!ValidateGetnUniformivEXT(context, program, location, bufSize, params)) { - return gl::error(GL_INVALID_VALUE); + return; } gl::Program *programObject = context->getProgram(program); - - if (!programObject || !programObject->isLinked()) - { - return gl::error(GL_INVALID_OPERATION); - } - + ASSERT(programObject); gl::ProgramBinary *programBinary = programObject->getProgramBinary(); - if (!programBinary) - { - return gl::error(GL_INVALID_OPERATION); - } + ASSERT(programBinary); - if (!programBinary->getUniformiv(location, &bufSize, params)) - { - return gl::error(GL_INVALID_OPERATION); - } + programBinary->getUniformiv(location, params); } } @@ -3111,65 +3253,55 @@ void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params) EVENT("(GLuint program = %d, GLint location = %d, GLint* params = 0x%0.8p)", program, location, params); gl::Context *context = gl::getNonLostContext(); - if (context) { - if (program == 0) + if (!ValidateGetUniformiv(context, program, location, params)) { - return gl::error(GL_INVALID_VALUE); + return; } gl::Program *programObject = context->getProgram(program); - - if (!programObject || !programObject->isLinked()) - { - return gl::error(GL_INVALID_OPERATION); - } - + ASSERT(programObject); gl::ProgramBinary *programBinary = programObject->getProgramBinary(); - if (!programBinary) - { - return gl::error(GL_INVALID_OPERATION); - } + ASSERT(programBinary); - if (!programBinary->getUniformiv(location, NULL, params)) - { - return gl::error(GL_INVALID_OPERATION); - } + programBinary->getUniformiv(location, params); } } -int __stdcall glGetUniformLocation(GLuint program, const GLchar* name) +GLint __stdcall glGetUniformLocation(GLuint program, const GLchar* name) { EVENT("(GLuint program = %d, const GLchar* name = 0x%0.8p)", program, name); gl::Context *context = gl::getNonLostContext(); - - if (strstr(name, "gl_") == name) - { - return -1; - } - if (context) { + if (strstr(name, "gl_") == name) + { + return -1; + } + gl::Program *programObject = context->getProgram(program); if (!programObject) { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION, -1); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return -1; } else { - return gl::error(GL_INVALID_VALUE, -1); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return -1; } } gl::ProgramBinary *programBinary = programObject->getProgramBinary(); if (!programObject->isLinked() || !programBinary) { - return gl::error(GL_INVALID_OPERATION, -1); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return -1; } return programBinary->getUniformLocation(name); @@ -3183,16 +3315,16 @@ void __stdcall glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", index, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (index >= gl::MAX_VERTEX_ATTRIBS) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index); - if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion())) + if (!gl::ValidateGetVertexAttribParameters(context, pname)) { return; } @@ -3217,17 +3349,17 @@ void __stdcall glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", index, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (index >= gl::MAX_VERTEX_ATTRIBS) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index); - if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion())) + if (!gl::ValidateGetVertexAttribParameters(context, pname)) { return; } @@ -3253,17 +3385,18 @@ void __stdcall glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** po EVENT("(GLuint index = %d, GLenum pname = 0x%X, GLvoid** pointer = 0x%0.8p)", index, pname, pointer); gl::Context *context = gl::getNonLostContext(); - if (context) { if (index >= gl::MAX_VERTEX_ATTRIBS) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } *pointer = const_cast<GLvoid*>(context->getState().getVertexAttribPointer(index)); @@ -3274,27 +3407,35 @@ void __stdcall glHint(GLenum target, GLenum mode) { EVENT("(GLenum target = 0x%X, GLenum mode = 0x%X)", target, mode); - switch (mode) - { - case GL_FASTEST: - case GL_NICEST: - case GL_DONT_CARE: - break; - default: - return gl::error(GL_INVALID_ENUM); - } - gl::Context *context = gl::getNonLostContext(); - switch (target) + if (context) { - case GL_GENERATE_MIPMAP_HINT: - if (context) context->getState().setGenerateMipmapHint(mode); - break; - case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: - if (context) context->getState().setFragmentShaderDerivativeHint(mode); - break; - default: - return gl::error(GL_INVALID_ENUM); + switch (mode) + { + case GL_FASTEST: + case GL_NICEST: + case GL_DONT_CARE: + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + + switch (target) + { + case GL_GENERATE_MIPMAP_HINT: + context->getState().setGenerateMipmapHint(mode); + break; + + case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: + context->getState().setFragmentShaderDerivativeHint(mode); + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } } } @@ -3303,7 +3444,6 @@ GLboolean __stdcall glIsBuffer(GLuint buffer) EVENT("(GLuint buffer = %d)", buffer); gl::Context *context = gl::getNonLostContext(); - if (context && buffer) { gl::Buffer *bufferObject = context->getBuffer(buffer); @@ -3322,12 +3462,12 @@ GLboolean __stdcall glIsEnabled(GLenum cap) EVENT("(GLenum cap = 0x%X)", cap); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidCap(context, cap)) { - return gl::error(GL_INVALID_ENUM, false); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return GL_FALSE; } return context->getState().getEnableFeature(cap); @@ -3341,7 +3481,6 @@ GLboolean __stdcall glIsFenceNV(GLuint fence) EVENT("(GLuint fence = %d)", fence); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::FenceNV *fenceObject = context->getFenceNV(fence); @@ -3362,7 +3501,6 @@ GLboolean __stdcall glIsFramebuffer(GLuint framebuffer) EVENT("(GLuint framebuffer = %d)", framebuffer); gl::Context *context = gl::getNonLostContext(); - if (context && framebuffer) { gl::Framebuffer *framebufferObject = context->getFramebuffer(framebuffer); @@ -3381,7 +3519,6 @@ GLboolean __stdcall glIsProgram(GLuint program) EVENT("(GLuint program = %d)", program); gl::Context *context = gl::getNonLostContext(); - if (context && program) { gl::Program *programObject = context->getProgram(program); @@ -3400,7 +3537,6 @@ GLboolean __stdcall glIsQueryEXT(GLuint id) EVENT("(GLuint id = %d)", id); gl::Context *context = gl::getNonLostContext(); - if (context) { return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE; @@ -3414,7 +3550,6 @@ GLboolean __stdcall glIsRenderbuffer(GLuint renderbuffer) EVENT("(GLuint renderbuffer = %d)", renderbuffer); gl::Context *context = gl::getNonLostContext(); - if (context && renderbuffer) { gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer); @@ -3433,7 +3568,6 @@ GLboolean __stdcall glIsShader(GLuint shader) EVENT("(GLuint shader = %d)", shader); gl::Context *context = gl::getNonLostContext(); - if (context && shader) { gl::Shader *shaderObject = context->getShader(shader); @@ -3452,7 +3586,6 @@ GLboolean __stdcall glIsTexture(GLuint texture) EVENT("(GLuint texture = %d)", texture); gl::Context *context = gl::getNonLostContext(); - if (context && texture) { gl::Texture *textureObject = context->getTexture(texture); @@ -3470,15 +3603,15 @@ void __stdcall glLineWidth(GLfloat width) { EVENT("(GLfloat width = %f)", width); - if (width <= 0.0f) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (width <= 0.0f) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + context->getState().setLineWidth(width); } } @@ -3488,7 +3621,6 @@ void __stdcall glLinkProgram(GLuint program) EVENT("(GLuint program = %d)", program); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Program *programObject = context->getProgram(program); @@ -3497,11 +3629,13 @@ void __stdcall glLinkProgram(GLuint program) { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -3514,7 +3648,6 @@ void __stdcall glPixelStorei(GLenum pname, GLint param) EVENT("(GLenum pname = 0x%X, GLint param = %d)", pname, param); gl::Context *context = gl::getNonLostContext(); - if (context) { switch (pname) @@ -3522,7 +3655,8 @@ void __stdcall glPixelStorei(GLenum pname, GLint param) case GL_UNPACK_ALIGNMENT: if (param != 1 && param != 2 && param != 4 && param != 8) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } context->getState().setUnpackAlignment(param); @@ -3531,7 +3665,8 @@ void __stdcall glPixelStorei(GLenum pname, GLint param) case GL_PACK_ALIGNMENT: if (param != 1 && param != 2 && param != 4 && param != 8) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } context->getState().setPackAlignment(param); @@ -3551,13 +3686,15 @@ void __stdcall glPixelStorei(GLenum pname, GLint param) case GL_PACK_SKIP_PIXELS: if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } UNIMPLEMENTED(); break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -3567,7 +3704,6 @@ void __stdcall glPolygonOffset(GLfloat factor, GLfloat units) EVENT("(GLfloat factor = %f, GLfloat units = %f)", factor, units); gl::Context *context = gl::getNonLostContext(); - if (context) { context->getState().setPolygonOffsetParams(factor, units); @@ -3582,22 +3718,27 @@ void __stdcall glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height, "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufSize = 0x%d, GLvoid *data = 0x%0.8p)", x, y, width, height, format, type, bufSize, data); - if (width < 0 || height < 0 || bufSize < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (width < 0 || height < 0 || bufSize < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + if (!gl::ValidateReadPixelsParameters(context, x, y, width, height, format, type, &bufSize, data)) { return; } - context->readPixels(x, y, width, height, format, type, &bufSize, data); + gl::Error error = context->readPixels(x, y, width, height, format, type, &bufSize, data); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -3608,22 +3749,27 @@ void __stdcall glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, "GLenum format = 0x%X, GLenum type = 0x%X, GLvoid* pixels = 0x%0.8p)", x, y, width, height, format, type, pixels); - if (width < 0 || height < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (width < 0 || height < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + if (!gl::ValidateReadPixelsParameters(context, x, y, width, height, format, type, NULL, pixels)) { return; } - context->readPixels(x, y, width, height, format, type, NULL, pixels); + gl::Error error = context->readPixels(x, y, width, height, format, type, NULL, pixels); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -3631,7 +3777,12 @@ void __stdcall glReleaseShaderCompiler(void) { EVENT("()"); - gl::Shader::releaseCompiler(); + gl::Context *context = gl::getNonLostContext(); + + if (context) + { + context->releaseShaderCompiler(); + } } void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) @@ -3640,7 +3791,6 @@ void __stdcall glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samp target, samples, internalformat, width, height); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat, @@ -3674,20 +3824,21 @@ void __stdcall glSetFenceNV(GLuint fence, GLenum condition) { EVENT("(GLuint fence = %d, GLenum condition = 0x%X)", fence, condition); - if (condition != GL_ALL_COMPLETED_NV) - { - return gl::error(GL_INVALID_ENUM); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (condition != GL_ALL_COMPLETED_NV) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + gl::FenceNV *fenceObject = context->getFenceNV(fence); if (fenceObject == NULL) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } fenceObject->setFence(condition); @@ -3698,15 +3849,15 @@ void __stdcall glScissor(GLint x, GLint y, GLsizei width, GLsizei height) { EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height); - if (width < 0 || height < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context* context = gl::getNonLostContext(); - if (context) { + if (width < 0 || height < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + context->getState().setScissorParams(x, y, width, height); } } @@ -3717,8 +3868,19 @@ void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryfor "const GLvoid* binary = 0x%0.8p, GLsizei length = %d)", n, shaders, binaryformat, binary, length); - // No binary shader formats are supported. - return gl::error(GL_INVALID_ENUM); + gl::Context* context = gl::getNonLostContext(); + if (context) + { + const std::vector<GLenum> &shaderBinaryFormats = context->getCaps().shaderBinaryFormats; + if (std::find(shaderBinaryFormats.begin(), shaderBinaryFormats.end(), binaryformat) == shaderBinaryFormats.end()) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + + // No binary shader formats are supported. + UNIMPLEMENTED(); + } } void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length) @@ -3726,26 +3888,28 @@ void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* EVENT("(GLuint shader = %d, GLsizei count = %d, const GLchar** string = 0x%0.8p, const GLint* length = 0x%0.8p)", shader, count, string, length); - if (count < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (count < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + gl::Shader *shaderObject = context->getShader(shader); if (!shaderObject) { if (context->getProgram(shader)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -3762,35 +3926,38 @@ void __stdcall glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint { EVENT("(GLenum face = 0x%X, GLenum func = 0x%X, GLint ref = %d, GLuint mask = %d)", face, func, ref, mask); - switch (face) + gl::Context *context = gl::getNonLostContext(); + if (context) { - case GL_FRONT: - case GL_BACK: - case GL_FRONT_AND_BACK: - break; - default: - return gl::error(GL_INVALID_ENUM); - } + switch (face) + { + case GL_FRONT: + case GL_BACK: + case GL_FRONT_AND_BACK: + break; - switch (func) - { - case GL_NEVER: - case GL_ALWAYS: - case GL_LESS: - case GL_LEQUAL: - case GL_EQUAL: - case GL_GEQUAL: - case GL_GREATER: - case GL_NOTEQUAL: - break; - default: - return gl::error(GL_INVALID_ENUM); - } + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - gl::Context *context = gl::getNonLostContext(); + switch (func) + { + case GL_NEVER: + case GL_ALWAYS: + case GL_LESS: + case GL_LEQUAL: + case GL_EQUAL: + case GL_GEQUAL: + case GL_GREATER: + case GL_NOTEQUAL: + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - if (context) - { if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { context->getState().setStencilParams(func, ref, mask); @@ -3812,20 +3979,21 @@ void __stdcall glStencilMaskSeparate(GLenum face, GLuint mask) { EVENT("(GLenum face = 0x%X, GLuint mask = %d)", face, mask); - switch (face) - { - case GL_FRONT: - case GL_BACK: - case GL_FRONT_AND_BACK: - break; - default: - return gl::error(GL_INVALID_ENUM); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + switch (face) + { + case GL_FRONT: + case GL_BACK: + case GL_FRONT_AND_BACK: + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { context->getState().setStencilWritemask(mask); @@ -3848,65 +4016,72 @@ void __stdcall glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenu EVENT("(GLenum face = 0x%X, GLenum fail = 0x%X, GLenum zfail = 0x%X, GLenum zpas = 0x%Xs)", face, fail, zfail, zpass); - switch (face) + gl::Context *context = gl::getNonLostContext(); + if (context) { - case GL_FRONT: - case GL_BACK: - case GL_FRONT_AND_BACK: - break; - default: - return gl::error(GL_INVALID_ENUM); - } + switch (face) + { + case GL_FRONT: + case GL_BACK: + case GL_FRONT_AND_BACK: + break; - switch (fail) - { - case GL_ZERO: - case GL_KEEP: - case GL_REPLACE: - case GL_INCR: - case GL_DECR: - case GL_INVERT: - case GL_INCR_WRAP: - case GL_DECR_WRAP: - break; - default: - return gl::error(GL_INVALID_ENUM); - } + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - switch (zfail) - { - case GL_ZERO: - case GL_KEEP: - case GL_REPLACE: - case GL_INCR: - case GL_DECR: - case GL_INVERT: - case GL_INCR_WRAP: - case GL_DECR_WRAP: - break; - default: - return gl::error(GL_INVALID_ENUM); - } + switch (fail) + { + case GL_ZERO: + case GL_KEEP: + case GL_REPLACE: + case GL_INCR: + case GL_DECR: + case GL_INVERT: + case GL_INCR_WRAP: + case GL_DECR_WRAP: + break; - switch (zpass) - { - case GL_ZERO: - case GL_KEEP: - case GL_REPLACE: - case GL_INCR: - case GL_DECR: - case GL_INVERT: - case GL_INCR_WRAP: - case GL_DECR_WRAP: - break; - default: - return gl::error(GL_INVALID_ENUM); - } + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - gl::Context *context = gl::getNonLostContext(); + switch (zfail) + { + case GL_ZERO: + case GL_KEEP: + case GL_REPLACE: + case GL_INCR: + case GL_DECR: + case GL_INVERT: + case GL_INCR_WRAP: + case GL_DECR_WRAP: + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } + + switch (zpass) + { + case GL_ZERO: + case GL_KEEP: + case GL_REPLACE: + case GL_INCR: + case GL_DECR: + case GL_INVERT: + case GL_INCR_WRAP: + case GL_DECR_WRAP: + break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - if (context) - { if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { context->getState().setStencilOperations(fail, zfail, zpass); @@ -3924,19 +4099,20 @@ GLboolean __stdcall glTestFenceNV(GLuint fence) EVENT("(GLuint fence = %d)", fence); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::FenceNV *fenceObject = context->getFenceNV(fence); if (fenceObject == NULL) { - return gl::error(GL_INVALID_OPERATION, GL_TRUE); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_TRUE; } if (fenceObject->isFence() != GL_TRUE) { - return gl::error(GL_INVALID_OPERATION, GL_TRUE); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_TRUE; } return fenceObject->testFence(); @@ -3953,7 +4129,6 @@ void __stdcall glTexImage2D(GLenum target, GLint level, GLint internalformat, GL target, level, internalformat, width, height, border, format, type, pixels); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3 && @@ -4024,7 +4199,6 @@ void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param) EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %f)", target, pname, param); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateTexParamParameters(context, pname, static_cast<GLint>(param))) @@ -4036,7 +4210,8 @@ void __stdcall glTexParameterf(GLenum target, GLenum pname, GLfloat param) if (!texture) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } switch (pname) @@ -4073,7 +4248,6 @@ void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param) EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint param = %d)", target, pname, param); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateTexParamParameters(context, pname, param)) @@ -4085,7 +4259,8 @@ void __stdcall glTexParameteri(GLenum target, GLenum pname, GLint param) if (!texture) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } switch (pname) @@ -4123,12 +4298,12 @@ void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalf target, levels, internalformat, width, height); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!context->getExtensions().textureStorage) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (context->getClientVersion() < 3 && @@ -4160,7 +4335,8 @@ void __stdcall glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalf break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -4174,7 +4350,6 @@ void __stdcall glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint target, level, xoffset, yoffset, width, height, format, type, pixels); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3 && @@ -4234,7 +4409,6 @@ void __stdcall glUniform1fv(GLint location, GLsizei count, const GLfloat* v) EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_FLOAT, location, count)) @@ -4257,7 +4431,6 @@ void __stdcall glUniform1iv(GLint location, GLsizei count, const GLint* v) EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_INT, location, count)) @@ -4282,7 +4455,6 @@ void __stdcall glUniform2fv(GLint location, GLsizei count, const GLfloat* v) EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_FLOAT_VEC2, location, count)) @@ -4307,7 +4479,6 @@ void __stdcall glUniform2iv(GLint location, GLsizei count, const GLint* v) EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_INT_VEC2, location, count)) @@ -4332,7 +4503,6 @@ void __stdcall glUniform3fv(GLint location, GLsizei count, const GLfloat* v) EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_FLOAT_VEC3, location, count)) @@ -4357,7 +4527,6 @@ void __stdcall glUniform3iv(GLint location, GLsizei count, const GLint* v) EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_INT_VEC3, location, count)) @@ -4382,7 +4551,6 @@ void __stdcall glUniform4fv(GLint location, GLsizei count, const GLfloat* v) EVENT("(GLint location = %d, GLsizei count = %d, const GLfloat* v = 0x%0.8p)", location, count, v); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_FLOAT_VEC4, location, count)) @@ -4407,7 +4575,6 @@ void __stdcall glUniform4iv(GLint location, GLsizei count, const GLint* v) EVENT("(GLint location = %d, GLsizei count = %d, const GLint* v = 0x%0.8p)", location, count, v); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_INT_VEC4, location, count)) @@ -4426,7 +4593,6 @@ void __stdcall glUniformMatrix2fv(GLint location, GLsizei count, GLboolean trans location, count, transpose, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose)) @@ -4445,7 +4611,6 @@ void __stdcall glUniformMatrix3fv(GLint location, GLsizei count, GLboolean trans location, count, transpose, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose)) @@ -4464,7 +4629,6 @@ void __stdcall glUniformMatrix4fv(GLint location, GLsizei count, GLboolean trans location, count, transpose, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose)) @@ -4482,7 +4646,6 @@ void __stdcall glUseProgram(GLuint program) EVENT("(GLuint program = %d)", program); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Program *programObject = context->getProgram(program); @@ -4491,17 +4654,20 @@ void __stdcall glUseProgram(GLuint program) { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } if (program != 0 && !programObject->isLinked()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } context->useProgram(program); @@ -4513,7 +4679,6 @@ void __stdcall glValidateProgram(GLuint program) EVENT("(GLuint program = %d)", program); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Program *programObject = context->getProgram(program); @@ -4522,15 +4687,17 @@ void __stdcall glValidateProgram(GLuint program) { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } - programObject->validate(); + programObject->validate(context->getCaps()); } } @@ -4538,15 +4705,15 @@ void __stdcall glVertexAttrib1f(GLuint index, GLfloat x) { EVENT("(GLuint index = %d, GLfloat x = %f)", index, x); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + GLfloat vals[4] = { x, 0, 0, 1 }; context->getState().setVertexAttribf(index, vals); } @@ -4556,15 +4723,15 @@ void __stdcall glVertexAttrib1fv(GLuint index, const GLfloat* values) { EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + GLfloat vals[4] = { values[0], 0, 0, 1 }; context->getState().setVertexAttribf(index, vals); } @@ -4574,15 +4741,15 @@ void __stdcall glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y) { EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f)", index, x, y); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + GLfloat vals[4] = { x, y, 0, 1 }; context->getState().setVertexAttribf(index, vals); } @@ -4592,15 +4759,15 @@ void __stdcall glVertexAttrib2fv(GLuint index, const GLfloat* values) { EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + GLfloat vals[4] = { values[0], values[1], 0, 1 }; context->getState().setVertexAttribf(index, vals); } @@ -4610,15 +4777,15 @@ void __stdcall glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z) { EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f)", index, x, y, z); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + GLfloat vals[4] = { x, y, z, 1 }; context->getState().setVertexAttribf(index, vals); } @@ -4628,15 +4795,15 @@ void __stdcall glVertexAttrib3fv(GLuint index, const GLfloat* values) { EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + GLfloat vals[4] = { values[0], values[1], values[2], 1 }; context->getState().setVertexAttribf(index, vals); } @@ -4646,15 +4813,15 @@ void __stdcall glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, G { EVENT("(GLuint index = %d, GLfloat x = %f, GLfloat y = %f, GLfloat z = %f, GLfloat w = %f)", index, x, y, z, w); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + GLfloat vals[4] = { x, y, z, w }; context->getState().setVertexAttribf(index, vals); } @@ -4664,15 +4831,15 @@ void __stdcall glVertexAttrib4fv(GLuint index, const GLfloat* values) { EVENT("(GLuint index = %d, const GLfloat* values = 0x%0.8p)", index, values); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + context->getState().setVertexAttribf(index, values); } } @@ -4681,15 +4848,15 @@ void __stdcall glVertexAttribDivisorANGLE(GLuint index, GLuint divisor) { EVENT("(GLuint index = %d, GLuint divisor = %d)", index, divisor); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + context->setVertexAttribDivisor(index, divisor); } } @@ -4700,63 +4867,68 @@ void __stdcall glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLbo "GLboolean normalized = %u, GLsizei stride = %d, const GLvoid* ptr = 0x%0.8p)", index, size, type, normalized, stride, ptr); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - - if (size < 1 || size > 4) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - - switch (type) + if (context) { - case GL_BYTE: - case GL_UNSIGNED_BYTE: - case GL_SHORT: - case GL_UNSIGNED_SHORT: - case GL_FIXED: - case GL_FLOAT: - break; - case GL_HALF_FLOAT: - case GL_INT: - case GL_UNSIGNED_INT: - case GL_INT_2_10_10_10_REV: - case GL_UNSIGNED_INT_2_10_10_10_REV: - if (context && context->getClientVersion() < 3) + if (index >= gl::MAX_VERTEX_ATTRIBS) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } - else + + if (size < 1 || size > 4) { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + + switch (type) + { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_FIXED: + case GL_FLOAT: + break; + + case GL_HALF_FLOAT: + case GL_INT: + case GL_UNSIGNED_INT: + case GL_INT_2_10_10_10_REV: + case GL_UNSIGNED_INT_2_10_10_10_REV: + if (context->getClientVersion() < 3) + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } break; + + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } - default: - return gl::error(GL_INVALID_ENUM); - } - if (stride < 0) - { - return gl::error(GL_INVALID_VALUE); - } + if (stride < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } - if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4) - { - return gl::error(GL_INVALID_OPERATION); - } + if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4) + { + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; + } - if (context) - { // [OpenGL ES 3.0.2] Section 2.8 page 24: // An INVALID_OPERATION error is generated when a non-zero vertex array object // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point, // and the pointer argument is not NULL. if (context->getState().getVertexArray()->id() != 0 && context->getState().getArrayBufferId() == 0 && ptr != NULL) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } context->getState().setVertexAttribState(index, context->getState().getTargetBuffer(GL_ARRAY_BUFFER), size, type, @@ -4768,15 +4940,15 @@ void __stdcall glViewport(GLint x, GLint y, GLsizei width, GLsizei height) { EVENT("(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d)", x, y, width, height); - if (width < 0 || height < 0) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { + if (width < 0 || height < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + context->getState().setViewportParams(x, y, width, height); } } @@ -4788,12 +4960,12 @@ void __stdcall glReadBuffer(GLenum mode) EVENT("(GLenum mode = 0x%X)", mode); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // glReadBuffer @@ -4807,12 +4979,12 @@ void __stdcall glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsize "const GLvoid* indices = 0x%0.8p)", mode, start, end, count, type, indices); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // glDrawRangeElements @@ -4828,12 +5000,12 @@ void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GL target, level, internalformat, width, height, depth, border, format, type, pixels); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // validateES3TexImageFormat sets the error code if there is an error @@ -4860,7 +5032,8 @@ void __stdcall glTexImage3D(GLenum target, GLint level, GLint internalformat, GL break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -4873,12 +5046,12 @@ void __stdcall glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // validateES3TexImageFormat sets the error code if there is an error @@ -4912,7 +5085,8 @@ void __stdcall glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -4924,12 +5098,12 @@ void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GL target, level, xoffset, yoffset, zoffset, x, y, width, height); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!ValidateES3CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset, yoffset, zoffset, @@ -4951,7 +5125,8 @@ void __stdcall glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GL break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } texture->copySubImage(target, level, xoffset, yoffset, zoffset, x, y, width, height, framebuffer); @@ -4966,17 +5141,19 @@ void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum interna target, level, internalformat, width, height, depth, border, imageSize, data); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(internalformat, GL_UNSIGNED_BYTE, width, height)) + const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalformat); + if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height)) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } // validateES3TexImageFormat sets the error code if there is an error @@ -5003,7 +5180,8 @@ void __stdcall glCompressedTexImage3D(GLenum target, GLint level, GLenum interna break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -5016,22 +5194,25 @@ void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffs target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - if (imageSize < 0 || imageSize != (GLsizei)gl::GetBlockSize(format, GL_UNSIGNED_BYTE, width, height)) + const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(format); + if (imageSize < 0 || static_cast<GLuint>(imageSize) != formatInfo.computeBlockSize(GL_UNSIGNED_BYTE, width, height)) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } if (!data) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } // validateES3TexImageFormat sets the error code if there is an error @@ -5065,8 +5246,9 @@ void __stdcall glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffs } break; - default: - return gl::error(GL_INVALID_ENUM); + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -5076,17 +5258,18 @@ void __stdcall glGenQueries(GLsizei n, GLuint* ids) EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (n < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } for (GLsizei i = 0; i < n; i++) @@ -5101,17 +5284,18 @@ void __stdcall glDeleteQueries(GLsizei n, const GLuint* ids) EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (n < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } for (GLsizei i = 0; i < n; i++) @@ -5126,12 +5310,12 @@ GLboolean __stdcall glIsQuery(GLuint id) EVENT("(GLuint id = %u)", id); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, GL_FALSE); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_FALSE; } return (context->getQuery(id, false, GL_NONE) != NULL) ? GL_TRUE : GL_FALSE; @@ -5145,19 +5329,25 @@ void __stdcall glBeginQuery(GLenum target, GLuint id) EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!ValidateBeginQuery(context, target, id)) { return; } - context->beginQuery(target, id); + + gl::Error error = context->beginQuery(target, id); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -5166,12 +5356,12 @@ void __stdcall glEndQuery(GLenum target) EVENT("(GLenum target = 0x%X)", target); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!ValidateEndQuery(context, target)) @@ -5179,7 +5369,12 @@ void __stdcall glEndQuery(GLenum target) return; } - context->endQuery(target); + gl::Error error = context->endQuery(target); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -5188,17 +5383,18 @@ void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params) EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", target, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!ValidQueryType(context, target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } switch (pname) @@ -5208,7 +5404,8 @@ void __stdcall glGetQueryiv(GLenum target, GLenum pname, GLint* params) break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -5218,36 +5415,55 @@ void __stdcall glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params) EVENT("(GLuint id = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", id, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } gl::Query *queryObject = context->getQuery(id, false, GL_NONE); if (!queryObject) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (context->getState().getActiveQueryId(queryObject->getType()) == id) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } switch(pname) { - case GL_QUERY_RESULT: - params[0] = queryObject->getResult(); + case GL_QUERY_RESULT_EXT: + { + gl::Error error = queryObject->getResult(params); + if (error.isError()) + { + context->recordError(error); + return; + } + } break; - case GL_QUERY_RESULT_AVAILABLE: - params[0] = queryObject->isResultAvailable(); + + case GL_QUERY_RESULT_AVAILABLE_EXT: + { + gl::Error error = queryObject->isResultAvailable(params); + if (error.isError()) + { + context->recordError(error); + return; + } + } break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -5257,12 +5473,12 @@ GLboolean __stdcall glUnmapBuffer(GLenum target) EVENT("(GLenum target = 0x%X)", target); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, GL_FALSE); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_FALSE; } return glUnmapBufferOES(target); @@ -5276,12 +5492,12 @@ void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params) EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } glGetBufferPointervOES(target, pname, params); @@ -5291,12 +5507,12 @@ void __stdcall glGetBufferPointerv(GLenum target, GLenum pname, GLvoid** params) void __stdcall glDrawBuffers(GLsizei n, const GLenum* bufs) { gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } glDrawBuffersEXT(n, bufs); @@ -5309,7 +5525,6 @@ void __stdcall glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean tra location, count, transpose, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x3, location, count, transpose)) @@ -5328,7 +5543,6 @@ void __stdcall glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean tra location, count, transpose, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x2, location, count, transpose)) @@ -5347,7 +5561,6 @@ void __stdcall glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean tra location, count, transpose, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniformMatrix(context, GL_FLOAT_MAT2x4, location, count, transpose)) @@ -5366,7 +5579,6 @@ void __stdcall glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean tra location, count, transpose, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x2, location, count, transpose)) @@ -5385,7 +5597,6 @@ void __stdcall glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean tra location, count, transpose, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniformMatrix(context, GL_FLOAT_MAT3x4, location, count, transpose)) @@ -5404,7 +5615,6 @@ void __stdcall glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean tra location, count, transpose, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniformMatrix(context, GL_FLOAT_MAT4x3, location, count, transpose)) @@ -5428,7 +5638,8 @@ void __stdcall glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint sr { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1, @@ -5449,12 +5660,12 @@ void __stdcall glRenderbufferStorageMultisample(GLenum target, GLsizei samples, target, samples, internalformat, width, height); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!ValidateRenderbufferStorageParameters(context, target, samples, internalformat, @@ -5473,7 +5684,6 @@ void __stdcall glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuin target, attachment, texture, level, layer); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateFramebufferTextureLayer(context, target, attachment, texture, @@ -5511,12 +5721,12 @@ GLvoid* __stdcall glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr le target, offset, length, access); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return NULL; } return glMapBufferRangeEXT(target, offset, length, access); @@ -5530,12 +5740,12 @@ void __stdcall glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeip EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } glFlushMappedBufferRangeEXT(target, offset, length); @@ -5547,12 +5757,12 @@ void __stdcall glBindVertexArray(GLuint array) EVENT("(GLuint array = %u)", array); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } gl::VertexArray *vao = context->getVertexArray(array); @@ -5561,7 +5771,8 @@ void __stdcall glBindVertexArray(GLuint array) { // The default VAO should always exist ASSERT(array != 0); - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } context->bindVertexArray(array); @@ -5573,17 +5784,18 @@ void __stdcall glDeleteVertexArrays(GLsizei n, const GLuint* arrays) EVENT("(GLsizei n = %d, const GLuint* arrays = 0x%0.8p)", n, arrays); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (n < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } for (int arrayIndex = 0; arrayIndex < n; arrayIndex++) @@ -5601,17 +5813,18 @@ void __stdcall glGenVertexArrays(GLsizei n, GLuint* arrays) EVENT("(GLsizei n = %d, GLuint* arrays = 0x%0.8p)", n, arrays); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (n < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } for (int arrayIndex = 0; arrayIndex < n; arrayIndex++) @@ -5626,12 +5839,12 @@ GLboolean __stdcall glIsVertexArray(GLuint array) EVENT("(GLuint array = %u)", array); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, GL_FALSE); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_FALSE; } if (array == 0) @@ -5653,30 +5866,40 @@ void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data) target, index, data); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } + const gl::Caps &caps = context->getCaps(); switch (target) { case GL_TRANSFORM_FEEDBACK_BUFFER_START: case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: - if (index >= context->getMaxTransformFeedbackBufferBindings()) - return gl::error(GL_INVALID_VALUE); + if (index >= caps.maxTransformFeedbackSeparateAttributes) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } break; + case GL_UNIFORM_BUFFER_START: case GL_UNIFORM_BUFFER_SIZE: case GL_UNIFORM_BUFFER_BINDING: - if (index >= context->getMaximumCombinedUniformBufferBindings()) - return gl::error(GL_INVALID_VALUE); + if (index >= caps.maxCombinedUniformBlocks) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } if (!(context->getIndexedIntegerv(target, index, data))) @@ -5684,10 +5907,15 @@ void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data) GLenum nativeType; unsigned int numParams = 0; if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams)) - return gl::error(GL_INVALID_ENUM); + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } if (numParams == 0) + { return; // it is known that pname is valid, but there are no parameters to return + } if (nativeType == GL_INT_64_ANGLEX) { @@ -5718,12 +5946,12 @@ void __stdcall glBeginTransformFeedback(GLenum primitiveMode) EVENT("(GLenum primitiveMode = 0x%X)", primitiveMode); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } switch (primitiveMode) @@ -5732,8 +5960,10 @@ void __stdcall glBeginTransformFeedback(GLenum primitiveMode) case GL_LINES: case GL_POINTS: break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback(); @@ -5741,7 +5971,8 @@ void __stdcall glBeginTransformFeedback(GLenum primitiveMode) if (transformFeedback->isStarted()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (transformFeedback->isPaused()) @@ -5760,12 +5991,12 @@ void __stdcall glEndTransformFeedback(void) EVENT("(void)"); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback(); @@ -5773,7 +6004,8 @@ void __stdcall glEndTransformFeedback(void) if (!transformFeedback->isStarted()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } transformFeedback->stop(); @@ -5786,37 +6018,42 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi target, index, buffer, offset, size); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } + const gl::Caps &caps = context->getCaps(); switch (target) { case GL_TRANSFORM_FEEDBACK_BUFFER: - if (index >= context->getMaxTransformFeedbackBufferBindings()) + if (index >= caps.maxTransformFeedbackSeparateAttributes) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; case GL_UNIFORM_BUFFER: - if (index >= context->getMaximumCombinedUniformBufferBindings()) + if (index >= caps.maxUniformBufferBindings) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } if (buffer != 0 && size <= 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } switch (target) @@ -5826,7 +6063,8 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi // size and offset must be a multiple of 4 if (buffer != 0 && ((offset % 4) != 0 || (size % 4) != 0)) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } context->bindIndexedTransformFeedbackBuffer(buffer, index, offset, size); @@ -5836,9 +6074,10 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi case GL_UNIFORM_BUFFER: // it is an error to bind an offset not a multiple of the alignment - if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0) + if (buffer != 0 && (offset % caps.uniformBufferOffsetAlignment) != 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } context->bindIndexedUniformBuffer(buffer, index, offset, size); @@ -5857,32 +6096,36 @@ void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer) target, index, buffer); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } + const gl::Caps &caps = context->getCaps(); switch (target) { case GL_TRANSFORM_FEEDBACK_BUFFER: - if (index >= context->getMaxTransformFeedbackBufferBindings()) + if (index >= caps.maxTransformFeedbackSeparateAttributes) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; case GL_UNIFORM_BUFFER: - if (index >= context->getMaximumCombinedUniformBufferBindings()) + if (index >= caps.maxUniformBufferBindings) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } switch (target) @@ -5909,31 +6152,35 @@ void __stdcall glTransformFeedbackVaryings(GLuint program, GLsizei count, const program, count, varyings, bufferMode); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (count < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } + const gl::Caps &caps = context->getCaps(); switch (bufferMode) { case GL_INTERLEAVED_ATTRIBS: break; case GL_SEPARATE_ATTRIBS: - if (static_cast<GLuint>(count) > context->getMaxTransformFeedbackBufferBindings()) + if (static_cast<GLuint>(count) > caps.maxTransformFeedbackSeparateAttributes) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } if (!gl::ValidProgram(context, program)) @@ -5955,17 +6202,18 @@ void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsiz program, index, bufSize, length, size, type, name); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (bufSize < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } if (!gl::ValidProgram(context, program)) @@ -5978,7 +6226,8 @@ void __stdcall glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsiz if (index >= static_cast<GLuint>(programObject->getTransformFeedbackVaryingCount())) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } programObject->getTransformFeedbackVarying(index, bufSize, length, size, type, name); @@ -5991,59 +6240,63 @@ void __stdcall glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLs index, size, type, stride, pointer); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - } - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } - if (size < 1 || size > 4) - { - return gl::error(GL_INVALID_VALUE); - } + if (size < 1 || size > 4) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } - switch (type) - { - case GL_BYTE: - case GL_UNSIGNED_BYTE: - case GL_SHORT: - case GL_UNSIGNED_SHORT: - case GL_INT: - case GL_UNSIGNED_INT: - case GL_INT_2_10_10_10_REV: - case GL_UNSIGNED_INT_2_10_10_10_REV: - break; - default: - return gl::error(GL_INVALID_ENUM); - } + switch (type) + { + case GL_BYTE: + case GL_UNSIGNED_BYTE: + case GL_SHORT: + case GL_UNSIGNED_SHORT: + case GL_INT: + case GL_UNSIGNED_INT: + case GL_INT_2_10_10_10_REV: + case GL_UNSIGNED_INT_2_10_10_10_REV: + break; - if (stride < 0) - { - return gl::error(GL_INVALID_VALUE); - } + default: + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } - if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4) - { - return gl::error(GL_INVALID_OPERATION); - } + if (stride < 0) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } + + if ((type == GL_INT_2_10_10_10_REV || type == GL_UNSIGNED_INT_2_10_10_10_REV) && size != 4) + { + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; + } - if (context) - { // [OpenGL ES 3.0.2] Section 2.8 page 24: // An INVALID_OPERATION error is generated when a non-zero vertex array object // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point, // and the pointer argument is not NULL. if (context->getState().getVertexArray()->id() != 0 && context->getState().getArrayBufferId() == 0 && pointer != NULL) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } context->getState().setVertexAttribState(index, context->getState().getTargetBuffer(GL_ARRAY_BUFFER), size, type, false, true, @@ -6057,22 +6310,23 @@ void __stdcall glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params) index, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (index >= gl::MAX_VERTEX_ATTRIBS) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index); - if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion())) + if (!gl::ValidateGetVertexAttribParameters(context, pname)) { return; } @@ -6098,22 +6352,23 @@ void __stdcall glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params) index, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (index >= gl::MAX_VERTEX_ATTRIBS) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } const gl::VertexAttribute &attribState = context->getState().getVertexAttribState(index); - if (!gl::ValidateGetVertexAttribParameters(pname, context->getClientVersion())) + if (!gl::ValidateGetVertexAttribParameters(context, pname)) { return; } @@ -6139,17 +6394,18 @@ void __stdcall glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint index, x, y, z, w); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (index >= gl::MAX_VERTEX_ATTRIBS) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } GLint vals[4] = { x, y, z, w }; @@ -6163,17 +6419,18 @@ void __stdcall glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GL index, x, y, z, w); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (index >= gl::MAX_VERTEX_ATTRIBS) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } GLuint vals[4] = { x, y, z, w }; @@ -6186,17 +6443,18 @@ void __stdcall glVertexAttribI4iv(GLuint index, const GLint* v) EVENT("(GLuint index = %u, const GLint* v = 0x%0.8p)", index, v); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (index >= gl::MAX_VERTEX_ATTRIBS) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } context->getState().setVertexAttribi(index, v); @@ -6208,17 +6466,18 @@ void __stdcall glVertexAttribI4uiv(GLuint index, const GLuint* v) EVENT("(GLuint index = %u, const GLuint* v = 0x%0.8p)", index, v); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (index >= gl::MAX_VERTEX_ATTRIBS) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } context->getState().setVertexAttribu(index, v); @@ -6231,36 +6490,19 @@ void __stdcall glGetUniformuiv(GLuint program, GLint location, GLuint* params) program, location, params); gl::Context *context = gl::getNonLostContext(); - if (context) { - if (context->getClientVersion() < 3) - { - return gl::error(GL_INVALID_OPERATION); - } - - if (program == 0) + if (!ValidateGetUniformuiv(context, program, location, params)) { - return gl::error(GL_INVALID_VALUE); + return; } gl::Program *programObject = context->getProgram(program); - - if (!programObject || !programObject->isLinked()) - { - return gl::error(GL_INVALID_OPERATION); - } - + ASSERT(programObject); gl::ProgramBinary *programBinary = programObject->getProgramBinary(); - if (!programBinary) - { - return gl::error(GL_INVALID_OPERATION); - } + ASSERT(programBinary); - if (!programBinary->getUniformuiv(location, NULL, params)) - { - return gl::error(GL_INVALID_OPERATION); - } + programBinary->getUniformuiv(location, params); } } @@ -6270,30 +6512,33 @@ GLint __stdcall glGetFragDataLocation(GLuint program, const GLchar *name) program, name); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, -1); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return -1; } if (program == 0) { - return gl::error(GL_INVALID_VALUE, -1); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return -1; } gl::Program *programObject = context->getProgram(program); if (!programObject || !programObject->isLinked()) { - return gl::error(GL_INVALID_OPERATION, -1); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return -1; } gl::ProgramBinary *programBinary = programObject->getProgramBinary(); if (!programBinary) { - return gl::error(GL_INVALID_OPERATION, -1); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return -1; } return programBinary->getFragDataLocation(name); @@ -6331,7 +6576,6 @@ void __stdcall glUniform1uiv(GLint location, GLsizei count, const GLuint* value) location, count, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count)) @@ -6350,7 +6594,6 @@ void __stdcall glUniform2uiv(GLint location, GLsizei count, const GLuint* value) location, count, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count)) @@ -6369,7 +6612,6 @@ void __stdcall glUniform3uiv(GLint location, GLsizei count, const GLuint* value) location, count, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count)) @@ -6388,7 +6630,6 @@ void __stdcall glUniform4uiv(GLint location, GLsizei count, const GLuint* value) location, count, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count)) @@ -6407,7 +6648,6 @@ void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* val buffer, drawbuffer, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateClearBuffer(context)) @@ -6420,20 +6660,30 @@ void __stdcall glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* val case GL_COLOR: if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; + case GL_STENCIL: if (drawbuffer != 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } - context->clearBufferiv(buffer, drawbuffer, value); + gl::Error error = context->clearBufferiv(buffer, drawbuffer, value); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -6443,7 +6693,6 @@ void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* v buffer, drawbuffer, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateClearBuffer(context)) @@ -6456,14 +6705,22 @@ void __stdcall glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* v case GL_COLOR: if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } - context->clearBufferuiv(buffer, drawbuffer, value); + gl::Error error = context->clearBufferuiv(buffer, drawbuffer, value); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -6473,7 +6730,6 @@ void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* v buffer, drawbuffer, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateClearBuffer(context)) @@ -6486,20 +6742,30 @@ void __stdcall glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* v case GL_COLOR: if (drawbuffer < 0 || static_cast<GLuint>(drawbuffer) >= context->getCaps().maxDrawBuffers) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; + case GL_DEPTH: if (drawbuffer != 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } - context->clearBufferfv(buffer, drawbuffer, value); + gl::Error error = context->clearBufferfv(buffer, drawbuffer, value); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -6509,7 +6775,6 @@ void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, G buffer, drawbuffer, depth, stencil); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateClearBuffer(context)) @@ -6522,14 +6787,22 @@ void __stdcall glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, G case GL_DEPTH_STENCIL: if (drawbuffer != 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } - context->clearBufferfi(buffer, drawbuffer, depth, stencil); + gl::Error error = context->clearBufferfi(buffer, drawbuffer, depth, stencil); + if (error.isError()) + { + context->recordError(error); + return; + } } } @@ -6538,22 +6811,24 @@ const GLubyte* __stdcall glGetStringi(GLenum name, GLuint index) EVENT("(GLenum name = 0x%X, GLuint index = %u)", name, index); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLubyte*>(NULL)); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return NULL; } if (name != GL_EXTENSIONS) { - return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLubyte*>(NULL)); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return NULL; } if (index >= context->getExtensionStringCount()) { - return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLubyte*>(NULL)); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return NULL; } return reinterpret_cast<const GLubyte*>(context->getExtensionString(index).c_str()); @@ -6568,17 +6843,18 @@ void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintp readTarget, writeTarget, readOffset, writeOffset, size); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!gl::ValidBufferTarget(context, readTarget) || !gl::ValidBufferTarget(context, readTarget)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::Buffer *readBuffer = context->getState().getTargetBuffer(readTarget); @@ -6586,32 +6862,40 @@ void __stdcall glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintp if (!readBuffer || !writeBuffer) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } + // Verify that readBuffer and writeBuffer are not currently mapped if (readBuffer->isMapped() || writeBuffer->isMapped()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (readOffset < 0 || writeOffset < 0 || size < 0 || static_cast<unsigned int>(readOffset + size) > readBuffer->getSize() || static_cast<unsigned int>(writeOffset + size) > writeBuffer->getSize()) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } if (readBuffer == writeBuffer && abs(readOffset - writeOffset) < size) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } - // TODO: Verify that readBuffer and writeBuffer are not currently mapped (GL_INVALID_OPERATION) - // if size is zero, the copy is a successful no-op if (size > 0) { - writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size); + gl::Error error = writeBuffer->copyBufferSubData(readBuffer, readOffset, writeOffset, size); + if (error.isError()) + { + context->recordError(error); + return; + } } } } @@ -6622,17 +6906,18 @@ void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const G program, uniformCount, uniformNames, uniformIndices); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (uniformCount < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } gl::Program *programObject = context->getProgram(program); @@ -6641,11 +6926,13 @@ void __stdcall glGetUniformIndices(GLuint program, GLsizei uniformCount, const G { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -6673,17 +6960,18 @@ void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const program, uniformCount, uniformIndices, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (uniformCount < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } gl::Program *programObject = context->getProgram(program); @@ -6692,11 +6980,13 @@ void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -6711,15 +7001,18 @@ void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const case GL_UNIFORM_MATRIX_STRIDE: case GL_UNIFORM_IS_ROW_MAJOR: break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::ProgramBinary *programBinary = programObject->getProgramBinary(); if (!programBinary && uniformCount > 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } for (int uniformId = 0; uniformId < uniformCount; uniformId++) @@ -6728,7 +7021,8 @@ void __stdcall glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const if (index >= (GLuint)programBinary->getActiveUniformCount()) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -6745,12 +7039,12 @@ GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlo EVENT("(GLuint program = %u, const GLchar* uniformBlockName = 0x%0.8p)", program, uniformBlockName); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_INVALID_INDEX; } gl::Program *programObject = context->getProgram(program); @@ -6759,11 +7053,13 @@ GLuint __stdcall glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlo { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION, GL_INVALID_INDEX); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_INVALID_INDEX; } else { - return gl::error(GL_INVALID_VALUE, GL_INVALID_INDEX); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return GL_INVALID_INDEX; } } @@ -6785,12 +7081,12 @@ void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockInde program, uniformBlockIndex, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } gl::Program *programObject = context->getProgram(program); @@ -6798,11 +7094,13 @@ void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockInde { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -6810,7 +7108,8 @@ void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockInde if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount()) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } switch (pname) @@ -6829,7 +7128,8 @@ void __stdcall glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockInde break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -6840,12 +7140,12 @@ void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIn program, uniformBlockIndex, bufSize, length, uniformBlockName); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } gl::Program *programObject = context->getProgram(program); @@ -6854,11 +7154,13 @@ void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIn { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -6866,7 +7168,8 @@ void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIn if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount()) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName); @@ -6879,17 +7182,18 @@ void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, G program, uniformBlockIndex, uniformBlockBinding); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings()) + if (uniformBlockBinding >= context->getCaps().maxUniformBufferBindings) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } gl::Program *programObject = context->getProgram(program); @@ -6898,11 +7202,13 @@ void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, G { if (context->getShader(program)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } else { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } } @@ -6911,7 +7217,8 @@ void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, G // if never linked, there won't be any uniform blocks if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount()) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding); @@ -6924,12 +7231,12 @@ void __stdcall glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GL mode, first, count, instanceCount); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // glDrawArraysInstanced @@ -6943,12 +7250,12 @@ void __stdcall glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, mode, count, type, indices, instanceCount); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // glDrawElementsInstanced @@ -6961,22 +7268,24 @@ GLsync __stdcall glFenceSync(GLenum condition, GLbitfield flags) EVENT("(GLenum condition = 0x%X, GLbitfield flags = 0x%X)", condition, flags); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLsync>(0)); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return 0; } if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE) { - return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLsync>(0)); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return 0; } if (flags != 0) { - return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLsync>(0)); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return 0; } return context->createFenceSync(condition); @@ -6990,12 +7299,12 @@ GLboolean __stdcall glIsSync(GLsync sync) EVENT("(GLsync sync = 0x%0.8p)", sync); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, GL_FALSE); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_FALSE; } return (context->getFenceSync(sync) != NULL); @@ -7009,17 +7318,18 @@ void __stdcall glDeleteSync(GLsync sync) EVENT("(GLsync sync = 0x%0.8p)", sync); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (sync != static_cast<GLsync>(0) && !context->getFenceSync(sync)) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } context->deleteFenceSync(sync); @@ -7032,24 +7342,26 @@ GLenum __stdcall glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeou sync, flags, timeout); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, GL_WAIT_FAILED); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_WAIT_FAILED; } if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0) { - return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return GL_WAIT_FAILED; } gl::FenceSync *fenceSync = context->getFenceSync(sync); if (!fenceSync) { - return gl::error(GL_INVALID_VALUE, GL_WAIT_FAILED); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return GL_WAIT_FAILED; } return fenceSync->clientWait(flags, timeout); @@ -7064,29 +7376,32 @@ void __stdcall glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) sync, flags, timeout); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (flags != 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } if (timeout != GL_TIMEOUT_IGNORED) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } gl::FenceSync *fenceSync = context->getFenceSync(sync); if (!fenceSync) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } fenceSync->serverWait(); @@ -7099,12 +7414,12 @@ void __stdcall glGetInteger64v(GLenum pname, GLint64* params) pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } GLenum nativeType; @@ -7131,24 +7446,26 @@ void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* sync, pname, bufSize, length, values); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (bufSize < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } gl::FenceSync *fenceSync = context->getFenceSync(sync); if (!fenceSync) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } switch (pname) @@ -7159,7 +7476,8 @@ void __stdcall glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* case GL_SYNC_FLAGS: values[0] = 0; break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -7170,30 +7488,40 @@ void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data) target, index, data); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } + const gl::Caps &caps = context->getCaps(); switch (target) { case GL_TRANSFORM_FEEDBACK_BUFFER_START: case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: - if (index >= context->getMaxTransformFeedbackBufferBindings()) - return gl::error(GL_INVALID_VALUE); + if (index >= caps.maxTransformFeedbackSeparateAttributes) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } break; + case GL_UNIFORM_BUFFER_START: case GL_UNIFORM_BUFFER_SIZE: case GL_UNIFORM_BUFFER_BINDING: - if (index >= context->getMaximumCombinedUniformBufferBindings()) - return gl::error(GL_INVALID_VALUE); + if (index >= caps.maxUniformBufferBindings) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; + } break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } if (!(context->getIndexedInteger64v(target, index, data))) @@ -7201,7 +7529,10 @@ void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data) GLenum nativeType; unsigned int numParams = 0; if (!context->getIndexedQueryParameterInfo(target, &nativeType, &numParams)) - return gl::error(GL_INVALID_ENUM); + { + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; + } if (numParams == 0) return; // it is known that pname is valid, but there are no parameters to return @@ -7233,22 +7564,24 @@ void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* pa target, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!gl::ValidBufferTarget(context, target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } if (!gl::ValidBufferParameter(context, pname)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::Buffer *buffer = context->getState().getTargetBuffer(target); @@ -7256,7 +7589,8 @@ void __stdcall glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* pa if (!buffer) { // A null buffer means that "0" is bound to the requested buffer target - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } switch (pname) @@ -7289,17 +7623,18 @@ void __stdcall glGenSamplers(GLsizei count, GLuint* samplers) EVENT("(GLsizei count = %d, GLuint* samplers = 0x%0.8p)", count, samplers); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (count < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } for (int i = 0; i < count; i++) @@ -7314,17 +7649,18 @@ void __stdcall glDeleteSamplers(GLsizei count, const GLuint* samplers) EVENT("(GLsizei count = %d, const GLuint* samplers = 0x%0.8p)", count, samplers); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (count < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } for (int i = 0; i < count; i++) @@ -7339,12 +7675,12 @@ GLboolean __stdcall glIsSampler(GLuint sampler) EVENT("(GLuint sampler = %u)", sampler); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, GL_FALSE); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_FALSE; } return context->isSampler(sampler); @@ -7358,22 +7694,24 @@ void __stdcall glBindSampler(GLuint unit, GLuint sampler) EVENT("(GLuint unit = %u, GLuint sampler = %u)", unit, sampler); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (sampler != 0 && !context->isSampler(sampler)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - if (unit >= context->getMaximumCombinedTextureImageUnits()) + if (unit >= context->getCaps().maxCombinedTextureImageUnits) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } context->bindSampler(unit, sampler); @@ -7385,15 +7723,15 @@ void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param) EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint param = %d)", sampler, pname, param); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - if (!gl::ValidateSamplerObjectParameter(pname)) + if (!gl::ValidateSamplerObjectParameter(context, pname)) { return; } @@ -7405,7 +7743,8 @@ void __stdcall glSamplerParameteri(GLuint sampler, GLenum pname, GLint param) if (!context->isSampler(sampler)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } context->samplerParameteri(sampler, pname, param); @@ -7422,15 +7761,15 @@ void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLfloat param = %g)", sampler, pname, param); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - if (!gl::ValidateSamplerObjectParameter(pname)) + if (!gl::ValidateSamplerObjectParameter(context, pname)) { return; } @@ -7442,7 +7781,8 @@ void __stdcall glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) if (!context->isSampler(sampler)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } context->samplerParameterf(sampler, pname, param); @@ -7459,22 +7799,23 @@ void __stdcall glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* para EVENT("(GLuint sampler = %u, GLenum pname = 0x%X, GLint* params = 0x%0.8p)", sampler, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - if (!gl::ValidateSamplerObjectParameter(pname)) + if (!gl::ValidateSamplerObjectParameter(context, pname)) { return; } if (!context->isSampler(sampler)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } *params = context->getSamplerParameteri(sampler, pname); @@ -7486,22 +7827,23 @@ void __stdcall glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* pa EVENT("(GLuint sample = %ur, GLenum pname = 0x%X, GLfloat* params = 0x%0.8p)", sampler, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - if (!gl::ValidateSamplerObjectParameter(pname)) + if (!gl::ValidateSamplerObjectParameter(context, pname)) { return; } if (!context->isSampler(sampler)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } *params = context->getSamplerParameterf(sampler, pname); @@ -7512,18 +7854,19 @@ void __stdcall glVertexAttribDivisor(GLuint index, GLuint divisor) { EVENT("(GLuint index = %u, GLuint divisor = %u)", index, divisor); - if (index >= gl::MAX_VERTEX_ATTRIBS) - { - return gl::error(GL_INVALID_VALUE); - } - gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; + } + + if (index >= gl::MAX_VERTEX_ATTRIBS) + { + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } context->setVertexAttribDivisor(index, divisor); @@ -7535,12 +7878,12 @@ void __stdcall glBindTransformFeedback(GLenum target, GLuint id) EVENT("(GLenum target = 0x%X, GLuint id = %u)", target, id); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } switch (target) @@ -7551,13 +7894,15 @@ void __stdcall glBindTransformFeedback(GLenum target, GLuint id) gl::TransformFeedback *curTransformFeedback = context->getState().getCurrentTransformFeedback(); if (curTransformFeedback && curTransformFeedback->isStarted() && !curTransformFeedback->isPaused()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section 2.14.1) if (context->getTransformFeedback(id) == NULL) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } context->bindTransformFeedback(id); @@ -7565,7 +7910,8 @@ void __stdcall glBindTransformFeedback(GLenum target, GLuint id) break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -7575,12 +7921,12 @@ void __stdcall glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids) EVENT("(GLsizei n = %d, const GLuint* ids = 0x%0.8p)", n, ids); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } for (int i = 0; i < n; i++) @@ -7595,12 +7941,12 @@ void __stdcall glGenTransformFeedbacks(GLsizei n, GLuint* ids) EVENT("(GLsizei n = %d, GLuint* ids = 0x%0.8p)", n, ids); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } for (int i = 0; i < n; i++) @@ -7615,12 +7961,12 @@ GLboolean __stdcall glIsTransformFeedback(GLuint id) EVENT("(GLuint id = %u)", id); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION, GL_FALSE); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_FALSE; } return ((context->getTransformFeedback(id) != NULL) ? GL_TRUE : GL_FALSE); @@ -7634,12 +7980,12 @@ void __stdcall glPauseTransformFeedback(void) EVENT("(void)"); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback(); @@ -7648,7 +7994,8 @@ void __stdcall glPauseTransformFeedback(void) // Current transform feedback must be started and not paused in order to pause (3.0.2 pg 86) if (!transformFeedback->isStarted() || transformFeedback->isPaused()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } transformFeedback->pause(); @@ -7660,12 +8007,12 @@ void __stdcall glResumeTransformFeedback(void) EVENT("(void)"); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } gl::TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback(); @@ -7674,7 +8021,8 @@ void __stdcall glResumeTransformFeedback(void) // Current transform feedback must be started and paused in order to resume (3.0.2 pg 86) if (!transformFeedback->isStarted() || !transformFeedback->isPaused()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } transformFeedback->resume(); @@ -7687,12 +8035,12 @@ void __stdcall glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* leng program, bufSize, length, binaryFormat, binary); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // glGetProgramBinary @@ -7706,12 +8054,12 @@ void __stdcall glProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid program, binaryFormat, binary, length); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // glProgramBinary @@ -7725,12 +8073,12 @@ void __stdcall glProgramParameteri(GLuint program, GLenum pname, GLint value) program, pname, value); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // glProgramParameteri @@ -7744,12 +8092,12 @@ void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, co target, numAttachments, attachments); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments)) @@ -7757,8 +8105,11 @@ void __stdcall glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, co return; } - GLuint maxDimension = context->getCaps().maxRenderbufferSize; - context->invalidateFrameBuffer(target, numAttachments, attachments, 0, 0, maxDimension, maxDimension); + gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); + if (framebuffer && framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE) + { + framebuffer->invalidate(context->getCaps(), numAttachments, attachments); + } } } @@ -7769,12 +8120,12 @@ void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, target, numAttachments, attachments, x, y, width, height); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!ValidateInvalidateFramebufferParameters(context, target, numAttachments, attachments)) @@ -7782,7 +8133,11 @@ void __stdcall glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, return; } - context->invalidateFrameBuffer(target, numAttachments, attachments, x, y, width, height); + gl::Framebuffer *framebuffer = context->getState().getTargetFramebuffer(target); + if (framebuffer && framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE) + { + framebuffer->invalidateSub(context->getCaps(), numAttachments, attachments, x, y, width, height); + } } } @@ -7792,12 +8147,12 @@ void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalform target, levels, internalformat, width, height); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, 1)) @@ -7822,7 +8177,8 @@ void __stdcall glTexStorage2D(GLenum target, GLsizei levels, GLenum internalform break; default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -7834,12 +8190,12 @@ void __stdcall glTexStorage3D(GLenum target, GLsizei levels, GLenum internalform target, levels, internalformat, width, height, depth); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!ValidateES3TexStorageParameters(context, target, levels, internalformat, width, height, depth)) @@ -7876,41 +8232,49 @@ void __stdcall glGetInternalformativ(GLenum target, GLenum internalformat, GLenu target, internalformat, pname, bufSize, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (context->getClientVersion() < 3) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } const gl::TextureCaps &formatCaps = context->getTextureCaps().get(internalformat); if (!formatCaps.renderable) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } if (target != GL_RENDERBUFFER) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } if (bufSize < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } switch (pname) { case GL_NUM_SAMPLE_COUNTS: if (bufSize != 0) - *params = context->getNumSampleCounts(internalformat); + { + *params = formatCaps.sampleCounts.size(); + } break; + case GL_SAMPLES: - context->getSampleCounts(internalformat, bufSize, params); + std::copy_n(formatCaps.sampleCounts.rbegin(), std::min<size_t>(bufSize, formatCaps.sampleCounts.size()), params); break; + default: - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } } } @@ -7926,7 +8290,6 @@ void __stdcall glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLi srcX0, srcY0, srcX1, srcX1, dstX0, dstY0, dstX1, dstY1, mask, filter); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1, @@ -7959,29 +8322,29 @@ void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *l program, bufSize, length, binaryFormat, binary); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Program *programObject = context->getProgram(program); if (!programObject || !programObject->isLinked()) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } gl::ProgramBinary *programBinary = programObject->getProgramBinary(); if (!programBinary) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - if (!programBinary->save(binary, bufSize, length)) + if (!programBinary->save(binaryFormat, binary, bufSize, length)) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - - *binaryFormat = GL_PROGRAM_BINARY_ANGLE; } } @@ -7992,22 +8355,23 @@ void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat, program, binaryFormat, binary, length); gl::Context *context = gl::getNonLostContext(); - if (context) { - if (binaryFormat != GL_PROGRAM_BINARY_ANGLE) + const std::vector<GLenum> &programBinaryFormats = context->getCaps().programBinaryFormats; + if (std::find(programBinaryFormats.begin(), programBinaryFormats.end(), binaryFormat) == programBinaryFormats.end()) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::Program *programObject = context->getProgram(program); - if (!programObject) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } - context->setProgramBinary(program, binary, length); + context->setProgramBinary(program, binaryFormat, binary, length); } } @@ -8016,24 +8380,26 @@ void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs) EVENT("(GLenum n = %d, bufs = 0x%0.8p)", n, bufs); gl::Context *context = gl::getNonLostContext(); - if (context) { if (n < 0 || static_cast<GLuint>(n) > context->getCaps().maxDrawBuffers) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } if (context->getState().getDrawFramebuffer()->id() == 0) { if (n != 1) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (bufs[0] != GL_NONE && bufs[0] != GL_BACK) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } } else @@ -8043,7 +8409,8 @@ void __stdcall glDrawBuffersEXT(GLsizei n, const GLenum *bufs) const GLenum attachment = GL_COLOR_ATTACHMENT0_EXT + colorAttachment; if (bufs[colorAttachment] != GL_NONE && bufs[colorAttachment] != attachment) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } } } @@ -8067,17 +8434,18 @@ void __stdcall glGetBufferPointervOES(GLenum target, GLenum pname, void** params EVENT("(GLenum target = 0x%X, GLenum pname = 0x%X, GLvoid** params = 0x%0.8p)", target, pname, params); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!gl::ValidBufferTarget(context, target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } if (pname != GL_BUFFER_MAP_POINTER) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::Buffer *buffer = context->getState().getTargetBuffer(target); @@ -8098,32 +8466,42 @@ void * __stdcall glMapBufferOES(GLenum target, GLenum access) EVENT("(GLenum target = 0x%X, GLbitfield access = 0x%X)", target, access); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!gl::ValidBufferTarget(context, target)) { - return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return NULL; } gl::Buffer *buffer = context->getState().getTargetBuffer(target); if (buffer == NULL) { - return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return NULL; } if (access != GL_WRITE_ONLY_OES) { - return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return NULL; } if (buffer->isMapped()) { - return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return NULL; + } + + gl::Error error = buffer->mapRange(0, buffer->getSize(), GL_MAP_WRITE_BIT); + if (error.isError()) + { + context->recordError(error); + return NULL; } - return buffer->mapRange(0, buffer->getSize(), GL_MAP_WRITE_BIT); + return buffer->getMapPointer(); } return NULL; @@ -8134,24 +8512,30 @@ GLboolean __stdcall glUnmapBufferOES(GLenum target) EVENT("(GLenum target = 0x%X)", target); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!gl::ValidBufferTarget(context, target)) { - return gl::error(GL_INVALID_ENUM, GL_FALSE); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return GL_FALSE; } gl::Buffer *buffer = context->getState().getTargetBuffer(target); if (buffer == NULL || !buffer->isMapped()) { - return gl::error(GL_INVALID_OPERATION, GL_FALSE); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return GL_FALSE; } // TODO: detect if we had corruption. if so, throw an error and return false. - buffer->unmap(); + gl::Error error = buffer->unmap(); + if (error.isError()) + { + context->recordError(error); + return GL_FALSE; + } return GL_TRUE; } @@ -8165,24 +8549,26 @@ void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr target, offset, length, access); gl::Context *context = gl::getNonLostContext(); - if (context) { if (!gl::ValidBufferTarget(context, target)) { - return gl::error(GL_INVALID_ENUM, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return NULL; } if (offset < 0 || length < 0) { - return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return NULL; } gl::Buffer *buffer = context->getState().getTargetBuffer(target); if (buffer == NULL) { - return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return NULL; } // Check for buffer overflow @@ -8192,7 +8578,8 @@ void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) || offsetSize + lengthSize > static_cast<size_t>(buffer->getSize())) { - return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return NULL; } // Check for invalid bits in the mask @@ -8205,18 +8592,21 @@ void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr if (access & ~(allAccessBits)) { - return gl::error(GL_INVALID_VALUE, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return NULL; } if (length == 0 || buffer->isMapped()) { - return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return NULL; } // Check for invalid bit combinations if ((access & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0) { - return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return NULL; } GLbitfield writeOnlyBits = GL_MAP_INVALIDATE_RANGE_BIT | @@ -8225,15 +8615,24 @@ void* __stdcall glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr if ((access & GL_MAP_READ_BIT) != 0 && (access & writeOnlyBits) != 0) { - return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return NULL; } if ((access & GL_MAP_WRITE_BIT) == 0 && (access & GL_MAP_FLUSH_EXPLICIT_BIT) != 0) { - return gl::error(GL_INVALID_OPERATION, reinterpret_cast<GLvoid*>(NULL)); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return NULL; + } + + gl::Error error = buffer->mapRange(offset, length, access); + if (error.isError()) + { + context->recordError(error); + return NULL; } - return buffer->mapRange(offset, length, access); + return buffer->getMapPointer(); } return NULL; @@ -8244,29 +8643,32 @@ void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsi EVENT("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr length = %d)", target, offset, length); gl::Context *context = gl::getNonLostContext(); - if (context) { if (offset < 0 || length < 0) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } if (!gl::ValidBufferTarget(context, target)) { - return gl::error(GL_INVALID_ENUM); + context->recordError(gl::Error(GL_INVALID_ENUM)); + return; } gl::Buffer *buffer = context->getState().getTargetBuffer(target); if (buffer == NULL) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } if (!buffer->isMapped() || (buffer->getAccessFlags() & GL_MAP_FLUSH_EXPLICIT_BIT) == 0) { - return gl::error(GL_INVALID_OPERATION); + context->recordError(gl::Error(GL_INVALID_OPERATION)); + return; } // Check for buffer overflow @@ -8276,7 +8678,8 @@ void __stdcall glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsi if (!rx::IsUnsignedAdditionSafe(offsetSize, lengthSize) || offsetSize + lengthSize > static_cast<size_t>(buffer->getMapLength())) { - return gl::error(GL_INVALID_VALUE); + context->recordError(gl::Error(GL_INVALID_VALUE)); + return; } // We do not currently support a non-trivial implementation of FlushMappedBufferRange @@ -8347,7 +8750,6 @@ bool __stdcall glBindTexImage(egl::Surface *surface) surface); gl::Context *context = gl::getNonLostContext(); - if (context) { gl::Texture2D *textureObject = context->getTexture2D(); |