diff options
-rwxr-xr-x | gpu/command_buffer/build_gles2_cmd_buffer.py | 35 | ||||
-rw-r--r-- | gpu/command_buffer/client/gles2_implementation.cc | 63 | ||||
-rw-r--r-- | gpu/command_buffer/client/gles2_implementation.h | 12 | ||||
-rw-r--r-- | gpu/command_buffer/client/gles2_implementation_autogen.h | 28 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 475 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h | 396 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc | 2 |
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); |