summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp')
-rw-r--r--src/3rdparty/angle/src/libGLESv2/libGLESv2.cpp3334
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();