summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xgpu/command_buffer/build_gles2_cmd_buffer.py35
-rw-r--r--gpu/command_buffer/client/gles2_implementation.cc63
-rw-r--r--gpu/command_buffer/client/gles2_implementation.h12
-rw-r--r--gpu/command_buffer/client/gles2_implementation_autogen.h28
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc475
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_autogen.h396
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc2
7 files changed, 583 insertions, 428 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index a7a067f..1a74b4e 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -1816,7 +1816,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
(func.return_type, func.original_name,
func.MakeTypedOriginalArgString("")))
for arg in func.GetOriginalArgs():
- arg.WriteClientSideValidationCode(file)
+ arg.WriteClientSideValidationCode(file, func)
file.Write(" helper_->%s(%s);\n" %
(func.name, func.MakeOriginalArgString("")))
file.Write("}\n")
@@ -2201,9 +2201,9 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
(func.return_type, func.original_name,
func.MakeTypedOriginalArgString("")))
for arg in func.GetOriginalArgs():
- arg.WriteClientSideValidationCode(file)
+ arg.WriteClientSideValidationCode(file, func)
code = """ if (Is%(type)sReservedId(%(id)s)) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "%(name)s: %(id)s reserved id");
return;
}
if (%(id)s != 0) {
@@ -2731,7 +2731,7 @@ class GETnHandler(TypeHandler):
code = """ typedef %(func_name)s::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "gl%(func_name)s: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
@@ -2755,7 +2755,7 @@ class GETnHandler(TypeHandler):
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -3589,11 +3589,11 @@ class Argument(object):
file.Write(" %s %s = static_cast<%s>(c.%s);\n" %
(self.type, self.name, self.type, self.name))
- def WriteValidationCode(self, file):
+ def WriteValidationCode(self, file, func):
"""Writes the validation code for an argument."""
pass
- def WriteClientSideValidationCode(self, file):
+ def WriteClientSideValidationCode(self, file, func):
"""Writes the validation code for an argument."""
pass
@@ -3635,17 +3635,19 @@ class SizeArgument(Argument):
"""overridden from Argument."""
return ("-1", "kNoError", "GL_INVALID_VALUE")
- def WriteValidationCode(self, file):
+ def WriteValidationCode(self, file, func):
"""overridden from Argument."""
file.Write(" if (%s < 0) {\n" % self.name)
- file.Write(" SetGLError(GL_INVALID_VALUE);\n")
+ file.Write(" SetGLError(GL_INVALID_VALUE, \"gl%s: %s < 0\");\n" %
+ (func.original_name, self.name))
file.Write(" return error::kNoError;\n")
file.Write(" }\n")
- def WriteClientSideValidationCode(self, file):
+ def WriteClientSideValidationCode(self, file, func):
"""overridden from Argument."""
file.Write(" if (%s < 0) {\n" % self.name)
- file.Write(" SetGLError(GL_INVALID_VALUE);\n")
+ file.Write(" SetGLError(GL_INVALID_VALUE, \"gl%s: %s < 0\");\n" %
+ (func.original_name, self.name))
file.Write(" return;\n")
file.Write(" }\n")
@@ -3660,9 +3662,10 @@ class EnumBaseArgument(Argument):
name = type[len(gl_type):]
self.enum_info = _ENUM_LISTS[name]
- def WriteValidationCode(self, file):
+ def WriteValidationCode(self, file, func):
file.Write(" if (!Validate%s(%s)) {\n" % (self.local_type, self.name))
- file.Write(" SetGLError(%s);\n" % self.gl_error)
+ file.Write(" SetGLError(%s, \"gl%s: %s %s\");\n" %
+ (self.gl_error, func.original_name, self.name, self.gl_error))
file.Write(" return error::kNoError;\n")
file.Write(" }\n")
@@ -3745,7 +3748,7 @@ class ImmediatePointerArgument(Argument):
(self.type, self.name, self.type))
file.Write(" c, data_size, immediate_data_size);\n")
- def WriteValidationCode(self, file):
+ def WriteValidationCode(self, file, func):
"""Overridden from Argument."""
file.Write(" if (%s == NULL) {\n" % self.name)
file.Write(" return error::kOutOfBounds;\n")
@@ -3809,7 +3812,7 @@ class PointerArgument(Argument):
" %s_shm_id, %s_shm_offset, %s_size);\n" %
(self.name, self.name, self.name))
- def WriteValidationCode(self, file):
+ def WriteValidationCode(self, file, func):
"""Overridden from Argument."""
file.Write(" if (%s == NULL) {\n" % self.name)
file.Write(" return error::kOutOfBounds;\n")
@@ -4074,7 +4077,7 @@ class Function(object):
def WriteHandlerValidation(self, file):
"""Writes validation code for the function."""
for arg in self.GetOriginalArgs():
- arg.WriteValidationCode(file)
+ arg.WriteValidationCode(file, self)
self.WriteValidationCode(file)
def WriteHandlerImplementation(self, file):
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 7ab7c0a..0df4121 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -418,7 +418,10 @@ GLenum GLES2Implementation::GetGLError() {
return error;
}
-void GLES2Implementation::SetGLError(GLenum error) {
+void GLES2Implementation::SetGLError(GLenum error, const char* msg) {
+ if (msg) {
+ last_error_ = msg;
+ }
error_bits_ |= GLES2Util::GLErrorToErrorBit(error);
}
@@ -510,7 +513,7 @@ void GLES2Implementation::SetBucketAsString(
void GLES2Implementation::DrawElements(
GLenum mode, GLsizei count, GLenum type, const void* indices) {
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDrawElements: count less than 0.");
return;
}
if (count == 0) {
@@ -632,8 +635,12 @@ GLint GLES2Implementation::GetUniformLocation(
void GLES2Implementation::ShaderBinary(
GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary,
GLsizei length) {
- if (n < 0 || length < 0) {
- SetGLError(GL_INVALID_VALUE);
+ if (n < 0) {
+ SetGLError(GL_INVALID_VALUE, "glShaderBinary n < 0.");
+ return;
+ }
+ if (length < 0) {
+ SetGLError(GL_INVALID_VALUE, "glShaderBinary length < 0.");
return;
}
GLsizei shader_id_size = n * sizeof(*shaders);
@@ -687,8 +694,12 @@ void GLES2Implementation::VertexAttribPointer(
void GLES2Implementation::ShaderSource(
GLuint shader, GLsizei count, const char** source, const GLint* length) {
- if (count < 0 || shader == 0) {
- SetGLError(GL_INVALID_VALUE);
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glShaderSource count < 0");
+ return;
+ }
+ if (shader == 0) {
+ SetGLError(GL_INVALID_VALUE, "glShaderSource shader == 0");
return;
}
@@ -697,7 +708,7 @@ void GLES2Implementation::ShaderSource(
for (GLsizei ii = 0; ii < count; ++ii) {
// I shouldn't have to check for this. The spec doesn't allow this
if (!source[ii]) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glShaderSource: null passed for string.");
return;
}
total_size += (length && length[ii] >= 0) ? length[ii] : strlen(source[ii]);
@@ -749,7 +760,7 @@ void GLES2Implementation::BufferSubData(
}
if (size < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glBufferSubData: size < 0");
return;
}
@@ -773,7 +784,7 @@ void GLES2Implementation::CompressedTexImage2D(
GLenum target, GLint level, GLenum internalformat, GLsizei width,
GLsizei height, GLint border, GLsizei image_size, const void* data) {
if (width < 0 || height < 0 || level < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCompressedTexImage2D dimension < 0");
return;
}
if (height == 0 || width == 0) {
@@ -796,7 +807,7 @@ void GLES2Implementation::CompressedTexSubImage2D(
GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
GLsizei height, GLenum format, GLsizei image_size, const void* data) {
if (width < 0 || height < 0 || level < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D dimension < 0");
return;
}
// TODO(gman): Switch to use buckets always or at least if no room in shared
@@ -817,13 +828,13 @@ void GLES2Implementation::TexImage2D(
GLsizei height, GLint border, GLenum format, GLenum type,
const void* pixels) {
if (level < 0 || height < 0 || width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexImage2D dimension < 0");
return;
}
uint32 size;
if (!GLES2Util::ComputeImageDataSize(
width, height, format, type, unpack_alignment_, &size)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexImage2D: image size too large");
return;
}
helper_->TexImage2D(
@@ -837,7 +848,7 @@ void GLES2Implementation::TexSubImage2D(
GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
GLsizei height, GLenum format, GLenum type, const void* pixels) {
if (level < 0 || height < 0 || width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexSubImage2D dimension < 0");
return;
}
if (height == 0 || width == 0) {
@@ -848,18 +859,18 @@ void GLES2Implementation::TexSubImage2D(
uint32 temp_size;
if (!GLES2Util::ComputeImageDataSize(
width, 1, format, type, unpack_alignment_, &temp_size)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: size to large");
return;
}
GLsizeiptr unpadded_row_size = temp_size;
if (!GLES2Util::ComputeImageDataSize(
width, 2, format, type, unpack_alignment_, &temp_size)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: size to large");
return;
}
GLsizeiptr padded_row_size = temp_size - unpadded_row_size;
if (padded_row_size < 0 || unpadded_row_size < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: size to large");
return;
}
@@ -914,7 +925,7 @@ void GLES2Implementation::GetActiveAttrib(
GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size,
GLenum* type, char* name) {
if (bufsize < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: bufsize < 0");
return;
}
// Clear the bucket so if we the command fails nothing will be in it.
@@ -954,7 +965,7 @@ void GLES2Implementation::GetActiveUniform(
GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size,
GLenum* type, char* name) {
if (bufsize < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: bufsize < 0");
return;
}
// Clear the bucket so if we the command fails nothing will be in it.
@@ -993,7 +1004,7 @@ void GLES2Implementation::GetActiveUniform(
void GLES2Implementation::GetAttachedShaders(
GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) {
if (maxcount < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetAttachedShaders: maxcount < 0");
return;
}
typedef gles2::GetAttachedShaders::Result Result;
@@ -1081,7 +1092,7 @@ void GLES2Implementation::ReadPixels(
GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
GLenum type, void* pixels) {
if (width < 0 || height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions < 0");
return;
}
if (width == 0 || height == 0) {
@@ -1101,18 +1112,18 @@ void GLES2Implementation::ReadPixels(
uint32 temp_size;
if (!GLES2Util::ComputeImageDataSize(
width, 1, format, type, pack_alignment_, &temp_size)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glReadPixels: size too large.");
return;
}
GLsizeiptr unpadded_row_size = temp_size;
if (!GLES2Util::ComputeImageDataSize(
width, 2, format, type, pack_alignment_, &temp_size)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glReadPixels: size too large.");
return;
}
GLsizeiptr padded_row_size = temp_size - unpadded_row_size;
if (padded_row_size < 0 || unpadded_row_size < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glReadPixels: size too large.");
return;
}
// Check if we have enough space to transfer at least an entire row.
@@ -1205,7 +1216,7 @@ bool GLES2Implementation::IsBufferReservedId(GLuint) { // NOLINT
void GLES2Implementation::BindBuffer(GLenum target, GLuint buffer) {
if (IsBufferReservedId(buffer)) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glBindBuffer: reserved buffer id");
return;
}
if (buffer != 0) {
@@ -1253,7 +1264,7 @@ void GLES2Implementation::EnableVertexAttribArray(GLuint index) {
void GLES2Implementation::DrawArrays(GLenum mode, GLint first, GLsizei count) {
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDrawArrays: count < 0");
return;
}
bool have_client_side =
@@ -1299,7 +1310,7 @@ bool GLES2Implementation::GetVertexAttribHelper(
case GL_CURRENT_VERTEX_ATTRIB:
return false; // pass through to service side.
default:
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetVertexAttrib: invalid enum");
break;
}
return true;
diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h
index 7d52485..4d0e53e 100644
--- a/gpu/command_buffer/client/gles2_implementation.h
+++ b/gpu/command_buffer/client/gles2_implementation.h
@@ -75,7 +75,7 @@ class GLES2Implementation {
#else
void BindBuffer(GLenum target, GLuint buffer) {
if (IsReservedId(buffer)) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glBindBuffer: reserved buffer id");
return;
}
if (buffer != 0) {
@@ -95,7 +95,7 @@ class GLES2Implementation {
void DrawArrays(GLenum mode, GLint first, GLsizei count) {
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDrawArrays: count < 0");
return;
}
helper_->DrawArrays(mode, first, count);
@@ -184,7 +184,12 @@ class GLES2Implementation {
GLenum GetGLError();
// Sets our wrapper for the GLError.
- void SetGLError(GLenum error);
+ void SetGLError(GLenum error, const char* msg);
+
+ // Returns the last error and clears it. Useful for debugging.
+ const std::string& GetLastError() {
+ return last_error_;
+ }
// Waits for all commands to execute.
void WaitForCmd();
@@ -235,6 +240,7 @@ class GLES2Implementation {
int transfer_buffer_id_;
void* result_buffer_;
uint32 result_shm_offset_;
+ std::string last_error_;
// pack alignment as last set by glPixelStorei
GLint pack_alignment_;
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h
index c755807..06bcdcc 100644
--- a/gpu/command_buffer/client/gles2_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -21,7 +21,8 @@ void BindAttribLocation(GLuint program, GLuint index, const char* name);
void BindFramebuffer(GLenum target, GLuint framebuffer) {
if (IsFramebufferReservedId(framebuffer)) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(
+ GL_INVALID_OPERATION, "BindFramebuffer: framebuffer reserved id");
return;
}
if (framebuffer != 0) {
@@ -32,7 +33,8 @@ void BindFramebuffer(GLenum target, GLuint framebuffer) {
void BindRenderbuffer(GLenum target, GLuint renderbuffer) {
if (IsRenderbufferReservedId(renderbuffer)) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(
+ GL_INVALID_OPERATION, "BindRenderbuffer: renderbuffer reserved id");
return;
}
if (renderbuffer != 0) {
@@ -43,7 +45,7 @@ void BindRenderbuffer(GLenum target, GLuint renderbuffer) {
void BindTexture(GLenum target, GLuint texture) {
if (IsTextureReservedId(texture)) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "BindTexture: texture reserved id");
return;
}
if (texture != 0) {
@@ -126,11 +128,11 @@ void CopyTexImage2D(
GLenum target, GLint level, GLenum internalformat, GLint x, GLint y,
GLsizei width, GLsizei height, GLint border) {
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D: width < 0");
return;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D: height < 0");
return;
}
helper_->CopyTexImage2D(
@@ -141,11 +143,11 @@ void CopyTexSubImage2D(
GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y,
GLsizei width, GLsizei height) {
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D: width < 0");
return;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D: height < 0");
return;
}
helper_->CopyTexSubImage2D(
@@ -527,11 +529,11 @@ void ReleaseShaderCompiler() {
void RenderbufferStorage(
GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage: width < 0");
return;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage: height < 0");
return;
}
helper_->RenderbufferStorage(target, internalformat, width, height);
@@ -543,11 +545,11 @@ void SampleCoverage(GLclampf value, GLboolean invert) {
void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) {
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glScissor: width < 0");
return;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glScissor: height < 0");
return;
}
helper_->Scissor(x, y, width, height);
@@ -734,11 +736,11 @@ void VertexAttribPointer(
void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) {
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glViewport: width < 0");
return;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glViewport: height < 0");
return;
}
helper_->Viewport(x, y, width, height);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 05e5968..fc9032a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -729,7 +729,7 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
GLenum GetGLError();
// Sets our wrapper for the GLError.
- void SetGLError(GLenum error);
+ void SetGLError(GLenum error, const char* msg);
// Copies the real GL errors to the wrapper. This is so we can
// make sure there are no native GL errors before calling some GL function
@@ -882,6 +882,9 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
scoped_ptr<Callback0::Type> swap_buffers_callback_;
+ // The last error message set.
+ std::string last_error_;
+
DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl);
};
@@ -1673,7 +1676,7 @@ error::Error GLES2DecoderImpl::DoCommand(
GLenum error;
while ((error = glGetError()) != GL_NO_ERROR) {
// TODO(gman): Change output to something useful for NaCl.
- SetGLError(error);
+ SetGLError(error, NULL);
printf("GL ERROR b4: %s\n", GetCommandName(command));
}
}
@@ -1720,7 +1723,7 @@ bool GLES2DecoderImpl::ValidateGLenumCompressedTextureInternalFormat(GLenum) {
void GLES2DecoderImpl::DoActiveTexture(GLenum texture_unit) {
GLuint texture_index = texture_unit - GL_TEXTURE0;
if (texture_index > group_->max_texture_units()) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glActiveTexture: texture_unit out of range.");
return;
}
active_texture_unit_ = texture_index;
@@ -1743,7 +1746,8 @@ void GLES2DecoderImpl::DoBindBuffer(GLenum target, GLuint client_id) {
// Check the buffer exists
// Check that we are not trying to bind it to a different target.
if ((info->target() != 0 && info->target() != target)) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glBindBuffer: buffer bound to more than 1 target");
return;
}
if (info->target() == 0) {
@@ -1824,7 +1828,8 @@ void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) {
// Check the texture exists
// Check that we are not trying to bind it to a different target.
if (info->target() != 0 && info->target() != target) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glBindTexture: texture bound to more than 1 target.");
return;
}
if (info->target() == 0) {
@@ -1851,7 +1856,8 @@ void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) {
vertex_attrib_infos_[index].set_enabled(false);
glDisableVertexAttribArray(index);
} else {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE,
+ "glDisableVertexAttribArray: index out of range");
}
}
@@ -1860,14 +1866,16 @@ void GLES2DecoderImpl::DoEnableVertexAttribArray(GLuint index) {
vertex_attrib_infos_[index].set_enabled(true);
glEnableVertexAttribArray(index);
} else {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE,
+ "glEnableVertexAttribArray: index out of range");
}
}
void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) {
TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
if (!info || !info->MarkMipmapsGenerated()) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glGenerateMipmaps: Can not generate mips for npot textures");
return;
}
glGenerateMipmapEXT(target);
@@ -1963,7 +1971,7 @@ void GLES2DecoderImpl::DoGetProgramiv(
GLuint program_id, GLenum pname, GLint* params) {
ProgramManager::ProgramInfo* info = GetProgramInfo(program_id);
if (!info) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_VALUE, "glGetProgramiv: unknown program");
return;
}
info->GetProgramiv(pname, params);
@@ -1973,7 +1981,7 @@ error::Error GLES2DecoderImpl::HandleBindAttribLocation(
uint32 immediate_data_size, const gles2::BindAttribLocation& c) {
ProgramManager::ProgramInfo* info = GetProgramInfo(c.program);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glBindAttribLocation: unknown program");
return error::kNoError;
}
GLuint index = static_cast<GLuint>(c.index);
@@ -1992,7 +2000,7 @@ error::Error GLES2DecoderImpl::HandleBindAttribLocationImmediate(
uint32 immediate_data_size, const gles2::BindAttribLocationImmediate& c) {
ProgramManager::ProgramInfo* info = GetProgramInfo(c.program);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glBindAttribLocation: unknown program");
return error::kNoError;
}
GLuint index = static_cast<GLuint>(c.index);
@@ -2011,7 +2019,7 @@ error::Error GLES2DecoderImpl::HandleBindAttribLocationBucket(
uint32 immediate_data_size, const gles2::BindAttribLocationBucket& c) {
ProgramManager::ProgramInfo* info = GetProgramInfo(c.program);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glBindAttribLocation: unknown program");
return error::kNoError;
}
GLuint index = static_cast<GLuint>(c.index);
@@ -2034,7 +2042,7 @@ error::Error GLES2DecoderImpl::HandleDeleteShader(
glDeleteShader(info->service_id());
RemoveShaderInfo(client_id);
} else {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDeleteShader: unknown shader");
}
}
return error::kNoError;
@@ -2049,7 +2057,7 @@ error::Error GLES2DecoderImpl::HandleDeleteProgram(
glDeleteProgram(info->service_id());
RemoveProgramInfo(client_id);
} else {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDeleteProgram: unknown program");
}
}
return error::kNoError;
@@ -2071,7 +2079,8 @@ void GLES2DecoderImpl::DoFramebufferRenderbuffer(
GLenum target, GLenum attachment, GLenum renderbuffertarget,
GLuint client_renderbuffer_id) {
if (!bound_framebuffer_) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glFramebufferRenderbuffer: no framebuffer bound");
return;
}
GLuint service_id = 0;
@@ -2079,7 +2088,8 @@ void GLES2DecoderImpl::DoFramebufferRenderbuffer(
RenderbufferManager::RenderbufferInfo* info =
GetRenderbufferInfo(client_renderbuffer_id);
if (!info) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glFramebufferRenderbuffer: unknown renderbuffer");
return;
}
service_id = info->service_id();
@@ -2099,14 +2109,16 @@ void GLES2DecoderImpl::DoFramebufferTexture2D(
GLenum target, GLenum attachment, GLenum textarget,
GLuint client_texture_id, GLint level) {
if (!bound_framebuffer_) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glFramebufferTexture2D: no framebuffer bound.");
return;
}
GLuint service_id = 0;
if (client_texture_id) {
TextureManager::TextureInfo* info = GetTextureInfo(client_texture_id);
if (!info) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glFramebufferTexture2D: unknown texture");
return;
}
service_id = info->service_id();
@@ -2117,7 +2129,8 @@ void GLES2DecoderImpl::DoFramebufferTexture2D(
void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv(
GLenum target, GLenum attachment, GLenum pname, GLint* params) {
if (!bound_framebuffer_) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glFramebufferAttachmentParameteriv: no framebuffer bound");
return;
}
glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params);
@@ -2126,7 +2139,8 @@ void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv(
void GLES2DecoderImpl::DoGetRenderbufferParameteriv(
GLenum target, GLenum pname, GLint* params) {
if (!bound_renderbuffer_) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glGetRenderbufferParameteriv: no renderbuffer bound");
return;
}
glGetRenderbufferParameterivEXT(target, pname, params);
@@ -2135,7 +2149,8 @@ void GLES2DecoderImpl::DoGetRenderbufferParameteriv(
void GLES2DecoderImpl::DoRenderbufferStorage(
GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
if (!bound_renderbuffer_) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glGetRenderbufferStorage: no renderbuffer bound");
return;
}
glRenderbufferStorageEXT(target, internalformat, width, height);
@@ -2144,7 +2159,7 @@ void GLES2DecoderImpl::DoRenderbufferStorage(
void GLES2DecoderImpl::DoLinkProgram(GLuint program) {
ProgramManager::ProgramInfo* info = GetProgramInfo(program);
if (!info) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glLinkProgram: unknown program");
return;
}
CopyRealGLErrorsToWrapper();
@@ -2152,7 +2167,7 @@ void GLES2DecoderImpl::DoLinkProgram(GLuint program) {
GLenum error = glGetError();
if (error != GL_NO_ERROR) {
info->Reset();
- SetGLError(error);
+ SetGLError(error, NULL);
} else {
info->Update();
}
@@ -2162,7 +2177,7 @@ void GLES2DecoderImpl::DoTexParameterf(
GLenum target, GLenum pname, GLfloat param) {
TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexParameterf: unknown texture");
} else {
info->SetParameter(pname, static_cast<GLint>(param));
glTexParameterf(target, pname, param);
@@ -2173,7 +2188,7 @@ void GLES2DecoderImpl::DoTexParameteri(
GLenum target, GLenum pname, GLint param) {
TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexParameteri: unknown texture");
} else {
info->SetParameter(pname, param);
glTexParameteri(target, pname, param);
@@ -2184,7 +2199,7 @@ void GLES2DecoderImpl::DoTexParameterfv(
GLenum target, GLenum pname, const GLfloat* params) {
TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexParameterfv: unknown texture");
} else {
info->SetParameter(pname, *reinterpret_cast<const GLint*>(params));
glTexParameterfv(target, pname, params);
@@ -2195,7 +2210,7 @@ void GLES2DecoderImpl::DoTexParameteriv(
GLenum target, GLenum pname, const GLint* params) {
TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexParameteriv: unknown texture");
} else {
info->SetParameter(pname, *params);
glTexParameteriv(target, pname, params);
@@ -2205,7 +2220,7 @@ void GLES2DecoderImpl::DoTexParameteriv(
void GLES2DecoderImpl::DoUniform1i(GLint location, GLint v0) {
if (!current_program_ || current_program_->IsDeleted()) {
// The program does not exist.
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glUniform1i: no program in use");
return;
}
current_program_->SetSamplers(location, 1, &v0);
@@ -2216,7 +2231,7 @@ void GLES2DecoderImpl::DoUniform1iv(
GLint location, GLsizei count, const GLint *value) {
if (!current_program_ || current_program_->IsDeleted()) {
// The program does not exist.
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glUniform1iv: no program in use");
return;
}
current_program_->SetSamplers(location, count, value);
@@ -2229,12 +2244,12 @@ void GLES2DecoderImpl::DoUseProgram(GLuint program) {
if (program) {
info = GetProgramInfo(program);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUseProgram: unknown program");
return;
}
if (!info->IsValid()) {
// Program was not linked successfully. (ie, glLinkProgram)
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glUseProgram: program not linked");
return;
}
service_id = info->service_id();
@@ -2262,14 +2277,18 @@ GLenum GLES2DecoderImpl::GetGLError() {
return error;
}
-void GLES2DecoderImpl::SetGLError(GLenum error) {
+void GLES2DecoderImpl::SetGLError(GLenum error, const char* msg) {
+ if (msg) {
+ last_error_ = msg;
+ DLOG(ERROR) << last_error_;
+ }
error_bits_ |= GLES2Util::GLErrorToErrorBit(error);
}
void GLES2DecoderImpl::CopyRealGLErrorsToWrapper() {
GLenum error;
while ((error = glGetError()) != GL_NO_ERROR) {
- SetGLError(error);
+ SetGLError(error, NULL);
}
}
@@ -2386,7 +2405,8 @@ bool GLES2DecoderImpl::IsDrawValid(GLuint max_vertex_accessed) {
}
DCHECK_LT(static_cast<GLuint>(location), group_->max_vertex_attribs());
if (!vertex_attrib_infos_[location].CanAccess(max_vertex_accessed)) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glDrawXXX: attempt to access out of range vertices");
return false;
}
}
@@ -2397,34 +2417,48 @@ error::Error GLES2DecoderImpl::HandleDrawElements(
uint32 immediate_data_size, const gles2::DrawElements& c) {
if (!bound_element_array_buffer_ ||
bound_element_array_buffer_->IsDeleted()) {
- SetGLError(GL_INVALID_OPERATION);
- } else {
- GLenum mode = c.mode;
- GLsizei count = c.count;
- GLenum type = c.type;
- int32 offset = c.index_offset;
- if (count < 0 || offset < 0) {
- SetGLError(GL_INVALID_VALUE);
- } else if (!ValidateGLenumDrawMode(mode) ||
- !ValidateGLenumIndexType(type)) {
- SetGLError(GL_INVALID_ENUM);
- } else {
- GLuint max_vertex_accessed;
- if (!bound_element_array_buffer_->GetMaxValueForRange(
- offset, count, type, &max_vertex_accessed)) {
- SetGLError(GL_INVALID_OPERATION);
- } else {
- if (IsDrawValid(max_vertex_accessed)) {
- bool has_non_renderable_textures;
- SetBlackTextureForNonRenderableTextures(
- &has_non_renderable_textures);
- const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset);
- glDrawElements(mode, count, type, indices);
- if (has_non_renderable_textures) {
- RestoreStateForNonRenderableTextures();
- }
- }
- }
+ SetGLError(GL_INVALID_OPERATION,
+ "glDrawElements: No element array buffer bound");
+ return error::kNoError;
+ }
+
+ GLenum mode = c.mode;
+ GLsizei count = c.count;
+ GLenum type = c.type;
+ int32 offset = c.index_offset;
+ if (count < 0) {
+ SetGLError(GL_INVALID_VALUE, "glDrawElements: count < 0");
+ return error::kNoError;
+ }
+ if (offset < 0) {
+ SetGLError(GL_INVALID_VALUE, "glDrawElements: offset < 0");
+ return error::kNoError;
+ }
+ if (!ValidateGLenumDrawMode(mode)) {
+ SetGLError(GL_INVALID_ENUM, "glDrawElements: mode GL_INVALID_ENUM");
+ return error::kNoError;
+ }
+ if (!ValidateGLenumIndexType(type)) {
+ SetGLError(GL_INVALID_ENUM, "glDrawElements: type GL_INVALID_ENUM");
+ return error::kNoError;
+ }
+
+ GLuint max_vertex_accessed;
+ if (!bound_element_array_buffer_->GetMaxValueForRange(
+ offset, count, type, &max_vertex_accessed)) {
+ SetGLError(GL_INVALID_OPERATION,
+ "glDrawElements: range out of bounds for buffer");
+ return error::kNoError;
+ }
+
+ if (IsDrawValid(max_vertex_accessed)) {
+ bool has_non_renderable_textures;
+ SetBlackTextureForNonRenderableTextures(
+ &has_non_renderable_textures);
+ const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset);
+ glDrawElements(mode, count, type, indices);
+ if (has_non_renderable_textures) {
+ RestoreStateForNonRenderableTextures();
}
}
return error::kNoError;
@@ -2434,13 +2468,19 @@ GLuint GLES2DecoderImpl::DoGetMaxValueInBuffer(
GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) {
GLuint max_vertex_accessed = 0;
BufferManager::BufferInfo* info = GetBufferInfo(buffer_id);
- if (!info || info->target() != GL_ELEMENT_ARRAY_BUFFER) {
+ if (!info) {
// TODO(gman): Should this be a GL error or a command buffer error?
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_VALUE,
+ "GetMaxValueInBuffer: unknown buffer");
+ } else if (info->target() != GL_ELEMENT_ARRAY_BUFFER) {
+ // TODO(gman): Should this be a GL error or a command buffer error?
+ SetGLError(GL_INVALID_OPERATION,
+ "GetMaxValueInBuffer: buffer not element array buffer");
} else {
if (!info->GetMaxValueForRange(offset, count, type, &max_vertex_accessed)) {
// TODO(gman): Should this be a GL error or a command buffer error?
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "GetMaxValueInBuffer: range out of bounds for buffer");
}
}
return max_vertex_accessed;
@@ -2454,7 +2494,7 @@ error::Error GLES2DecoderImpl::ShaderSourceHelper(
GLuint client_id, const char* data, uint32 data_size) {
ShaderManager::ShaderInfo* info = GetShaderInfo(client_id);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glShaderSource: unknown shader");
return error::kNoError;
}
// Note: We don't actually call glShaderSource here. We wait until
@@ -2499,7 +2539,7 @@ error::Error GLES2DecoderImpl::HandleShaderSourceBucket(
void GLES2DecoderImpl::DoCompileShader(GLuint client_id) {
ShaderManager::ShaderInfo* info = GetShaderInfo(client_id);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCompileShader: unknown shader");
return;
}
// Translate GL ES 2.0 shader to Desktop GL shader and pass that to
@@ -2547,7 +2587,7 @@ void GLES2DecoderImpl::DoGetShaderiv(
GLuint shader, GLenum pname, GLint* params) {
ShaderManager::ShaderInfo* info = GetShaderInfo(shader);
if (!info) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_VALUE, "glGetShaderiv: unknown shader");
return;
}
if (pname == GL_SHADER_SOURCE_LENGTH) {
@@ -2561,12 +2601,13 @@ error::Error GLES2DecoderImpl::HandleGetShaderSource(
uint32 immediate_data_size, const gles2::GetShaderSource& c) {
GLuint shader = c.shader;
ShaderManager::ShaderInfo* info = GetShaderInfo(shader);
+ uint32 bucket_id = static_cast<uint32>(c.bucket_id);
+ Bucket* bucket = CreateBucket(bucket_id);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ bucket->SetSize(0);
+ SetGLError(GL_INVALID_VALUE, "glGetShaderSource: unknown shader");
return error::kNoError;
}
- uint32 bucket_id = static_cast<uint32>(c.bucket_id);
- Bucket* bucket = CreateBucket(bucket_id);
bucket->SetFromString(info->source());
return error::kNoError;
}
@@ -2576,7 +2617,7 @@ error::Error GLES2DecoderImpl::HandleGetProgramInfoLog(
GLuint program = c.program;
ProgramManager::ProgramInfo* info = GetProgramInfo(program);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetProgramInfoLog: unknown program");
return error::kNoError;
}
uint32 bucket_id = static_cast<uint32>(c.bucket_id);
@@ -2595,7 +2636,7 @@ error::Error GLES2DecoderImpl::HandleGetShaderInfoLog(
GLuint shader = c.shader;
ShaderManager::ShaderInfo* info = GetShaderInfo(shader);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetShaderInfoLog: unknown shader");
return error::kNoError;
}
uint32 bucket_id = static_cast<uint32>(c.bucket_id);
@@ -2637,12 +2678,12 @@ void GLES2DecoderImpl::DoAttachShader(
GLuint program_client_id, GLint shader_client_id) {
ProgramManager::ProgramInfo* program_info = GetProgramInfo(program_client_id);
if (!program_info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glAttachShader: unknown program");
return;
}
ShaderManager::ShaderInfo* shader_info = GetShaderInfo(shader_client_id);
if (!shader_info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glAttachShader: unknown shader");
return;
}
glAttachShader(program_info->service_id(), shader_info->service_id());
@@ -2652,12 +2693,12 @@ void GLES2DecoderImpl::DoDetachShader(
GLuint program_client_id, GLint shader_client_id) {
ProgramManager::ProgramInfo* program_info = GetProgramInfo(program_client_id);
if (!program_info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDetachShader: unknown program");
return;
}
ShaderManager::ShaderInfo* shader_info = GetShaderInfo(shader_client_id);
if (!shader_info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDetachShader: unknown shader");
return;
}
glDetachShader(program_info->service_id(), shader_info->service_id());
@@ -2666,7 +2707,7 @@ void GLES2DecoderImpl::DoDetachShader(
void GLES2DecoderImpl::DoValidateProgram(GLuint program_client_id) {
ProgramManager::ProgramInfo* info = GetProgramInfo(program_client_id);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glValidateProgram: unknown program");
return;
}
glValidateProgram(info->service_id());
@@ -2674,42 +2715,63 @@ void GLES2DecoderImpl::DoValidateProgram(GLuint program_client_id) {
error::Error GLES2DecoderImpl::HandleVertexAttribPointer(
uint32 immediate_data_size, const gles2::VertexAttribPointer& c) {
- if (bound_array_buffer_ && !bound_array_buffer_->IsDeleted()) {
- GLuint indx = c.indx;
- GLint size = c.size;
- GLenum type = c.type;
- GLboolean normalized = c.normalized;
- GLsizei stride = c.stride;
- GLsizei offset = c.offset;
- const void* ptr = reinterpret_cast<const void*>(offset);
- if (!ValidateGLenumVertexAttribType(type) ||
- !ValidateGLintVertexAttribSize(size)) {
- SetGLError(GL_INVALID_ENUM);
- return error::kNoError;
- }
- if (indx >= group_->max_vertex_attribs() ||
- stride < 0 ||
- offset < 0) {
- SetGLError(GL_INVALID_VALUE);
- return error::kNoError;
- }
- GLsizei component_size =
- GLES2Util::GetGLTypeSizeForTexturesAndBuffers(type);
- GLsizei real_stride = stride != 0 ? stride : component_size * size;
- if (offset % component_size > 0) {
- SetGLError(GL_INVALID_VALUE);
- return error::kNoError;
- }
- vertex_attrib_infos_[indx].SetInfo(
- bound_array_buffer_,
- size,
- type,
- real_stride,
- offset);
- glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
- } else {
- SetGLError(GL_INVALID_VALUE);
+ if (!bound_array_buffer_ || bound_array_buffer_->IsDeleted()) {
+ SetGLError(GL_INVALID_VALUE,
+ "glVertexAttribPointer: no array buffer bound");
+ return error::kNoError;
}
+
+ GLuint indx = c.indx;
+ GLint size = c.size;
+ GLenum type = c.type;
+ GLboolean normalized = c.normalized;
+ GLsizei stride = c.stride;
+ GLsizei offset = c.offset;
+ const void* ptr = reinterpret_cast<const void*>(offset);
+ if (!ValidateGLenumVertexAttribType(type)) {
+ SetGLError(GL_INVALID_ENUM,
+ "glVertexAttribPointer: type GL_INVALID_ENUM");
+ return error::kNoError;
+ }
+ if (!ValidateGLintVertexAttribSize(size)) {
+ SetGLError(GL_INVALID_ENUM,
+ "glVertexAttribPointer: size GL_INVALID_VALUE");
+ return error::kNoError;
+ }
+ if (indx >= group_->max_vertex_attribs()) {
+ SetGLError(GL_INVALID_VALUE, "glVertexAttribPointer: index out of range");
+ return error::kNoError;
+ }
+ if (stride < 0) {
+ SetGLError(GL_INVALID_VALUE,
+ "glVertexAttribPointer: stride < 0");
+ return error::kNoError;
+ }
+ if (stride > 255) {
+ SetGLError(GL_INVALID_VALUE,
+ "glVertexAttribPointer: stride > 255");
+ return error::kNoError;
+ }
+ if (offset < 0) {
+ SetGLError(GL_INVALID_VALUE,
+ "glVertexAttribPointer: offset < 0");
+ return error::kNoError;
+ }
+ GLsizei component_size =
+ GLES2Util::GetGLTypeSizeForTexturesAndBuffers(type);
+ GLsizei real_stride = stride != 0 ? stride : component_size * size;
+ if (offset % component_size > 0) {
+ SetGLError(GL_INVALID_VALUE,
+ "glVertexAttribPointer: stride not valid for type");
+ return error::kNoError;
+ }
+ vertex_attrib_infos_[indx].SetInfo(
+ bound_array_buffer_,
+ size,
+ type,
+ real_stride,
+ offset);
+ glVertexAttribPointer(indx, size, type, normalized, stride, ptr);
return error::kNoError;
}
@@ -2722,7 +2784,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels(
GLenum format = c.format;
GLenum type = c.type;
if (width < 0 || height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions < 0");
return error::kNoError;
}
typedef gles2::ReadPixels::Result Result;
@@ -2739,9 +2801,12 @@ error::Error GLES2DecoderImpl::HandleReadPixels(
return error::kOutOfBounds;
}
- if (!ValidateGLenumReadPixelFormat(format) ||
- !ValidateGLenumPixelType(type)) {
- SetGLError(GL_INVALID_ENUM);
+ if (!ValidateGLenumReadPixelFormat(format)) {
+ SetGLError(GL_INVALID_ENUM, "glReadPixels: format GL_INVALID_ENUM");
+ return error::kNoError;
+ }
+ if (!ValidateGLenumPixelType(type)) {
+ SetGLError(GL_INVALID_ENUM, "glReadPixels: type GL_INVALID_ENUM");
return error::kNoError;
}
if (width == 0 || height == 0) {
@@ -2756,7 +2821,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels(
GLint max_x;
GLint max_y;
if (!SafeAdd(x, width, &max_x) || !SafeAdd(y, height, &max_y)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range");
return error::kNoError;
}
@@ -2766,18 +2831,18 @@ error::Error GLES2DecoderImpl::HandleReadPixels(
uint32 temp_size;
if (!GLES2Util::ComputeImageDataSize(
width, 1, format, type, pack_alignment_, &temp_size)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range");
return error::kNoError;
}
GLsizei unpadded_row_size = temp_size;
if (!GLES2Util::ComputeImageDataSize(
width, 2, format, type, pack_alignment_, &temp_size)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range");
return error::kNoError;
}
GLsizei padded_row_size = temp_size - unpadded_row_size;
if (padded_row_size < 0 || unpadded_row_size < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range");
return error::kNoError;
}
@@ -2785,7 +2850,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels(
uint32 dest_row_offset;
if (!GLES2Util::ComputeImageDataSize(
dest_x_offset, 1, format, type, pack_alignment_, &dest_row_offset)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range");
return error::kNoError;
}
@@ -2814,7 +2879,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels(
if (error == GL_NO_ERROR) {
*result = true;
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -2824,11 +2889,11 @@ error::Error GLES2DecoderImpl::HandlePixelStorei(
GLenum pname = c.pname;
GLenum param = c.param;
if (!ValidateGLenumPixelStore(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glPixelStorei: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLintPixelStoreAlignment(param)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glPixelSTore: param GL_INVALID_VALUE");
return error::kNoError;
}
glPixelStorei(pname, param);
@@ -2852,11 +2917,11 @@ error::Error GLES2DecoderImpl::GetAttribLocationHelper(
const std::string& name_str) {
ProgramManager::ProgramInfo* info = GetProgramInfo(client_id);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetAttribLocation: unknown program");
return error::kNoError;
}
if (!info->IsValid()) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glGetAttribLocation: program not linked");
return error::kNoError;
}
GLint* location = GetSharedMemoryAs<GLint*>(
@@ -2916,11 +2981,12 @@ error::Error GLES2DecoderImpl::GetUniformLocationHelper(
const std::string& name_str) {
ProgramManager::ProgramInfo* info = GetProgramInfo(client_id);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetUniformLocation: unknown program");
return error::kNoError;
}
if (!info->IsValid()) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glGetUniformLocation: program not linked");
return error::kNoError;
}
GLint* location = GetSharedMemoryAs<GLint*>(
@@ -2979,7 +3045,7 @@ error::Error GLES2DecoderImpl::HandleGetString(
uint32 immediate_data_size, const gles2::GetString& c) {
GLenum name = static_cast<GLenum>(c.name);
if (!ValidateGLenumStringType(name)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetString: name GL_INVALID_ENUM");
return error::kNoError;
}
const char* gl_str = reinterpret_cast<const char*>(glGetString(name));
@@ -3005,18 +3071,21 @@ error::Error GLES2DecoderImpl::HandleGetString(
void GLES2DecoderImpl::DoBufferData(
GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) {
- if (!ValidateGLenumBufferTarget(target) ||
- !ValidateGLenumBufferUsage(usage)) {
- SetGLError(GL_INVALID_ENUM);
+ if (!ValidateGLenumBufferTarget(target)) {
+ SetGLError(GL_INVALID_ENUM, "glBufferData: target GL_INVALID_ENUM");
+ return;
+ }
+ if (!ValidateGLenumBufferUsage(usage)) {
+ SetGLError(GL_INVALID_ENUM, "glBufferData: usage GL_INVALID_ENUM");
return;
}
if (size < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glBufferData: size < 0");
return;
}
BufferManager::BufferInfo* info = GetBufferInfoForTarget(target);
if (!info) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_VALUE, "glBufferData: unknown buffer");
return;
}
// Clear the buffer to 0 if no initial data was passed in.
@@ -3030,7 +3099,7 @@ void GLES2DecoderImpl::DoBufferData(
glBufferData(target, size, data, usage);
GLenum error = glGetError();
if (error != GL_NO_ERROR) {
- SetGLError(error);
+ SetGLError(error, NULL);
} else {
info->SetSize(size);
info->SetRange(0, size, data);
@@ -3073,11 +3142,11 @@ void GLES2DecoderImpl::DoBufferSubData(
GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) {
BufferManager::BufferInfo* info = GetBufferInfoForTarget(target);
if (!info) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_VALUE, "glBufferSubData: unknown buffer");
return;
}
if (!info->SetRange(offset, size, data)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glBufferSubData: out of range");
} else {
glBufferSubData(target, offset, size, data);
}
@@ -3093,19 +3162,26 @@ error::Error GLES2DecoderImpl::DoCompressedTexImage2D(
GLsizei image_size,
const void* data) {
// TODO(gman): Validate image_size is correct for width, height and format.
- if (!ValidateGLenumTextureTarget(target) ||
- !ValidateGLenumCompressedTextureInternalFormat(internal_format)) {
- SetGLError(GL_INVALID_ENUM);
+ if (!ValidateGLenumTextureTarget(target)) {
+ SetGLError(GL_INVALID_ENUM,
+ "glCompressedTexImage2D: target GL_INVALID_ENUM");
+ return error::kNoError;
+ }
+ if (!ValidateGLenumCompressedTextureInternalFormat(internal_format)) {
+ SetGLError(GL_INVALID_ENUM,
+ "glCompressedTexImage2D: internal_format GL_INVALID_ENUM");
return error::kNoError;
}
if (!texture_manager()->ValidForTarget(target, level, width, height, 1) ||
border != 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE,
+ "glCompressedTexImage2D: dimensions out of range");
return error::kNoError;
}
TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
if (!info) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_VALUE,
+ "glCompressedTexImage2D: unknown texture target");
return error::kNoError;
}
scoped_array<int8> zero;
@@ -3173,21 +3249,32 @@ error::Error GLES2DecoderImpl::DoTexImage2D(
GLenum type,
const void* pixels,
uint32 pixels_size) {
- if (!ValidateGLenumTextureTarget(target) ||
- !ValidateGLenumTextureFormat(internal_format) ||
- !ValidateGLenumTextureFormat(format) ||
- !ValidateGLenumPixelType(type)) {
- SetGLError(GL_INVALID_ENUM);
+ if (!ValidateGLenumTextureTarget(target)) {
+ SetGLError(GL_INVALID_ENUM, "glTexImage2D: target GL_INVALID_ENUM");
+ return error::kNoError;
+ }
+ if (!ValidateGLenumTextureFormat(internal_format)) {
+ SetGLError(GL_INVALID_ENUM,
+ "glTexImage2D: internal_format GL_INVALID_ENUM");
+ return error::kNoError;
+ }
+ if (!ValidateGLenumTextureFormat(format)) {
+ SetGLError(GL_INVALID_ENUM, "glTexImage2D: format GL_INVALID_ENUM");
+ return error::kNoError;
+ }
+ if (!ValidateGLenumPixelType(type)) {
+ SetGLError(GL_INVALID_ENUM, "glTexImage2D: type GL_INVALID_ENUM");
return error::kNoError;
}
if (!texture_manager()->ValidForTarget(target, level, width, height, 1) ||
border != 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexImage2D: dimensions out of range");
return error::kNoError;
}
TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
if (!info) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION,
+ "glTexImage2D: unknown texture for target");
return error::kNoError;
}
scoped_array<int8> zero;
@@ -3275,11 +3362,13 @@ error::Error GLES2DecoderImpl::HandleGetVertexAttribPointerv(
return error::kInvalidArguments;
}
if (!ValidateGLenumVertexPointer(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM,
+ "glGetVertexAttribPointerv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (index >= group_->max_vertex_attribs()) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE,
+ "glGetVertexAttribPointerv: index out of range.");
return error::kNoError;
}
result->SetNumResults(1);
@@ -3305,24 +3394,24 @@ bool GLES2DecoderImpl::GetUniformSetup(
result->SetNumResults(0);
ProgramManager::ProgramInfo* info = GetProgramInfo(program);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetUniform: unknown program");
return false;
}
if (!info->IsValid()) {
// Program was not linked successfully. (ie, glLinkProgram)
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glGetUniform: program not linked");
return false;
}
*service_id = info->service_id();
GLenum type;
if (!info->GetUniformTypeByLocation(location, &type)) {
// No such location.
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glGetUniform: unknown location");
return false;
}
GLsizei size = GLES2Util::GetGLDataTypeSizeForUniforms(type);
if (size == 0) {
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glGetUniform: unknown type");
return false;
}
result = GetSharedMemoryAs<SizedResult<GLint>*>(
@@ -3385,29 +3474,35 @@ error::Error GLES2DecoderImpl::HandleGetShaderPrecisionFormat(
if (result->success != 0) {
return error::kInvalidArguments;
}
- if (!ValidateGLenumShaderType(shader_type) ||
- !ValidateGLenumShaderPrecision(precision_type)) {
- SetGLError(GL_INVALID_ENUM);
- } else {
- result->success = 1; // true
- switch (precision_type) {
- case GL_LOW_INT:
- case GL_MEDIUM_INT:
- case GL_HIGH_INT:
- result->min_range = -31;
- result->max_range = 31;
- result->precision = 0;
- case GL_LOW_FLOAT:
- case GL_MEDIUM_FLOAT:
- case GL_HIGH_FLOAT:
- result->min_range = -62;
- result->max_range = 62;
- result->precision = -16;
- break;
- default:
- NOTREACHED();
- break;
- }
+ if (!ValidateGLenumShaderType(shader_type)) {
+ SetGLError(GL_INVALID_ENUM,
+ "glGetShaderPrecisionFormat: shader_type GL_INVALID_ENUM");
+ return error::kNoError;
+ }
+ if (!ValidateGLenumShaderPrecision(precision_type)) {
+ SetGLError(GL_INVALID_ENUM,
+ "glGetShaderPrecisionFormat: precision_type GL_INVALID_ENUM");
+ return error::kNoError;
+ }
+
+ result->success = 1; // true
+ switch (precision_type) {
+ case GL_LOW_INT:
+ case GL_MEDIUM_INT:
+ case GL_HIGH_INT:
+ result->min_range = -31;
+ result->max_range = 31;
+ result->precision = 0;
+ case GL_LOW_FLOAT:
+ case GL_MEDIUM_FLOAT:
+ case GL_HIGH_FLOAT:
+ result->min_range = -62;
+ result->max_range = 62;
+ result->precision = -16;
+ break;
+ default:
+ NOTREACHED();
+ break;
}
return error::kNoError;
}
@@ -3417,7 +3512,7 @@ error::Error GLES2DecoderImpl::HandleGetAttachedShaders(
uint32 result_size = c.result_size;
ProgramManager::ProgramInfo* info = GetProgramInfo(c.program);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetAttachedShaders: unknown program");
return error::kNoError;
}
typedef gles2::GetAttachedShaders::Result Result;
@@ -3462,18 +3557,18 @@ error::Error GLES2DecoderImpl::HandleGetActiveUniform(
}
ProgramManager::ProgramInfo* info = GetProgramInfo(program);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: unknown program");
return error::kNoError;
}
if (!info->IsValid()) {
// Program was not linked successfully. (ie, glLinkProgram)
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_OPERATION, "glGetActiveUniform: program not linked");
return error::kNoError;
}
const ProgramManager::ProgramInfo::UniformInfo* uniform_info =
info->GetUniformInfo(index);
if (!uniform_info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: index out of range");
return error::kNoError;
}
result->success = 1; // true.
@@ -3501,18 +3596,18 @@ error::Error GLES2DecoderImpl::HandleGetActiveAttrib(
}
ProgramManager::ProgramInfo* info = GetProgramInfo(program);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: unknown program");
return error::kNoError;
}
if (!info->IsValid()) {
// Program was not linked successfully. (ie, glLinkProgram)
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glGetActiveAttrib: program not linked");
return error::kNoError;
}
const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info =
info->GetAttribInfo(index);
if (!attrib_info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: index out of range");
return error::kNoError;
}
result->success = 1; // true.
@@ -3526,17 +3621,17 @@ error::Error GLES2DecoderImpl::HandleGetActiveAttrib(
error::Error GLES2DecoderImpl::HandleShaderBinary(
uint32 immediate_data_size, const gles2::ShaderBinary& c) {
#if 1 // No binary shader support.
- SetGLError(GL_INVALID_OPERATION);
+ SetGLError(GL_INVALID_OPERATION, "glShaderBinary: not supported");
return error::kNoError;
#else
GLsizei n = static_cast<GLsizei>(c.n);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glShaderBinary: n < 0");
return error::kNoError;
}
GLsizei length = static_cast<GLsizei>(c.length);
if (length < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glShaderBinary: length < 0");
return error::kNoError;
}
uint32 data_size;
@@ -3555,7 +3650,7 @@ error::Error GLES2DecoderImpl::HandleShaderBinary(
for (GLsizei ii = 0; ii < n; ++ii) {
ShaderManager::ShaderInfo* info = GetShaderInfo(shaders[ii]);
if (!info) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glShaderBinary: unknown shader");
return error::kNoError;
}
service_ids[ii] = info->service_id();
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index a1ea7da..adb7321 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -28,7 +28,7 @@ error::Error GLES2DecoderImpl::HandleBindBuffer(
GLenum target = static_cast<GLenum>(c.target);
GLuint buffer = c.buffer;
if (!ValidateGLenumBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBindBuffer: target GL_INVALID_ENUM");
return error::kNoError;
}
DoBindBuffer(target, buffer);
@@ -40,7 +40,7 @@ error::Error GLES2DecoderImpl::HandleBindFramebuffer(
GLenum target = static_cast<GLenum>(c.target);
GLuint framebuffer = c.framebuffer;
if (!ValidateGLenumFrameBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBindFramebuffer: target GL_INVALID_ENUM");
return error::kNoError;
}
DoBindFramebuffer(target, framebuffer);
@@ -52,7 +52,7 @@ error::Error GLES2DecoderImpl::HandleBindRenderbuffer(
GLenum target = static_cast<GLenum>(c.target);
GLuint renderbuffer = c.renderbuffer;
if (!ValidateGLenumRenderBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBindRenderbuffer: target GL_INVALID_ENUM");
return error::kNoError;
}
DoBindRenderbuffer(target, renderbuffer);
@@ -64,7 +64,7 @@ error::Error GLES2DecoderImpl::HandleBindTexture(
GLenum target = static_cast<GLenum>(c.target);
GLuint texture = c.texture;
if (!ValidateGLenumTextureBindTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBindTexture: target GL_INVALID_ENUM");
return error::kNoError;
}
DoBindTexture(target, texture);
@@ -85,7 +85,7 @@ error::Error GLES2DecoderImpl::HandleBlendEquation(
uint32 immediate_data_size, const gles2::BlendEquation& c) {
GLenum mode = static_cast<GLenum>(c.mode);
if (!ValidateGLenumEquation(mode)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBlendEquation: mode GL_INVALID_ENUM");
return error::kNoError;
}
glBlendEquation(mode);
@@ -97,11 +97,13 @@ error::Error GLES2DecoderImpl::HandleBlendEquationSeparate(
GLenum modeRGB = static_cast<GLenum>(c.modeRGB);
GLenum modeAlpha = static_cast<GLenum>(c.modeAlpha);
if (!ValidateGLenumEquation(modeRGB)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glBlendEquationSeparate: modeRGB GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumEquation(modeAlpha)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glBlendEquationSeparate: modeAlpha GL_INVALID_ENUM");
return error::kNoError;
}
glBlendEquationSeparate(modeRGB, modeAlpha);
@@ -113,11 +115,11 @@ error::Error GLES2DecoderImpl::HandleBlendFunc(
GLenum sfactor = static_cast<GLenum>(c.sfactor);
GLenum dfactor = static_cast<GLenum>(c.dfactor);
if (!ValidateGLenumSrcBlendFactor(sfactor)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBlendFunc: sfactor GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumDstBlendFactor(dfactor)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBlendFunc: dfactor GL_INVALID_ENUM");
return error::kNoError;
}
glBlendFunc(sfactor, dfactor);
@@ -131,19 +133,21 @@ error::Error GLES2DecoderImpl::HandleBlendFuncSeparate(
GLenum srcAlpha = static_cast<GLenum>(c.srcAlpha);
GLenum dstAlpha = static_cast<GLenum>(c.dstAlpha);
if (!ValidateGLenumSrcBlendFactor(srcRGB)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBlendFuncSeparate: srcRGB GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumDstBlendFactor(dstRGB)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBlendFuncSeparate: dstRGB GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumSrcBlendFactor(srcAlpha)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glBlendFuncSeparate: srcAlpha GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumDstBlendFactor(dstAlpha)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glBlendFuncSeparate: dstAlpha GL_INVALID_ENUM");
return error::kNoError;
}
glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
@@ -159,11 +163,11 @@ error::Error GLES2DecoderImpl::HandleBufferSubData(
const void* data = GetSharedMemoryAs<const void*>(
c.data_shm_id, c.data_shm_offset, data_size);
if (!ValidateGLenumBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBufferSubData: target GL_INVALID_ENUM");
return error::kNoError;
}
if (size < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glBufferSubData: size < 0");
return error::kNoError;
}
if (data == NULL) {
@@ -182,11 +186,11 @@ error::Error GLES2DecoderImpl::HandleBufferSubDataImmediate(
const void* data = GetImmediateDataAs<const void*>(
c, data_size, immediate_data_size);
if (!ValidateGLenumBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glBufferSubData: target GL_INVALID_ENUM");
return error::kNoError;
}
if (size < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glBufferSubData: size < 0");
return error::kNoError;
}
if (data == NULL) {
@@ -206,7 +210,8 @@ error::Error GLES2DecoderImpl::HandleCheckFramebufferStatus(
return error::kOutOfBounds;
}
if (!ValidateGLenumFrameBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glCheckFramebufferStatus: target GL_INVALID_ENUM");
return error::kNoError;
}
*result_dst = DoCheckFramebufferStatus(target);
@@ -275,19 +280,20 @@ error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2D(
const void* data = GetSharedMemoryAs<const void*>(
c.data_shm_id, c.data_shm_offset, data_size);
if (!ValidateGLenumTextureTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glCompressedTexSubImage2D: target GL_INVALID_ENUM");
return error::kNoError;
}
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: width < 0");
return error::kNoError;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: height < 0");
return error::kNoError;
}
if (imageSize < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: imageSize < 0");
return error::kNoError;
}
if (data == NULL) {
@@ -313,19 +319,20 @@ error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2DImmediate(
const void* data = GetImmediateDataAs<const void*>(
c, data_size, immediate_data_size);
if (!ValidateGLenumTextureTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glCompressedTexSubImage2D: target GL_INVALID_ENUM");
return error::kNoError;
}
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: width < 0");
return error::kNoError;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: height < 0");
return error::kNoError;
}
if (imageSize < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: imageSize < 0");
return error::kNoError;
}
if (data == NULL) {
@@ -347,15 +354,15 @@ error::Error GLES2DecoderImpl::HandleCopyTexImage2D(
GLsizei height = static_cast<GLsizei>(c.height);
GLint border = static_cast<GLint>(c.border);
if (!ValidateGLenumTextureTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glCopyTexImage2D: target GL_INVALID_ENUM");
return error::kNoError;
}
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D: width < 0");
return error::kNoError;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D: height < 0");
return error::kNoError;
}
glCopyTexImage2D(target, level, internalformat, x, y, width, height, border);
@@ -373,15 +380,15 @@ error::Error GLES2DecoderImpl::HandleCopyTexSubImage2D(
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
if (!ValidateGLenumTextureTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glCopyTexSubImage2D: target GL_INVALID_ENUM");
return error::kNoError;
}
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D: width < 0");
return error::kNoError;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D: height < 0");
return error::kNoError;
}
glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);
@@ -401,7 +408,7 @@ error::Error GLES2DecoderImpl::HandleCreateShader(
uint32 immediate_data_size, const gles2::CreateShader& c) {
GLenum type = static_cast<GLenum>(c.type);
if (!ValidateGLenumShaderType(type)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glCreateShader: type GL_INVALID_ENUM");
return error::kNoError;
}
uint32 client_id = c.client_id;
@@ -415,7 +422,7 @@ error::Error GLES2DecoderImpl::HandleCullFace(
uint32 immediate_data_size, const gles2::CullFace& c) {
GLenum mode = static_cast<GLenum>(c.mode);
if (!ValidateGLenumFaceType(mode)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glCullFace: mode GL_INVALID_ENUM");
return error::kNoError;
}
glCullFace(mode);
@@ -432,7 +439,7 @@ error::Error GLES2DecoderImpl::HandleDeleteBuffers(
const GLuint* buffers = GetSharedMemoryAs<const GLuint*>(
c.buffers_shm_id, c.buffers_shm_offset, data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDeleteBuffers: n < 0");
return error::kNoError;
}
if (buffers == NULL) {
@@ -452,7 +459,7 @@ error::Error GLES2DecoderImpl::HandleDeleteBuffersImmediate(
const GLuint* buffers = GetImmediateDataAs<const GLuint*>(
c, data_size, immediate_data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDeleteBuffers: n < 0");
return error::kNoError;
}
if (buffers == NULL) {
@@ -472,7 +479,7 @@ error::Error GLES2DecoderImpl::HandleDeleteFramebuffers(
const GLuint* framebuffers = GetSharedMemoryAs<const GLuint*>(
c.framebuffers_shm_id, c.framebuffers_shm_offset, data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDeleteFramebuffers: n < 0");
return error::kNoError;
}
if (framebuffers == NULL) {
@@ -492,7 +499,7 @@ error::Error GLES2DecoderImpl::HandleDeleteFramebuffersImmediate(
const GLuint* framebuffers = GetImmediateDataAs<const GLuint*>(
c, data_size, immediate_data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDeleteFramebuffers: n < 0");
return error::kNoError;
}
if (framebuffers == NULL) {
@@ -512,7 +519,7 @@ error::Error GLES2DecoderImpl::HandleDeleteRenderbuffers(
const GLuint* renderbuffers = GetSharedMemoryAs<const GLuint*>(
c.renderbuffers_shm_id, c.renderbuffers_shm_offset, data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDeleteRenderbuffers: n < 0");
return error::kNoError;
}
if (renderbuffers == NULL) {
@@ -532,7 +539,7 @@ error::Error GLES2DecoderImpl::HandleDeleteRenderbuffersImmediate(
const GLuint* renderbuffers = GetImmediateDataAs<const GLuint*>(
c, data_size, immediate_data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDeleteRenderbuffers: n < 0");
return error::kNoError;
}
if (renderbuffers == NULL) {
@@ -552,7 +559,7 @@ error::Error GLES2DecoderImpl::HandleDeleteTextures(
const GLuint* textures = GetSharedMemoryAs<const GLuint*>(
c.textures_shm_id, c.textures_shm_offset, data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDeleteTextures: n < 0");
return error::kNoError;
}
if (textures == NULL) {
@@ -572,7 +579,7 @@ error::Error GLES2DecoderImpl::HandleDeleteTexturesImmediate(
const GLuint* textures = GetImmediateDataAs<const GLuint*>(
c, data_size, immediate_data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDeleteTextures: n < 0");
return error::kNoError;
}
if (textures == NULL) {
@@ -586,7 +593,7 @@ error::Error GLES2DecoderImpl::HandleDepthFunc(
uint32 immediate_data_size, const gles2::DepthFunc& c) {
GLenum func = static_cast<GLenum>(c.func);
if (!ValidateGLenumCmpFunction(func)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glDepthFunc: func GL_INVALID_ENUM");
return error::kNoError;
}
glDepthFunc(func);
@@ -620,7 +627,7 @@ error::Error GLES2DecoderImpl::HandleDisable(
uint32 immediate_data_size, const gles2::Disable& c) {
GLenum cap = static_cast<GLenum>(c.cap);
if (!ValidateGLenumCapability(cap)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glDisable: cap GL_INVALID_ENUM");
return error::kNoError;
}
glDisable(cap);
@@ -640,11 +647,11 @@ error::Error GLES2DecoderImpl::HandleDrawArrays(
GLint first = static_cast<GLint>(c.first);
GLsizei count = static_cast<GLsizei>(c.count);
if (!ValidateGLenumDrawMode(mode)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glDrawArrays: mode GL_INVALID_ENUM");
return error::kNoError;
}
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glDrawArrays: count < 0");
return error::kNoError;
}
DoDrawArrays(mode, first, count);
@@ -655,7 +662,7 @@ error::Error GLES2DecoderImpl::HandleEnable(
uint32 immediate_data_size, const gles2::Enable& c) {
GLenum cap = static_cast<GLenum>(c.cap);
if (!ValidateGLenumCapability(cap)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glEnable: cap GL_INVALID_ENUM");
return error::kNoError;
}
glEnable(cap);
@@ -688,15 +695,20 @@ error::Error GLES2DecoderImpl::HandleFramebufferRenderbuffer(
GLenum renderbuffertarget = static_cast<GLenum>(c.renderbuffertarget);
GLuint renderbuffer = c.renderbuffer;
if (!ValidateGLenumFrameBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glFramebufferRenderbuffer: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumAttachment(attachment)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM,
+ "glFramebufferRenderbuffer: attachment GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumRenderBufferTarget(renderbuffertarget)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM,
+ "glFramebufferRenderbuffer: renderbuffertarget GL_INVALID_ENUM");
return error::kNoError;
}
DoFramebufferRenderbuffer(
@@ -712,15 +724,18 @@ error::Error GLES2DecoderImpl::HandleFramebufferTexture2D(
GLuint texture = c.texture;
GLint level = static_cast<GLint>(c.level);
if (!ValidateGLenumFrameBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glFramebufferTexture2D: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumAttachment(attachment)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glFramebufferTexture2D: attachment GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumTextureTarget(textarget)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glFramebufferTexture2D: textarget GL_INVALID_ENUM");
return error::kNoError;
}
DoFramebufferTexture2D(target, attachment, textarget, texture, level);
@@ -731,7 +746,7 @@ error::Error GLES2DecoderImpl::HandleFrontFace(
uint32 immediate_data_size, const gles2::FrontFace& c) {
GLenum mode = static_cast<GLenum>(c.mode);
if (!ValidateGLenumFaceMode(mode)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glFrontFace: mode GL_INVALID_ENUM");
return error::kNoError;
}
glFrontFace(mode);
@@ -748,7 +763,7 @@ error::Error GLES2DecoderImpl::HandleGenBuffers(
GLuint* buffers = GetSharedMemoryAs<GLuint*>(
c.buffers_shm_id, c.buffers_shm_offset, data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGenBuffers: n < 0");
return error::kNoError;
}
if (buffers == NULL) {
@@ -770,7 +785,7 @@ error::Error GLES2DecoderImpl::HandleGenBuffersImmediate(
GLuint* buffers = GetImmediateDataAs<GLuint*>(
c, data_size, immediate_data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGenBuffers: n < 0");
return error::kNoError;
}
if (buffers == NULL) {
@@ -786,7 +801,7 @@ error::Error GLES2DecoderImpl::HandleGenerateMipmap(
uint32 immediate_data_size, const gles2::GenerateMipmap& c) {
GLenum target = static_cast<GLenum>(c.target);
if (!ValidateGLenumTextureBindTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGenerateMipmap: target GL_INVALID_ENUM");
return error::kNoError;
}
DoGenerateMipmap(target);
@@ -803,7 +818,7 @@ error::Error GLES2DecoderImpl::HandleGenFramebuffers(
GLuint* framebuffers = GetSharedMemoryAs<GLuint*>(
c.framebuffers_shm_id, c.framebuffers_shm_offset, data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGenFramebuffers: n < 0");
return error::kNoError;
}
if (framebuffers == NULL) {
@@ -825,7 +840,7 @@ error::Error GLES2DecoderImpl::HandleGenFramebuffersImmediate(
GLuint* framebuffers = GetImmediateDataAs<GLuint*>(
c, data_size, immediate_data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGenFramebuffers: n < 0");
return error::kNoError;
}
if (framebuffers == NULL) {
@@ -847,7 +862,7 @@ error::Error GLES2DecoderImpl::HandleGenRenderbuffers(
GLuint* renderbuffers = GetSharedMemoryAs<GLuint*>(
c.renderbuffers_shm_id, c.renderbuffers_shm_offset, data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGenRenderbuffers: n < 0");
return error::kNoError;
}
if (renderbuffers == NULL) {
@@ -869,7 +884,7 @@ error::Error GLES2DecoderImpl::HandleGenRenderbuffersImmediate(
GLuint* renderbuffers = GetImmediateDataAs<GLuint*>(
c, data_size, immediate_data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGenRenderbuffers: n < 0");
return error::kNoError;
}
if (renderbuffers == NULL) {
@@ -891,7 +906,7 @@ error::Error GLES2DecoderImpl::HandleGenTextures(
GLuint* textures = GetSharedMemoryAs<GLuint*>(
c.textures_shm_id, c.textures_shm_offset, data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGenTextures: n < 0");
return error::kNoError;
}
if (textures == NULL) {
@@ -913,7 +928,7 @@ error::Error GLES2DecoderImpl::HandleGenTexturesImmediate(
GLuint* textures = GetImmediateDataAs<GLuint*>(
c, data_size, immediate_data_size);
if (n < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGenTextures: n < 0");
return error::kNoError;
}
if (textures == NULL) {
@@ -931,14 +946,14 @@ error::Error GLES2DecoderImpl::HandleGetBooleanv(
typedef GetBooleanv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetBooleanv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLboolean* params = result ? result->GetData() : NULL;
if (!ValidateGLenumGLState(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetBooleanv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -954,7 +969,7 @@ error::Error GLES2DecoderImpl::HandleGetBooleanv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -966,18 +981,20 @@ error::Error GLES2DecoderImpl::HandleGetBufferParameteriv(
typedef GetBufferParameteriv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetBufferParameteriv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
if (!ValidateGLenumBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glGetBufferParameteriv: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumBufferParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glGetBufferParameteriv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -993,7 +1010,7 @@ error::Error GLES2DecoderImpl::HandleGetBufferParameteriv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1016,14 +1033,14 @@ error::Error GLES2DecoderImpl::HandleGetFloatv(
typedef GetFloatv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetFloatv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLfloat* params = result ? result->GetData() : NULL;
if (!ValidateGLenumGLState(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetFloatv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1039,7 +1056,7 @@ error::Error GLES2DecoderImpl::HandleGetFloatv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1053,22 +1070,30 @@ error::Error GLES2DecoderImpl::HandleGetFramebufferAttachmentParameteriv(
typedef GetFramebufferAttachmentParameteriv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameteriv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
if (!ValidateGLenumFrameBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameteriv: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumAttachment(attachment)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameteriv: attachment GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumFrameBufferParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM,
+ "glGetFramebufferAttachmentParameteriv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1084,7 +1109,7 @@ error::Error GLES2DecoderImpl::HandleGetFramebufferAttachmentParameteriv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1095,14 +1120,14 @@ error::Error GLES2DecoderImpl::HandleGetIntegerv(
typedef GetIntegerv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetIntegerv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
if (!ValidateGLenumGLState(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetIntegerv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1118,7 +1143,7 @@ error::Error GLES2DecoderImpl::HandleGetIntegerv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1130,14 +1155,14 @@ error::Error GLES2DecoderImpl::HandleGetProgramiv(
typedef GetProgramiv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetProgramiv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
if (!ValidateGLenumProgramParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetProgramiv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1153,7 +1178,7 @@ error::Error GLES2DecoderImpl::HandleGetProgramiv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1165,18 +1190,22 @@ error::Error GLES2DecoderImpl::HandleGetRenderbufferParameteriv(
typedef GetRenderbufferParameteriv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetRenderbufferParameteriv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
if (!ValidateGLenumRenderBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM,
+ "glGetRenderbufferParameteriv: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumRenderBufferParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM,
+ "glGetRenderbufferParameteriv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1192,7 +1221,7 @@ error::Error GLES2DecoderImpl::HandleGetRenderbufferParameteriv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1204,14 +1233,14 @@ error::Error GLES2DecoderImpl::HandleGetShaderiv(
typedef GetShaderiv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetShaderiv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
if (!ValidateGLenumShaderParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetShaderiv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1227,7 +1256,7 @@ error::Error GLES2DecoderImpl::HandleGetShaderiv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1239,18 +1268,18 @@ error::Error GLES2DecoderImpl::HandleGetTexParameterfv(
typedef GetTexParameterfv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetTexParameterfv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLfloat* params = result ? result->GetData() : NULL;
if (!ValidateGLenumTextureTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetTexParameterfv: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumTextureParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetTexParameterfv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1266,7 +1295,7 @@ error::Error GLES2DecoderImpl::HandleGetTexParameterfv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1278,18 +1307,18 @@ error::Error GLES2DecoderImpl::HandleGetTexParameteriv(
typedef GetTexParameteriv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetTexParameteriv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
if (!ValidateGLenumTextureTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetTexParameteriv: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumTextureParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetTexParameteriv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1305,7 +1334,7 @@ error::Error GLES2DecoderImpl::HandleGetTexParameteriv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1317,14 +1346,14 @@ error::Error GLES2DecoderImpl::HandleGetVertexAttribfv(
typedef GetVertexAttribfv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetVertexAttribfv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLfloat* params = result ? result->GetData() : NULL;
if (!ValidateGLenumVertexAttribute(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetVertexAttribfv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1340,7 +1369,7 @@ error::Error GLES2DecoderImpl::HandleGetVertexAttribfv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1352,14 +1381,14 @@ error::Error GLES2DecoderImpl::HandleGetVertexAttribiv(
typedef GetVertexAttribiv::Result Result;
GLsizei num_values = util_.GLGetNumValuesReturned(pname);
if (num_values == 0) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetVertexAttribiv: invalid enum");
return error::kNoError;
}
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
if (!ValidateGLenumVertexAttribute(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetVertexAttribiv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1375,7 +1404,7 @@ error::Error GLES2DecoderImpl::HandleGetVertexAttribiv(
if (error == GL_NO_ERROR) {
result->SetNumResults(num_values);
} else {
- SetGLError(error);
+ SetGLError(error, NULL);
}
return error::kNoError;
}
@@ -1385,11 +1414,11 @@ error::Error GLES2DecoderImpl::HandleHint(
GLenum target = static_cast<GLenum>(c.target);
GLenum mode = static_cast<GLenum>(c.mode);
if (!ValidateGLenumHintTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glHint: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumHintMode(mode)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glHint: mode GL_INVALID_ENUM");
return error::kNoError;
}
glHint(target, mode);
@@ -1419,7 +1448,7 @@ error::Error GLES2DecoderImpl::HandleIsEnabled(
return error::kOutOfBounds;
}
if (!ValidateGLenumCapability(cap)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glIsEnabled: cap GL_INVALID_ENUM");
return error::kNoError;
}
*result_dst = glIsEnabled(cap);
@@ -1526,19 +1555,22 @@ error::Error GLES2DecoderImpl::HandleRenderbufferStorage(
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
if (!ValidateGLenumRenderBufferTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM, "glRenderbufferStorage: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumRenderBufferFormat(internalformat)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(
+ GL_INVALID_ENUM,
+ "glRenderbufferStorage: internalformat GL_INVALID_ENUM");
return error::kNoError;
}
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage: width < 0");
return error::kNoError;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage: height < 0");
return error::kNoError;
}
DoRenderbufferStorage(target, internalformat, width, height);
@@ -1560,11 +1592,11 @@ error::Error GLES2DecoderImpl::HandleScissor(
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glScissor: width < 0");
return error::kNoError;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glScissor: height < 0");
return error::kNoError;
}
glScissor(x, y, width, height);
@@ -1577,7 +1609,7 @@ error::Error GLES2DecoderImpl::HandleStencilFunc(
GLint ref = static_cast<GLint>(c.ref);
GLuint mask = static_cast<GLuint>(c.mask);
if (!ValidateGLenumCmpFunction(func)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilFunc: func GL_INVALID_ENUM");
return error::kNoError;
}
glStencilFunc(func, ref, mask);
@@ -1591,11 +1623,11 @@ error::Error GLES2DecoderImpl::HandleStencilFuncSeparate(
GLint ref = static_cast<GLint>(c.ref);
GLuint mask = static_cast<GLuint>(c.mask);
if (!ValidateGLenumFaceType(face)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilFuncSeparate: face GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumCmpFunction(func)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilFuncSeparate: func GL_INVALID_ENUM");
return error::kNoError;
}
glStencilFuncSeparate(face, func, ref, mask);
@@ -1614,7 +1646,7 @@ error::Error GLES2DecoderImpl::HandleStencilMaskSeparate(
GLenum face = static_cast<GLenum>(c.face);
GLuint mask = static_cast<GLuint>(c.mask);
if (!ValidateGLenumFaceType(face)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilMaskSeparate: face GL_INVALID_ENUM");
return error::kNoError;
}
glStencilMaskSeparate(face, mask);
@@ -1627,15 +1659,15 @@ error::Error GLES2DecoderImpl::HandleStencilOp(
GLenum zfail = static_cast<GLenum>(c.zfail);
GLenum zpass = static_cast<GLenum>(c.zpass);
if (!ValidateGLenumStencilOp(fail)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilOp: fail GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumStencilOp(zfail)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilOp: zfail GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumStencilOp(zpass)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilOp: zpass GL_INVALID_ENUM");
return error::kNoError;
}
glStencilOp(fail, zfail, zpass);
@@ -1649,19 +1681,19 @@ error::Error GLES2DecoderImpl::HandleStencilOpSeparate(
GLenum zfail = static_cast<GLenum>(c.zfail);
GLenum zpass = static_cast<GLenum>(c.zpass);
if (!ValidateGLenumFaceType(face)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilOpSeparate: face GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumStencilOp(fail)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilOpSeparate: fail GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumStencilOp(zfail)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilOpSeparate: zfail GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumStencilOp(zpass)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glStencilOpSeparate: zpass GL_INVALID_ENUM");
return error::kNoError;
}
glStencilOpSeparate(face, fail, zfail, zpass);
@@ -1674,11 +1706,11 @@ error::Error GLES2DecoderImpl::HandleTexParameterf(
GLenum pname = static_cast<GLenum>(c.pname);
GLfloat param = static_cast<GLfloat>(c.param);
if (!ValidateGLenumTextureBindTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameterf: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumTextureParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameterf: pname GL_INVALID_ENUM");
return error::kNoError;
}
DoTexParameterf(target, pname, param);
@@ -1696,11 +1728,11 @@ error::Error GLES2DecoderImpl::HandleTexParameterfv(
const GLfloat* params = GetSharedMemoryAs<const GLfloat*>(
c.params_shm_id, c.params_shm_offset, data_size);
if (!ValidateGLenumTextureBindTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameterfv: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumTextureParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameterfv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1724,11 +1756,11 @@ error::Error GLES2DecoderImpl::HandleTexParameterfvImmediate(
const GLfloat* params = GetImmediateDataAs<const GLfloat*>(
c, data_size, immediate_data_size);
if (!ValidateGLenumTextureBindTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameterfv: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumTextureParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameterfv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1744,11 +1776,11 @@ error::Error GLES2DecoderImpl::HandleTexParameteri(
GLenum pname = static_cast<GLenum>(c.pname);
GLint param = static_cast<GLint>(c.param);
if (!ValidateGLenumTextureBindTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameteri: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumTextureParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameteri: pname GL_INVALID_ENUM");
return error::kNoError;
}
DoTexParameteri(target, pname, param);
@@ -1766,11 +1798,11 @@ error::Error GLES2DecoderImpl::HandleTexParameteriv(
const GLint* params = GetSharedMemoryAs<const GLint*>(
c.params_shm_id, c.params_shm_offset, data_size);
if (!ValidateGLenumTextureBindTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameteriv: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumTextureParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameteriv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1794,11 +1826,11 @@ error::Error GLES2DecoderImpl::HandleTexParameterivImmediate(
const GLint* params = GetImmediateDataAs<const GLint*>(
c, data_size, immediate_data_size);
if (!ValidateGLenumTextureBindTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameteriv: target GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumTextureParameter(pname)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexParameteriv: pname GL_INVALID_ENUM");
return error::kNoError;
}
if (params == NULL) {
@@ -1826,23 +1858,23 @@ error::Error GLES2DecoderImpl::HandleTexSubImage2D(
const void* pixels = GetSharedMemoryAs<const void*>(
c.pixels_shm_id, c.pixels_shm_offset, data_size);
if (!ValidateGLenumTextureTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM");
return error::kNoError;
}
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: width < 0");
return error::kNoError;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0");
return error::kNoError;
}
if (!ValidateGLenumTextureFormat(format)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumPixelType(type)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM");
return error::kNoError;
}
if (pixels == NULL) {
@@ -1871,23 +1903,23 @@ error::Error GLES2DecoderImpl::HandleTexSubImage2DImmediate(
const void* pixels = GetImmediateDataAs<const void*>(
c, data_size, immediate_data_size);
if (!ValidateGLenumTextureTarget(target)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM");
return error::kNoError;
}
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: width < 0");
return error::kNoError;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0");
return error::kNoError;
}
if (!ValidateGLenumTextureFormat(format)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM");
return error::kNoError;
}
if (!ValidateGLenumPixelType(type)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM");
return error::kNoError;
}
if (pixels == NULL) {
@@ -1917,7 +1949,7 @@ error::Error GLES2DecoderImpl::HandleUniform1fv(
const GLfloat* v = GetSharedMemoryAs<const GLfloat*>(
c.v_shm_id, c.v_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform1fv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -1941,7 +1973,7 @@ error::Error GLES2DecoderImpl::HandleUniform1fvImmediate(
const GLfloat* v = GetImmediateDataAs<const GLfloat*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform1fv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -1970,7 +2002,7 @@ error::Error GLES2DecoderImpl::HandleUniform1iv(
const GLint* v = GetSharedMemoryAs<const GLint*>(
c.v_shm_id, c.v_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform1iv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -1994,7 +2026,7 @@ error::Error GLES2DecoderImpl::HandleUniform1ivImmediate(
const GLint* v = GetImmediateDataAs<const GLint*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform1iv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2024,7 +2056,7 @@ error::Error GLES2DecoderImpl::HandleUniform2fv(
const GLfloat* v = GetSharedMemoryAs<const GLfloat*>(
c.v_shm_id, c.v_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform2fv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2048,7 +2080,7 @@ error::Error GLES2DecoderImpl::HandleUniform2fvImmediate(
const GLfloat* v = GetImmediateDataAs<const GLfloat*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform2fv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2078,7 +2110,7 @@ error::Error GLES2DecoderImpl::HandleUniform2iv(
const GLint* v = GetSharedMemoryAs<const GLint*>(
c.v_shm_id, c.v_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform2iv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2102,7 +2134,7 @@ error::Error GLES2DecoderImpl::HandleUniform2ivImmediate(
const GLint* v = GetImmediateDataAs<const GLint*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform2iv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2133,7 +2165,7 @@ error::Error GLES2DecoderImpl::HandleUniform3fv(
const GLfloat* v = GetSharedMemoryAs<const GLfloat*>(
c.v_shm_id, c.v_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform3fv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2157,7 +2189,7 @@ error::Error GLES2DecoderImpl::HandleUniform3fvImmediate(
const GLfloat* v = GetImmediateDataAs<const GLfloat*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform3fv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2188,7 +2220,7 @@ error::Error GLES2DecoderImpl::HandleUniform3iv(
const GLint* v = GetSharedMemoryAs<const GLint*>(
c.v_shm_id, c.v_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform3iv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2212,7 +2244,7 @@ error::Error GLES2DecoderImpl::HandleUniform3ivImmediate(
const GLint* v = GetImmediateDataAs<const GLint*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform3iv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2244,7 +2276,7 @@ error::Error GLES2DecoderImpl::HandleUniform4fv(
const GLfloat* v = GetSharedMemoryAs<const GLfloat*>(
c.v_shm_id, c.v_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform4fv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2268,7 +2300,7 @@ error::Error GLES2DecoderImpl::HandleUniform4fvImmediate(
const GLfloat* v = GetImmediateDataAs<const GLfloat*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform4fv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2300,7 +2332,7 @@ error::Error GLES2DecoderImpl::HandleUniform4iv(
const GLint* v = GetSharedMemoryAs<const GLint*>(
c.v_shm_id, c.v_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform4iv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2324,7 +2356,7 @@ error::Error GLES2DecoderImpl::HandleUniform4ivImmediate(
const GLint* v = GetImmediateDataAs<const GLint*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniform4iv: count < 0");
return error::kNoError;
}
if (v == NULL) {
@@ -2346,11 +2378,12 @@ error::Error GLES2DecoderImpl::HandleUniformMatrix2fv(
const GLfloat* value = GetSharedMemoryAs<const GLfloat*>(
c.value_shm_id, c.value_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix2fv: count < 0");
return error::kNoError;
}
if (!ValidateGLbooleanFalse(transpose)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(
+ GL_INVALID_VALUE, "glUniformMatrix2fv: transpose GL_INVALID_VALUE");
return error::kNoError;
}
if (value == NULL) {
@@ -2375,11 +2408,12 @@ error::Error GLES2DecoderImpl::HandleUniformMatrix2fvImmediate(
const GLfloat* value = GetImmediateDataAs<const GLfloat*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix2fv: count < 0");
return error::kNoError;
}
if (!ValidateGLbooleanFalse(transpose)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(
+ GL_INVALID_VALUE, "glUniformMatrix2fv: transpose GL_INVALID_VALUE");
return error::kNoError;
}
if (value == NULL) {
@@ -2401,11 +2435,12 @@ error::Error GLES2DecoderImpl::HandleUniformMatrix3fv(
const GLfloat* value = GetSharedMemoryAs<const GLfloat*>(
c.value_shm_id, c.value_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix3fv: count < 0");
return error::kNoError;
}
if (!ValidateGLbooleanFalse(transpose)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(
+ GL_INVALID_VALUE, "glUniformMatrix3fv: transpose GL_INVALID_VALUE");
return error::kNoError;
}
if (value == NULL) {
@@ -2430,11 +2465,12 @@ error::Error GLES2DecoderImpl::HandleUniformMatrix3fvImmediate(
const GLfloat* value = GetImmediateDataAs<const GLfloat*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix3fv: count < 0");
return error::kNoError;
}
if (!ValidateGLbooleanFalse(transpose)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(
+ GL_INVALID_VALUE, "glUniformMatrix3fv: transpose GL_INVALID_VALUE");
return error::kNoError;
}
if (value == NULL) {
@@ -2456,11 +2492,12 @@ error::Error GLES2DecoderImpl::HandleUniformMatrix4fv(
const GLfloat* value = GetSharedMemoryAs<const GLfloat*>(
c.value_shm_id, c.value_shm_offset, data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix4fv: count < 0");
return error::kNoError;
}
if (!ValidateGLbooleanFalse(transpose)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(
+ GL_INVALID_VALUE, "glUniformMatrix4fv: transpose GL_INVALID_VALUE");
return error::kNoError;
}
if (value == NULL) {
@@ -2485,11 +2522,12 @@ error::Error GLES2DecoderImpl::HandleUniformMatrix4fvImmediate(
const GLfloat* value = GetImmediateDataAs<const GLfloat*>(
c, data_size, immediate_data_size);
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glUniformMatrix4fv: count < 0");
return error::kNoError;
}
if (!ValidateGLbooleanFalse(transpose)) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(
+ GL_INVALID_VALUE, "glUniformMatrix4fv: transpose GL_INVALID_VALUE");
return error::kNoError;
}
if (value == NULL) {
@@ -2698,11 +2736,11 @@ error::Error GLES2DecoderImpl::HandleViewport(
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
if (width < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glViewport: width < 0");
return error::kNoError;
}
if (height < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glViewport: height < 0");
return error::kNoError;
}
glViewport(x, y, width, height);
@@ -2722,11 +2760,11 @@ error::Error GLES2DecoderImpl::HandleGetMaxValueInBuffer(
return error::kOutOfBounds;
}
if (count < 0) {
- SetGLError(GL_INVALID_VALUE);
+ SetGLError(GL_INVALID_VALUE, "glGetMaxValueInBuffer: count < 0");
return error::kNoError;
}
if (!ValidateGLenumIndexType(type)) {
- SetGLError(GL_INVALID_ENUM);
+ SetGLError(GL_INVALID_ENUM, "glGetMaxValueInBuffer: type GL_INVALID_ENUM");
return error::kNoError;
}
*result_dst = DoGetMaxValueInBuffer(buffer_id, count, type, offset);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
index 771e977..1e9a9d0 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
@@ -1922,7 +1922,7 @@ TEST_F(GLES2DecoderWithShaderTest, GetMaxValueInBuffer) {
GL_UNSIGNED_SHORT,
kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset);
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
- EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
+ EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
cmd.Init(client_element_buffer_id_, kOutOfRangeIndexRangeEnd,
GL_UNSIGNED_SHORT,
kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset);