Chromium Code Reviews| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| index e041c27570d8dbb3bb56eb40d731838566397432..d8c50482791ec2c2b573a890008dd0c40cb0da30 100644 |
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| @@ -497,7 +497,8 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
| virtual QueryManager* GetQueryManager() { return query_manager_.get(); } |
| virtual bool ProcessPendingQueries(); |
| - virtual void SetGLError(GLenum error, const char* msg); |
| + virtual void SetGLError( |
| + GLenum error, const char* function_name, const char* msg); |
| virtual void SetResizeCallback( |
| const base::Callback<void(gfx::Size)>& callback); |
| @@ -777,12 +778,10 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
| ProgramManager::ProgramInfo* info = GetProgramInfo(client_id); |
| if (!info) { |
| if (GetShaderInfo(client_id)) { |
| - SetGLError(GL_INVALID_OPERATION, |
| - (std::string(function_name) + |
| - ": shader passed for program").c_str()); |
| + SetGLError( |
| + GL_INVALID_OPERATION, function_name, "shader passed for program"); |
| } else { |
| - SetGLError(GL_INVALID_VALUE, |
| - (std::string(function_name) + ": unknown program").c_str()); |
| + SetGLError(GL_INVALID_VALUE, function_name, "unknown program"); |
| } |
| } |
| return info; |
| @@ -811,12 +810,10 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
| if (!info) { |
| if (GetProgramInfo(client_id)) { |
| SetGLError( |
| - GL_INVALID_OPERATION, |
| - (std::string(function_name) + |
| - ": program passed for shader").c_str()); |
| + GL_INVALID_OPERATION, function_name, "program passed for shader"); |
| } else { |
| - SetGLError(GL_INVALID_VALUE, |
| - (std::string(function_name) + ": unknown shader").c_str()); |
| + SetGLError( |
| + GL_INVALID_VALUE, function_name, "unknown shader"); |
| } |
| } |
| return info; |
| @@ -1189,12 +1186,13 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
| void ClearRealGLErrors(); |
| // Checks if the current program and vertex attributes are valid for drawing. |
| - bool IsDrawValid(GLuint max_vertex_accessed, GLsizei primcount); |
| + bool IsDrawValid( |
| + const char* function_name, GLuint max_vertex_accessed, GLsizei primcount); |
| // Returns true if successful, simulated will be true if attrib0 was |
| // simulated. |
| bool SimulateAttrib0( |
| - GLuint max_vertex_accessed, bool* simulated); |
| + const char* function_name, GLuint max_vertex_accessed, bool* simulated); |
| void RestoreStateForAttrib(GLuint attrib); |
| // Returns true if textures were set. |
| @@ -1203,15 +1201,18 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
| // Returns true if GL_FIXED attribs were simulated. |
| bool SimulateFixedAttribs( |
| + const char* function_name, |
| GLuint max_vertex_accessed, bool* simulated, GLsizei primcount); |
| void RestoreStateForSimulatedFixedAttribs(); |
| // Handle DrawArrays and DrawElements for both instanced and non-instanced |
| // cases (primcount is 0 for non-instanced). |
| error::Error DoDrawArrays( |
| + const char* function_name, |
| bool instanced, GLenum mode, GLint first, GLsizei count, |
| GLsizei primcount); |
| error::Error DoDrawElements( |
| + const char* function_name, |
| bool instanced, GLenum mode, GLsizei count, GLenum type, |
| int32 offset, GLsizei primcount); |
| @@ -1331,6 +1332,18 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, |
| const char* function_name, |
| GLenum target, GLenum format, GLenum type, GLint level); |
| + bool ValidateCompressedTexDimensions( |
| + const char* function_name, |
| + GLint level, GLsizei width, GLsizei height, GLenum format); |
| + bool ValidateCompressedTexFuncData( |
| + const char* function_name, |
| + GLsizei width, GLsizei height, GLenum format, size_t size); |
| + bool ValidateCompressedTexSubDimensions( |
| + const char* function_name, |
| + GLenum target, GLint level, GLint xoffset, GLint yoffset, |
| + GLsizei width, GLsizei height, GLenum format, |
| + TextureManager::TextureInfo* texture); |
| + |
| void LogMessage(const std::string& msg); |
| void RenderWarning(const std::string& msg); |
| void PerformanceWarning(const std::string& msg); |
| @@ -2586,8 +2599,7 @@ bool GLES2DecoderImpl::CheckFramebufferValid( |
| GLenum completeness = framebuffer->IsPossiblyComplete(); |
| if (completeness != GL_FRAMEBUFFER_COMPLETE) { |
| SetGLError( |
| - GL_INVALID_FRAMEBUFFER_OPERATION, |
| - (std::string(func_name) + " framebuffer incomplete").c_str()); |
| + GL_INVALID_FRAMEBUFFER_OPERATION, func_name, "framebuffer incomplete"); |
| return false; |
| } |
| @@ -2598,9 +2610,8 @@ bool GLES2DecoderImpl::CheckFramebufferValid( |
| // Can we clear them? |
| if (glCheckFramebufferStatusEXT(target) != GL_FRAMEBUFFER_COMPLETE) { |
| SetGLError( |
| - GL_INVALID_FRAMEBUFFER_OPERATION, |
| - (std::string(func_name) + |
| - " framebuffer incomplete (clear)").c_str()); |
| + GL_INVALID_FRAMEBUFFER_OPERATION, func_name, |
| + "framebuffer incomplete (clear)"); |
| return false; |
| } |
| ClearUnclearedAttachments(target, framebuffer); |
| @@ -2610,9 +2621,8 @@ bool GLES2DecoderImpl::CheckFramebufferValid( |
| if (!framebuffer_manager()->IsComplete(framebuffer)) { |
| if (glCheckFramebufferStatusEXT(target) != GL_FRAMEBUFFER_COMPLETE) { |
| SetGLError( |
| - GL_INVALID_FRAMEBUFFER_OPERATION, |
| - (std::string(func_name) + |
| - " framebuffer incomplete (check)").c_str()); |
| + GL_INVALID_FRAMEBUFFER_OPERATION, func_name, |
| + "framebuffer incomplete (check)"); |
| return false; |
| } |
| framebuffer_manager()->MarkAsComplete(framebuffer); |
| @@ -3146,7 +3156,7 @@ error::Error GLES2DecoderImpl::DoCommand( |
| LOG(ERROR) << "[" << this << "] " |
| << "GL ERROR: " << GLES2Util::GetStringEnum(error) << " : " |
| << GetCommandName(command); |
| - SetGLError(error, "GL error from driver"); |
| + SetGLError(error, "DoCommand", "GL error from driver"); |
| } |
| } |
| } else { |
| @@ -3201,7 +3211,8 @@ void GLES2DecoderImpl::DoFlush() { |
| void GLES2DecoderImpl::DoActiveTexture(GLenum texture_unit) { |
| GLuint texture_index = texture_unit - GL_TEXTURE0; |
| if (texture_index >= group_->max_texture_units()) { |
| - SetGLError(GL_INVALID_ENUM, "glActiveTexture: texture_unit out of range."); |
| + SetGLError( |
| + GL_INVALID_ENUM, "glActiveTexture", "texture_unit out of range."); |
| return; |
| } |
| active_texture_unit_ = texture_index; |
| @@ -3232,7 +3243,7 @@ void GLES2DecoderImpl::DoBindBuffer(GLenum target, GLuint client_id) { |
| if (info) { |
| if (!buffer_manager()->SetTarget(info, target)) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glBindBuffer: buffer bound to more than 1 target"); |
| + "glBindBuffer", "buffer bound to more than 1 target"); |
| return; |
| } |
| service_id = info->service_id(); |
| @@ -3417,12 +3428,12 @@ void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) { |
| // Check that we are not trying to bind it to a different target. |
| if (info->target() != 0 && info->target() != target) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glBindTexture: texture bound to more than 1 target."); |
| + "glBindTexture", "texture bound to more than 1 target."); |
| return; |
| } |
| if (info->IsStreamTexture() && target != GL_TEXTURE_EXTERNAL_OES) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glBindTexture: illegal target for stream texture."); |
| + "glBindTexture", "illegal target for stream texture."); |
| return; |
| } |
| if (info->target() == 0) { |
| @@ -3465,7 +3476,7 @@ void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { |
| } |
| } else { |
| SetGLError(GL_INVALID_VALUE, |
| - "glDisableVertexAttribArray: index out of range"); |
| + "glDisableVertexAttribArray", "index out of range"); |
| } |
| } |
| @@ -3474,7 +3485,7 @@ void GLES2DecoderImpl::DoEnableVertexAttribArray(GLuint index) { |
| glEnableVertexAttribArray(index); |
| } else { |
| SetGLError(GL_INVALID_VALUE, |
| - "glEnableVertexAttribArray: index out of range"); |
| + "glEnableVertexAttribArray", "index out of range"); |
| } |
| } |
| @@ -3483,12 +3494,12 @@ void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) { |
| if (!info || |
| !texture_manager()->CanGenerateMipmaps(info)) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glGenerateMipmaps: Can not generate mips"); |
| + "glGenerateMipmaps", "Can not generate mips"); |
| return; |
| } |
| if (!texture_manager()->ClearTextureLevel(this, info, target, 0)) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glGenerateMipmaps: dimensions too big"); |
| + SetGLError(GL_OUT_OF_MEMORY, "glGenerateMipmaps", "dimensions too big"); |
| return; |
| } |
| @@ -3883,15 +3894,15 @@ void GLES2DecoderImpl::DoGetProgramiv( |
| void GLES2DecoderImpl::DoBindAttribLocation( |
| GLuint program, GLuint index, const char* name) { |
| if (!StringIsValidForGLES(name)) { |
| - SetGLError(GL_INVALID_VALUE, "glBindAttribLocation: Invalid character"); |
| + SetGLError(GL_INVALID_VALUE, "glBindAttribLocation", "Invalid character"); |
| return; |
| } |
| if (ProgramManager::IsInvalidPrefix(name, strlen(name))) { |
| - SetGLError(GL_INVALID_OPERATION, "glBindAttribLocation: reserved prefix"); |
| + SetGLError(GL_INVALID_OPERATION, "glBindAttribLocation", "reserved prefix"); |
| return; |
| } |
| if (index >= group_->max_vertex_attribs()) { |
| - SetGLError(GL_INVALID_VALUE, "glBindAttribLocation: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glBindAttribLocation", "index out of range"); |
| return; |
| } |
| ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( |
| @@ -3960,7 +3971,7 @@ error::Error GLES2DecoderImpl::HandleDeleteShader( |
| shader_manager()->MarkAsDeleted(info); |
| } |
| } else { |
| - SetGLError(GL_INVALID_VALUE, "glDeleteShader: unknown shader"); |
| + SetGLError(GL_INVALID_VALUE, "glDeleteShader", "unknown shader"); |
| } |
| } |
| return error::kNoError; |
| @@ -3976,7 +3987,7 @@ error::Error GLES2DecoderImpl::HandleDeleteProgram( |
| program_manager()->MarkAsDeleted(shader_manager(), info); |
| } |
| } else { |
| - SetGLError(GL_INVALID_VALUE, "glDeleteProgram: unknown program"); |
| + SetGLError(GL_INVALID_VALUE, "glDeleteProgram", "unknown program"); |
| } |
| } |
| return error::kNoError; |
| @@ -4001,7 +4012,7 @@ error::Error GLES2DecoderImpl::HandleDeleteSharedIdsCHROMIUM( |
| const GLuint* ids = GetSharedMemoryAs<const GLuint*>( |
| c.ids_shm_id, c.ids_shm_offset, data_size); |
| if (n < 0) { |
| - SetGLError(GL_INVALID_VALUE, "DeleteSharedIdsCHROMIUM: n < 0"); |
| + SetGLError(GL_INVALID_VALUE, "DeleteSharedIdsCHROMIUM", "n < 0"); |
| return error::kNoError; |
| } |
| if (ids == NULL) { |
| @@ -4038,7 +4049,7 @@ error::Error GLES2DecoderImpl::HandleGenSharedIdsCHROMIUM( |
| GLuint* ids = GetSharedMemoryAs<GLuint*>( |
| c.ids_shm_id, c.ids_shm_offset, data_size); |
| if (n < 0) { |
| - SetGLError(GL_INVALID_VALUE, "GenSharedIdsCHROMIUM: n < 0"); |
| + SetGLError(GL_INVALID_VALUE, "GenSharedIdsCHROMIUM", "n < 0"); |
| return error::kNoError; |
| } |
| if (ids == NULL) { |
| @@ -4057,9 +4068,8 @@ void GLES2DecoderImpl::DoRegisterSharedIdsCHROMIUM( |
| id_allocator->FreeID(ids[jj]); |
| } |
| SetGLError( |
| - GL_INVALID_VALUE, |
| - "RegisterSharedIdsCHROMIUM: attempt to register " |
| - "id that already exists"); |
| + GL_INVALID_VALUE, "RegisterSharedIdsCHROMIUM", |
| + "attempt to register id that already exists"); |
| return; |
| } |
| } |
| @@ -4076,7 +4086,7 @@ error::Error GLES2DecoderImpl::HandleRegisterSharedIdsCHROMIUM( |
| GLuint* ids = GetSharedMemoryAs<GLuint*>( |
| c.ids_shm_id, c.ids_shm_offset, data_size); |
| if (n < 0) { |
| - SetGLError(GL_INVALID_VALUE, "RegisterSharedIdsCHROMIUM: n < 0"); |
| + SetGLError(GL_INVALID_VALUE, "RegisterSharedIdsCHROMIUM", "n < 0"); |
| return error::kNoError; |
| } |
| if (ids == NULL) { |
| @@ -4102,7 +4112,7 @@ void GLES2DecoderImpl::DoFramebufferRenderbuffer( |
| GetFramebufferInfoForTarget(target); |
| if (!framebuffer_info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glFramebufferRenderbuffer: no framebuffer bound"); |
| + "glFramebufferRenderbuffer", "no framebuffer bound"); |
| return; |
| } |
| GLuint service_id = 0; |
| @@ -4111,7 +4121,7 @@ void GLES2DecoderImpl::DoFramebufferRenderbuffer( |
| info = GetRenderbufferInfo(client_renderbuffer_id); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glFramebufferRenderbuffer: unknown renderbuffer"); |
| + "glFramebufferRenderbuffer", "unknown renderbuffer"); |
| return; |
| } |
| service_id = info->service_id(); |
| @@ -4318,7 +4328,7 @@ void GLES2DecoderImpl::DoFramebufferTexture2D( |
| GetFramebufferInfoForTarget(target); |
| if (!framebuffer_info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glFramebufferTexture2D: no framebuffer bound."); |
| + "glFramebufferTexture2D", "no framebuffer bound."); |
| return; |
| } |
| GLuint service_id = 0; |
| @@ -4327,7 +4337,7 @@ void GLES2DecoderImpl::DoFramebufferTexture2D( |
| info = GetTextureInfo(client_texture_id); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glFramebufferTexture2D: unknown texture"); |
| + "glFramebufferTexture2D", "unknown texture"); |
| return; |
| } |
| service_id = info->service_id(); |
| @@ -4335,7 +4345,7 @@ void GLES2DecoderImpl::DoFramebufferTexture2D( |
| if (!texture_manager()->ValidForTarget(textarget, level, 0, 0, 1)) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glFramebufferTexture2D: level out of range"); |
| + "glFramebufferTexture2D", "level out of range"); |
| return; |
| } |
| @@ -4356,7 +4366,7 @@ void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( |
| GetFramebufferInfoForTarget(target); |
| if (!framebuffer_info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glFramebufferAttachmentParameteriv: no framebuffer bound"); |
| + "glFramebufferAttachmentParameteriv", "no framebuffer bound"); |
| return; |
| } |
| glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params); |
| @@ -4387,7 +4397,7 @@ void GLES2DecoderImpl::DoGetRenderbufferParameteriv( |
| GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| if (!renderbuffer) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glGetRenderbufferParameteriv: no renderbuffer bound"); |
| + "glGetRenderbufferParameteriv", "no renderbuffer bound"); |
| return; |
| } |
| switch (pname) { |
| @@ -4412,7 +4422,7 @@ void GLES2DecoderImpl::DoBlitFramebufferEXT( |
| GLbitfield mask, GLenum filter) { |
| if (!feature_info_->feature_flags().chromium_framebuffer_multisample) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glBlitFramebufferEXT: function not available"); |
| + "glBlitFramebufferEXT", "function not available"); |
| } |
| if (IsAngle()) { |
| glBlitFramebufferANGLE( |
| @@ -4429,7 +4439,7 @@ void GLES2DecoderImpl::DoRenderbufferStorageMultisample( |
| GLsizei width, GLsizei height) { |
| if (!feature_info_->feature_flags().chromium_framebuffer_multisample) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glRenderbufferStorageMultisampleEXT: function not available"); |
| + "glRenderbufferStorageMultisampleEXT", "function not available"); |
| return; |
| } |
| @@ -4437,20 +4447,20 @@ void GLES2DecoderImpl::DoRenderbufferStorageMultisample( |
| GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| if (!renderbuffer) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glGetRenderbufferStorageMultisample: no renderbuffer bound"); |
| + "glGetRenderbufferStorageMultisample", "no renderbuffer bound"); |
| return; |
| } |
| if (samples > renderbuffer_manager()->max_samples()) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glGetRenderbufferStorageMultisample: samples too large"); |
| + "glGetRenderbufferStorageMultisample", "samples too large"); |
| return; |
| } |
| if (width > renderbuffer_manager()->max_renderbuffer_size() || |
| height > renderbuffer_manager()->max_renderbuffer_size()) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glGetRenderbufferStorageMultisample: size too large"); |
| + "glGetRenderbufferStorageMultisample", "size too large"); |
| return; |
| } |
| @@ -4494,14 +4504,14 @@ void GLES2DecoderImpl::DoRenderbufferStorage( |
| GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
| if (!renderbuffer) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glGetRenderbufferStorage: no renderbuffer bound"); |
| + "glGetRenderbufferStorage", "no renderbuffer bound"); |
| return; |
| } |
| if (width > renderbuffer_manager()->max_renderbuffer_size() || |
| height > renderbuffer_manager()->max_renderbuffer_size()) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glGetRenderbufferStorage: size too large"); |
| + "glGetRenderbufferStorage", "size too large"); |
| return; |
| } |
| @@ -4552,13 +4562,13 @@ void GLES2DecoderImpl::DoTexParameterf( |
| GLenum target, GLenum pname, GLfloat param) { |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glTexParameterf: unknown texture"); |
| + SetGLError(GL_INVALID_VALUE, "glTexParameterf", "unknown texture"); |
| return; |
| } |
| if (!texture_manager()->SetParameter( |
| info, pname, static_cast<GLint>(param))) { |
| - SetGLError(GL_INVALID_ENUM, "glTexParameterf: param GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexParameterf", "param GL_INVALID_ENUM"); |
| return; |
| } |
| glTexParameterf(target, pname, param); |
| @@ -4568,12 +4578,12 @@ void GLES2DecoderImpl::DoTexParameteri( |
| GLenum target, GLenum pname, GLint param) { |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glTexParameteri: unknown texture"); |
| + SetGLError(GL_INVALID_VALUE, "glTexParameteri", "unknown texture"); |
| return; |
| } |
| if (!texture_manager()->SetParameter(info, pname, param)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexParameteri: param GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexParameteri", "param GL_INVALID_ENUM"); |
| return; |
| } |
| glTexParameteri(target, pname, param); |
| @@ -4583,13 +4593,13 @@ void GLES2DecoderImpl::DoTexParameterfv( |
| GLenum target, GLenum pname, const GLfloat* params) { |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glTexParameterfv: unknown texture"); |
| + SetGLError(GL_INVALID_VALUE, "glTexParameterfv", "unknown texture"); |
| return; |
| } |
| if (!texture_manager()->SetParameter( |
| info, pname, static_cast<GLint>(params[0]))) { |
| - SetGLError(GL_INVALID_ENUM, "glTexParameterfv: param GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexParameterfv", "param GL_INVALID_ENUM"); |
| return; |
| } |
| glTexParameterfv(target, pname, params); |
| @@ -4599,12 +4609,12 @@ void GLES2DecoderImpl::DoTexParameteriv( |
| GLenum target, GLenum pname, const GLint* params) { |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glTexParameteriv: unknown texture"); |
| + SetGLError(GL_INVALID_VALUE, "glTexParameteriv", "unknown texture"); |
| return; |
| } |
| if (!texture_manager()->SetParameter(info, pname, *params)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexParameteriv: param GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexParameteriv", "param GL_INVALID_ENUM"); |
| return; |
| } |
| glTexParameteriv(target, pname, params); |
| @@ -4612,14 +4622,12 @@ void GLES2DecoderImpl::DoTexParameteriv( |
| bool GLES2DecoderImpl::CheckCurrentProgram(const char* function_name) { |
| if (!current_program_) { |
| - // The program does not exist. |
| - SetGLError(GL_INVALID_OPERATION, |
| - (std::string(function_name) + ": no program in use").c_str()); |
| - return false; |
| + // The program does not exist. |
| + SetGLError(GL_INVALID_OPERATION, function_name, "no program in use"); |
| + return false; |
| } |
| if (!current_program_->InUse()) { |
| - SetGLError(GL_INVALID_OPERATION, |
| - (std::string(function_name) + ": program not linked").c_str()); |
| + SetGLError(GL_INVALID_OPERATION, function_name, "program not linked"); |
| return false; |
| } |
| return true; |
| @@ -4647,14 +4655,12 @@ bool GLES2DecoderImpl::PrepForSetUniformByLocation( |
| current_program_->GetUniformInfoByFakeLocation( |
| fake_location, real_location, &array_index); |
| if (!info) { |
| - SetGLError(GL_INVALID_OPERATION, |
| - (std::string(function_name) + ": unknown location").c_str()); |
| + SetGLError(GL_INVALID_OPERATION, function_name, "unknown location"); |
| return false; |
| } |
| if (*count > 1 && !info->is_array) { |
| SetGLError( |
| - GL_INVALID_OPERATION, |
| - (std::string(function_name) + ": count > 1 for non-array").c_str()); |
| + GL_INVALID_OPERATION, function_name, "count > 1 for non-array"); |
| return false; |
| } |
| *count = std::min(info->size - array_index, *count); |
| @@ -4675,7 +4681,7 @@ void GLES2DecoderImpl::DoUniform1i(GLint fake_location, GLint v0) { |
| } |
| if (!current_program_->SetSamplers( |
| group_->max_texture_units(), fake_location, 1, &v0)) { |
| - SetGLError(GL_INVALID_VALUE, "glUniform1i: texture unit out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glUniform1i", "texture unit out of range"); |
| return; |
| } |
| glUniform1i(real_location, v0); |
| @@ -4693,7 +4699,7 @@ void GLES2DecoderImpl::DoUniform1iv( |
| type == GL_SAMPLER_EXTERNAL_OES) { |
| if (!current_program_->SetSamplers( |
| group_->max_texture_units(), fake_location, count, value)) { |
| - SetGLError(GL_INVALID_VALUE, "glUniform1iv: texture unit out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glUniform1iv", "texture unit out of range"); |
| return; |
| } |
| } |
| @@ -4858,7 +4864,7 @@ void GLES2DecoderImpl::DoUseProgram(GLuint program) { |
| } |
| if (!info->IsValid()) { |
| // Program was not linked successfully. (ie, glLinkProgram) |
| - SetGLError(GL_INVALID_OPERATION, "glUseProgram: program not linked"); |
| + SetGLError(GL_INVALID_OPERATION, "glUseProgram", "program not linked"); |
| return; |
| } |
| service_id = info->service_id(); |
| @@ -4895,16 +4901,18 @@ GLenum GLES2DecoderImpl::GetGLError() { |
| GLenum GLES2DecoderImpl::PeekGLError() { |
| GLenum error = glGetError(); |
| if (error != GL_NO_ERROR) { |
| - SetGLError(error, ""); |
| + SetGLError(error, "", ""); |
| } |
| return error; |
| } |
| -void GLES2DecoderImpl::SetGLError(GLenum error, const char* msg) { |
| +void GLES2DecoderImpl::SetGLError( |
| + GLenum error, const char* function_name, const char* msg) { |
| if (msg) { |
| last_error_ = msg; |
| LogMessage(std::string("GL ERROR :") + |
| - GLES2Util::GetStringEnum(error) + " : " + msg); |
| + GLES2Util::GetStringEnum(error) + " : " + |
| + function_name + ": " + msg); |
| } |
| error_bits_ |= GLES2Util::GLErrorToErrorBit(error); |
| } |
| @@ -4943,7 +4951,7 @@ void GLES2DecoderImpl::PerformanceWarning(const std::string& msg) { |
| void GLES2DecoderImpl::CopyRealGLErrorsToWrapper() { |
| GLenum error; |
| while ((error = glGetError()) != GL_NO_ERROR) { |
| - SetGLError(error, NULL); |
| + SetGLError(error, "", NULL); |
| } |
| } |
| @@ -5061,7 +5069,7 @@ bool GLES2DecoderImpl::ClearUnclearedTextures() { |
| } |
| bool GLES2DecoderImpl::IsDrawValid( |
| - GLuint max_vertex_accessed, GLsizei primcount) { |
| + const char* function_name, GLuint max_vertex_accessed, GLsizei primcount) { |
| // NOTE: We specifically do not check current_program->IsValid() because |
| // it could never be invalid since glUseProgram would have failed. While |
| // glLinkProgram could later mark the program as invalid the previous |
| @@ -5092,19 +5100,19 @@ bool GLES2DecoderImpl::IsDrawValid( |
| // This attrib is used in the current program. |
| if (!info->CanAccess(count)) { |
| SetGLError( |
| - GL_INVALID_OPERATION, |
| + GL_INVALID_OPERATION, function_name, |
| (std::string( |
| - "glDrawXXX: attempt to access out of range vertices in " |
| - "attribute ") + base::IntToString(info->index())).c_str()); |
| + "attempt to access out of range vertices in attribute ") + |
| + base::IntToString(info->index())).c_str()); |
| return false; |
| } |
| } else { |
| // This attrib is not used in the current program. |
| if (!info->buffer()) { |
| SetGLError( |
| - GL_INVALID_OPERATION, |
| + GL_INVALID_OPERATION, function_name, |
| (std::string( |
| - "glDrawXXX: attempt to render with no buffer attached to " |
| + "attempt to render with no buffer attached to " |
| "enabled attribute ") + |
| base::IntToString(info->index())).c_str()); |
| return false; |
| @@ -5114,8 +5122,8 @@ bool GLES2DecoderImpl::IsDrawValid( |
| if (primcount && !divisor0) { |
| SetGLError( |
| - GL_INVALID_OPERATION, |
| - "glDrawXXX: attempt instanced render with all attributes having " |
| + GL_INVALID_OPERATION, function_name, |
| + "attempt instanced render with all attributes having " |
| "non-zero divisors"); |
| return false; |
| } |
| @@ -5124,7 +5132,7 @@ bool GLES2DecoderImpl::IsDrawValid( |
| } |
| bool GLES2DecoderImpl::SimulateAttrib0( |
| - GLuint max_vertex_accessed, bool* simulated) { |
| + const char* function_name, GLuint max_vertex_accessed, bool* simulated) { |
| DCHECK(simulated); |
| *simulated = false; |
| @@ -5151,7 +5159,7 @@ bool GLES2DecoderImpl::SimulateAttrib0( |
| !SafeMultiply(num_vertices, static_cast<GLuint>(sizeof(Vec4)), |
| &size_needed) || |
| size_needed > 0x7FFFFFFFU) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glDrawXXX: Simulating attrib 0"); |
| + SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); |
| return false; |
| } |
| @@ -5166,7 +5174,7 @@ bool GLES2DecoderImpl::SimulateAttrib0( |
| glBufferData(GL_ARRAY_BUFFER, size_needed, NULL, GL_DYNAMIC_DRAW); |
| GLenum error = glGetError(); |
| if (error != GL_NO_ERROR) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glDrawXXX: Simulating attrib 0"); |
| + SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); |
| return false; |
| } |
| } |
| @@ -5215,6 +5223,7 @@ void GLES2DecoderImpl::RestoreStateForAttrib(GLuint attrib) { |
| } |
| bool GLES2DecoderImpl::SimulateFixedAttribs( |
| + const char* function_name, |
| GLuint max_vertex_accessed, bool* simulated, GLsizei primcount) { |
| DCHECK(simulated); |
| *simulated = false; |
| @@ -5246,7 +5255,7 @@ bool GLES2DecoderImpl::SimulateFixedAttribs( |
| max_vertex_accessed); |
| GLuint num_vertices = max_accessed + 1; |
| if (num_vertices == 0) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glDrawXXX: Simulating attrib 0"); |
| + SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); |
| return false; |
| } |
| if (attrib_info && |
| @@ -5256,7 +5265,8 @@ bool GLES2DecoderImpl::SimulateFixedAttribs( |
| if (!SafeMultiply(num_vertices, |
| static_cast<GLuint>(info->size()), &elements_used) || |
| !SafeAdd(elements_needed, elements_used, &elements_needed)) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glDrawXXX: simulating GL_FIXED attribs"); |
| + SetGLError( |
| + GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs"); |
| return false; |
| } |
| } |
| @@ -5266,7 +5276,7 @@ bool GLES2DecoderImpl::SimulateFixedAttribs( |
| GLuint size_needed = 0; |
| if (!SafeMultiply(elements_needed, kSizeOfFloat, &size_needed) || |
| size_needed > 0x7FFFFFFFU) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glDrawXXX: simulating GL_FIXED attribs"); |
| + SetGLError(GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs"); |
| return false; |
| } |
| @@ -5277,7 +5287,8 @@ bool GLES2DecoderImpl::SimulateFixedAttribs( |
| glBufferData(GL_ARRAY_BUFFER, size_needed, NULL, GL_DYNAMIC_DRAW); |
| GLenum error = glGetError(); |
| if (error != GL_NO_ERROR) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glDrawXXX: simulating GL_FIXED attribs"); |
| + SetGLError( |
| + GL_OUT_OF_MEMORY, function_name, "simulating GL_FIXED attribs"); |
| return false; |
| } |
| } |
| @@ -5293,7 +5304,7 @@ bool GLES2DecoderImpl::SimulateFixedAttribs( |
| max_vertex_accessed); |
| GLuint num_vertices = max_accessed + 1; |
| if (num_vertices == 0) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glDrawXXX: Simulating attrib 0"); |
| + SetGLError(GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); |
| return false; |
| } |
| if (attrib_info && |
| @@ -5327,30 +5338,32 @@ void GLES2DecoderImpl::RestoreStateForSimulatedFixedAttribs() { |
| bound_array_buffer_ ? bound_array_buffer_->service_id() : 0); |
| } |
| -error::Error GLES2DecoderImpl::DoDrawArrays(bool instanced, |
| - GLenum mode, |
| - GLint first, |
| - GLsizei count, |
| - GLsizei primcount) { |
| +error::Error GLES2DecoderImpl::DoDrawArrays( |
| + const char* function_name, |
| + bool instanced, |
| + GLenum mode, |
| + GLint first, |
| + GLsizei count, |
| + GLsizei primcount) { |
| if (!validators_->draw_mode.IsValid(mode)) { |
| - SetGLError(GL_INVALID_ENUM, "glDrawArrays: mode GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, function_name, "mode GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (count < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glDrawArrays: count < 0"); |
| + SetGLError(GL_INVALID_VALUE, function_name, "count < 0"); |
| return error::kNoError; |
| } |
| if (primcount < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glDrawArrays: primcount < 0"); |
| + SetGLError(GL_INVALID_VALUE, function_name, "primcount < 0"); |
| return error::kNoError; |
| } |
| - if (!CheckBoundFramebuffersValid("glDrawArrays")) { |
| + if (!CheckBoundFramebuffersValid(function_name)) { |
| return error::kNoError; |
| } |
| // We have to check this here because the prototype for glDrawArrays |
| // is GLint not GLsizei. |
| if (first < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glDrawArrays: first < 0"); |
| + SetGLError(GL_INVALID_VALUE, function_name, "first < 0"); |
| return error::kNoError; |
| } |
| @@ -5360,18 +5373,20 @@ error::Error GLES2DecoderImpl::DoDrawArrays(bool instanced, |
| } |
| GLuint max_vertex_accessed = first + count - 1; |
| - if (IsDrawValid(max_vertex_accessed, primcount)) { |
| + if (IsDrawValid(function_name, max_vertex_accessed, primcount)) { |
| if (!ClearUnclearedTextures()) { |
| - SetGLError(GL_INVALID_VALUE, "glDrawArrays: out of memory"); |
| + SetGLError(GL_INVALID_VALUE, function_name, "out of memory"); |
| return error::kNoError; |
| } |
| bool simulated_attrib_0 = false; |
| - if (!SimulateAttrib0(max_vertex_accessed, &simulated_attrib_0)) { |
| + if (!SimulateAttrib0( |
| + function_name, max_vertex_accessed, &simulated_attrib_0)) { |
| return error::kNoError; |
| } |
| bool simulated_fixed_attribs = false; |
| - if (SimulateFixedAttribs(max_vertex_accessed, &simulated_fixed_attribs, |
| - primcount)) { |
| + if (SimulateFixedAttribs( |
| + function_name, max_vertex_accessed, &simulated_fixed_attribs, |
| + primcount)) { |
| bool textures_set = SetBlackTextureForNonRenderableTextures(); |
| ApplyDirtyState(); |
| if (!instanced) { |
| @@ -5400,7 +5415,8 @@ error::Error GLES2DecoderImpl::DoDrawArrays(bool instanced, |
| error::Error GLES2DecoderImpl::HandleDrawArrays( |
| uint32 immediate_data_size, const gles2::DrawArrays& c) { |
| - return DoDrawArrays(false, |
| + return DoDrawArrays("glDrawArrays", |
| + false, |
| static_cast<GLenum>(c.mode), |
| static_cast<GLint>(c.first), |
| static_cast<GLsizei>(c.count), |
| @@ -5411,50 +5427,53 @@ error::Error GLES2DecoderImpl::HandleDrawArraysInstancedANGLE( |
| uint32 immediate_data_size, const gles2::DrawArraysInstancedANGLE& c) { |
| if (!feature_info_->feature_flags().angle_instanced_arrays) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glDrawArraysInstancedANGLE: function not available"); |
| + "glDrawArraysInstancedANGLE", "function not available"); |
| return error::kNoError; |
| } |
| - return DoDrawArrays(true, |
| + return DoDrawArrays("glDrawArraysIntancedANGLE", |
| + true, |
| static_cast<GLenum>(c.mode), |
| static_cast<GLint>(c.first), |
| static_cast<GLsizei>(c.count), |
| static_cast<GLsizei>(c.primcount)); |
| } |
| -error::Error GLES2DecoderImpl::DoDrawElements(bool instanced, |
| - GLenum mode, |
| - GLsizei count, |
| - GLenum type, |
| - int32 offset, |
| - GLsizei primcount) { |
| +error::Error GLES2DecoderImpl::DoDrawElements( |
| + const char* function_name, |
| + bool instanced, |
| + GLenum mode, |
| + GLsizei count, |
| + GLenum type, |
| + int32 offset, |
| + GLsizei primcount) { |
| if (!bound_element_array_buffer_) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glDrawElements: No element array buffer bound"); |
| + function_name, "No element array buffer bound"); |
| return error::kNoError; |
| } |
| if (count < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glDrawElements: count < 0"); |
| + SetGLError(GL_INVALID_VALUE, function_name, "count < 0"); |
| return error::kNoError; |
| } |
| if (offset < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glDrawElements: offset < 0"); |
| + SetGLError(GL_INVALID_VALUE, function_name, "offset < 0"); |
| return error::kNoError; |
| } |
| if (!validators_->draw_mode.IsValid(mode)) { |
| - SetGLError(GL_INVALID_ENUM, "glDrawElements: mode GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, function_name, "mode GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->index_type.IsValid(type)) { |
| - SetGLError(GL_INVALID_ENUM, "glDrawElements: type GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, function_name, "type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (primcount < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glDrawElements: primcount < 0"); |
| + SetGLError(GL_INVALID_VALUE, function_name, "primcount < 0"); |
| return error::kNoError; |
| } |
| - if (!CheckBoundFramebuffersValid("glDrawElements")) { |
| + if (!CheckBoundFramebuffersValid(function_name)) { |
| return error::kNoError; |
| } |
| @@ -5466,22 +5485,24 @@ error::Error GLES2DecoderImpl::DoDrawElements(bool instanced, |
| if (!bound_element_array_buffer_->GetMaxValueForRange( |
| offset, count, type, &max_vertex_accessed)) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glDrawElements: range out of bounds for buffer"); |
| + function_name, "range out of bounds for buffer"); |
| return error::kNoError; |
| } |
| - if (IsDrawValid(max_vertex_accessed, primcount)) { |
| + if (IsDrawValid(function_name, max_vertex_accessed, primcount)) { |
| if (!ClearUnclearedTextures()) { |
| - SetGLError(GL_INVALID_VALUE, "glDrawElements: out of memory"); |
| + SetGLError(GL_INVALID_VALUE, function_name, "out of memory"); |
| return error::kNoError; |
| } |
| bool simulated_attrib_0 = false; |
| - if (!SimulateAttrib0(max_vertex_accessed, &simulated_attrib_0)) { |
| + if (!SimulateAttrib0( |
| + function_name, max_vertex_accessed, &simulated_attrib_0)) { |
| return error::kNoError; |
| } |
| bool simulated_fixed_attribs = false; |
| - if (SimulateFixedAttribs(max_vertex_accessed, &simulated_fixed_attribs, |
| - primcount)) { |
| + if (SimulateFixedAttribs( |
| + function_name, max_vertex_accessed, &simulated_fixed_attribs, |
| + primcount)) { |
| bool textures_set = SetBlackTextureForNonRenderableTextures(); |
| ApplyDirtyState(); |
| const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset); |
| @@ -5511,7 +5532,8 @@ error::Error GLES2DecoderImpl::DoDrawElements(bool instanced, |
| error::Error GLES2DecoderImpl::HandleDrawElements( |
| uint32 immediate_data_size, const gles2::DrawElements& c) { |
| - return DoDrawElements(false, |
| + return DoDrawElements("glDrawElements", |
| + false, |
| static_cast<GLenum>(c.mode), |
| static_cast<GLsizei>(c.count), |
| static_cast<GLenum>(c.type), |
| @@ -5523,10 +5545,11 @@ error::Error GLES2DecoderImpl::HandleDrawElementsInstancedANGLE( |
| uint32 immediate_data_size, const gles2::DrawElementsInstancedANGLE& c) { |
| if (!feature_info_->feature_flags().angle_instanced_arrays) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glDrawElementsInstancedANGLE: function not available"); |
| + "glDrawElementsInstancedANGLE", "function not available"); |
| return error::kNoError; |
| } |
| - return DoDrawElements(true, |
| + return DoDrawElements("glDrawElementsInstancedANGLE", |
| + true, |
| static_cast<GLenum>(c.mode), |
| static_cast<GLsizei>(c.count), |
| static_cast<GLenum>(c.type), |
| @@ -5541,13 +5564,13 @@ GLuint GLES2DecoderImpl::DoGetMaxValueInBufferCHROMIUM( |
| if (!info) { |
| // TODO(gman): Should this be a GL error or a command buffer error? |
| SetGLError(GL_INVALID_VALUE, |
| - "GetMaxValueInBufferCHROMIUM: unknown buffer"); |
| + "GetMaxValueInBufferCHROMIUM", "unknown 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, |
| - "GetMaxValueInBufferCHROMIUM: range out of bounds for buffer"); |
| + "GetMaxValueInBufferCHROMIUM", "range out of bounds for buffer"); |
| } |
| } |
| return max_vertex_accessed; |
| @@ -5806,7 +5829,7 @@ void GLES2DecoderImpl::DoAttachShader( |
| } |
| if (!program_info->AttachShader(shader_manager(), shader_info)) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glAttachShader: can not attach more than" |
| + "glAttachShader", "can not attach more than" |
| " one shader of the same type."); |
| return; |
| } |
| @@ -5827,7 +5850,7 @@ void GLES2DecoderImpl::DoDetachShader( |
| } |
| if (!program_info->DetachShader(shader_manager(), shader_info)) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glDetachShader: shader not attached to program"); |
| + "glDetachShader", "shader not attached to program"); |
| return; |
| } |
| glDetachShader(program_info->service_id(), shader_info->service_id()); |
| @@ -5847,7 +5870,7 @@ void GLES2DecoderImpl::DoGetVertexAttribfv( |
| VertexAttribManager::VertexAttribInfo* info = |
| vertex_attrib_manager_->GetVertexAttribInfo(index); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glGetVertexAttribfv: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glGetVertexAttribfv", "index out of range"); |
| return; |
| } |
| switch (pname) { |
| @@ -5895,7 +5918,7 @@ void GLES2DecoderImpl::DoGetVertexAttribiv( |
| VertexAttribManager::VertexAttribInfo* info = |
| vertex_attrib_manager_->GetVertexAttribInfo(index); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glGetVertexAttribiv: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glGetVertexAttribiv", "index out of range"); |
| return; |
| } |
| switch (pname) { |
| @@ -5942,7 +5965,7 @@ void GLES2DecoderImpl::DoVertexAttrib1f(GLuint index, GLfloat v0) { |
| VertexAttribManager::VertexAttribInfo* info = |
| vertex_attrib_manager_->GetVertexAttribInfo(index); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glVertexAttrib1f: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glVertexAttrib1f", "index out of range"); |
| return; |
| } |
| VertexAttribManager::VertexAttribInfo::Vec4 value; |
| @@ -5958,7 +5981,7 @@ void GLES2DecoderImpl::DoVertexAttrib2f(GLuint index, GLfloat v0, GLfloat v1) { |
| VertexAttribManager::VertexAttribInfo* info = |
| vertex_attrib_manager_->GetVertexAttribInfo(index); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glVertexAttrib2f: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glVertexAttrib2f", "index out of range"); |
| return; |
| } |
| VertexAttribManager::VertexAttribInfo::Vec4 value; |
| @@ -5975,7 +5998,7 @@ void GLES2DecoderImpl::DoVertexAttrib3f( |
| VertexAttribManager::VertexAttribInfo* info = |
| vertex_attrib_manager_->GetVertexAttribInfo(index); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glVertexAttrib3f: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glVertexAttrib3f", "index out of range"); |
| return; |
| } |
| VertexAttribManager::VertexAttribInfo::Vec4 value; |
| @@ -5992,7 +6015,7 @@ void GLES2DecoderImpl::DoVertexAttrib4f( |
| VertexAttribManager::VertexAttribInfo* info = |
| vertex_attrib_manager_->GetVertexAttribInfo(index); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glVertexAttrib4f: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glVertexAttrib4f", "index out of range"); |
| return; |
| } |
| VertexAttribManager::VertexAttribInfo::Vec4 value; |
| @@ -6008,7 +6031,7 @@ void GLES2DecoderImpl::DoVertexAttrib1fv(GLuint index, const GLfloat* v) { |
| VertexAttribManager::VertexAttribInfo* info = |
| vertex_attrib_manager_->GetVertexAttribInfo(index); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glVertexAttrib1fv: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glVertexAttrib1fv", "index out of range"); |
| return; |
| } |
| VertexAttribManager::VertexAttribInfo::Vec4 value; |
| @@ -6024,7 +6047,7 @@ void GLES2DecoderImpl::DoVertexAttrib2fv(GLuint index, const GLfloat* v) { |
| VertexAttribManager::VertexAttribInfo* info = |
| vertex_attrib_manager_->GetVertexAttribInfo(index); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glVertexAttrib2fv: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glVertexAttrib2fv", "index out of range"); |
| return; |
| } |
| VertexAttribManager::VertexAttribInfo::Vec4 value; |
| @@ -6040,7 +6063,7 @@ void GLES2DecoderImpl::DoVertexAttrib3fv(GLuint index, const GLfloat* v) { |
| VertexAttribManager::VertexAttribInfo* info = |
| vertex_attrib_manager_->GetVertexAttribInfo(index); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glVertexAttrib3fv: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glVertexAttrib3fv", "index out of range"); |
| return; |
| } |
| VertexAttribManager::VertexAttribInfo::Vec4 value; |
| @@ -6056,7 +6079,7 @@ void GLES2DecoderImpl::DoVertexAttrib4fv(GLuint index, const GLfloat* v) { |
| VertexAttribManager::VertexAttribInfo* info = |
| vertex_attrib_manager_->GetVertexAttribInfo(index); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glVertexAttrib4fv: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glVertexAttrib4fv", "index out of range"); |
| return; |
| } |
| VertexAttribManager::VertexAttribInfo::Vec4 value; |
| @@ -6072,7 +6095,7 @@ error::Error GLES2DecoderImpl::HandleVertexAttribPointer( |
| uint32 immediate_data_size, const gles2::VertexAttribPointer& c) { |
| if (!bound_array_buffer_ || bound_array_buffer_->IsDeleted()) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glVertexAttribPointer: no array buffer bound"); |
| + "glVertexAttribPointer", "no array buffer bound"); |
| return error::kNoError; |
| } |
| @@ -6085,43 +6108,43 @@ error::Error GLES2DecoderImpl::HandleVertexAttribPointer( |
| const void* ptr = reinterpret_cast<const void*>(offset); |
| if (!validators_->vertex_attrib_type.IsValid(type)) { |
| SetGLError(GL_INVALID_ENUM, |
| - "glVertexAttribPointer: type GL_INVALID_ENUM"); |
| + "glVertexAttribPointer", "type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->vertex_attrib_size.IsValid(size)) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glVertexAttribPointer: size GL_INVALID_VALUE"); |
| + "glVertexAttribPointer", "size GL_INVALID_VALUE"); |
| return error::kNoError; |
| } |
| if (indx >= group_->max_vertex_attribs()) { |
| - SetGLError(GL_INVALID_VALUE, "glVertexAttribPointer: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glVertexAttribPointer", "index out of range"); |
| return error::kNoError; |
| } |
| if (stride < 0) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glVertexAttribPointer: stride < 0"); |
| + "glVertexAttribPointer", "stride < 0"); |
| return error::kNoError; |
| } |
| if (stride > 255) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glVertexAttribPointer: stride > 255"); |
| + "glVertexAttribPointer", "stride > 255"); |
| return error::kNoError; |
| } |
| if (offset < 0) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glVertexAttribPointer: offset < 0"); |
| + "glVertexAttribPointer", "offset < 0"); |
| return error::kNoError; |
| } |
| GLsizei component_size = |
| GLES2Util::GetGLTypeSizeForTexturesAndBuffers(type); |
| if (offset % component_size > 0) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glVertexAttribPointer: offset not valid for type"); |
| + "glVertexAttribPointer", "offset not valid for type"); |
| return error::kNoError; |
| } |
| if (stride % component_size > 0) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glVertexAttribPointer: stride not valid for type"); |
| + "glVertexAttribPointer", "stride not valid for type"); |
| return error::kNoError; |
| } |
| vertex_attrib_manager_->SetAttribInfo( |
| @@ -6152,13 +6175,13 @@ error::Error GLES2DecoderImpl::HandleVertexAttribDivisorANGLE( |
| uint32 immediate_data_size, const gles2::VertexAttribDivisorANGLE& c) { |
| if (!feature_info_->feature_flags().angle_instanced_arrays) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glVertexAttribDivisorANGLE: function not available"); |
| + "glVertexAttribDivisorANGLE", "function not available"); |
| } |
| GLuint index = c.index; |
| GLuint divisor = c.divisor; |
| if (index >= group_->max_vertex_attribs()) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glVertexAttribDivisorANGLE: index out of range"); |
| + "glVertexAttribDivisorANGLE", "index out of range"); |
| return error::kNoError; |
| } |
| @@ -6178,7 +6201,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels( |
| GLenum format = c.format; |
| GLenum type = c.type; |
| if (width < 0 || height < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions < 0"); |
| return error::kNoError; |
| } |
| typedef gles2::ReadPixels::Result Result; |
| @@ -6196,11 +6219,11 @@ error::Error GLES2DecoderImpl::HandleReadPixels( |
| } |
| if (!validators_->read_pixel_format.IsValid(format)) { |
| - SetGLError(GL_INVALID_ENUM, "glReadPixels: format GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glReadPixels", "format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->pixel_type.IsValid(type)) { |
| - SetGLError(GL_INVALID_ENUM, "glReadPixels: type GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glReadPixels", "type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (width == 0 || height == 0) { |
| @@ -6213,7 +6236,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, "glReadPixels: dimensions out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions out of range"); |
| return error::kNoError; |
| } |
| @@ -6234,7 +6257,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels( |
| if (!GLES2Util::ComputeImageDataSizes( |
| width, 2, format, type, pack_alignment_, &temp_size, |
| &unpadded_row_size, &padded_row_size)) { |
| - SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions out of range"); |
| return error::kNoError; |
| } |
| @@ -6243,7 +6266,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels( |
| if (!GLES2Util::ComputeImageDataSizes( |
| dest_x_offset, 1, format, type, pack_alignment_, &dest_row_offset, NULL, |
| NULL)) { |
| - SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions out of range"); |
| return error::kNoError; |
| } |
| @@ -6283,13 +6306,15 @@ error::Error GLES2DecoderImpl::HandleReadPixels( |
| if (!GLES2Util::ComputeImageDataSizes( |
| width, 2, format, type, pack_alignment_, &temp_size, |
| &unpadded_row_size, &padded_row_size)) { |
| - SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions out of range"); |
| return error::kNoError; |
| } |
| // NOTE: Assumes the type is GL_UNSIGNED_BYTE which was true at the time |
| // of this implementation. |
| if (type != GL_UNSIGNED_BYTE) { |
| - SetGLError(GL_INVALID_OPERATION, "unsupported readPixel format"); |
| + SetGLError( |
| + GL_INVALID_OPERATION, "glReadPixels", |
| + "unsupported readPixel format"); |
| return error::kNoError; |
| } |
| switch (format) { |
| @@ -6322,7 +6347,7 @@ error::Error GLES2DecoderImpl::HandlePixelStorei( |
| GLenum pname = c.pname; |
| GLenum param = c.param; |
| if (!validators_->pixel_store.IsValid(pname)) { |
| - SetGLError(GL_INVALID_ENUM, "glPixelStorei: pname GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glPixelStorei", "pname GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| switch (pname) { |
| @@ -6330,7 +6355,7 @@ error::Error GLES2DecoderImpl::HandlePixelStorei( |
| case GL_UNPACK_ALIGNMENT: |
| if (!validators_->pixel_store_alignment.IsValid(param)) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glPixelSTore: param GL_INVALID_VALUE"); |
| + "glPixelStore", "param GL_INVALID_VALUE"); |
| return error::kNoError; |
| } |
| break; |
| @@ -6366,7 +6391,7 @@ error::Error GLES2DecoderImpl::HandlePostSubBufferCHROMIUM( |
| TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandlePostSubBufferCHROMIUM"); |
| if (!context_->HasExtension("GL_CHROMIUM_post_sub_buffer")) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glPostSubBufferCHROMIUM: command not supported by surface"); |
| + "glPostSubBufferCHROMIUM", "command not supported by surface"); |
| return error::kNoError; |
| } |
| if (surface_->PostSubBuffer(c.x, c.y, c.width, c.height)) { |
| @@ -6381,7 +6406,7 @@ error::Error GLES2DecoderImpl::GetAttribLocationHelper( |
| GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, |
| const std::string& name_str) { |
| if (!StringIsValidForGLES(name_str.c_str())) { |
| - SetGLError(GL_INVALID_VALUE, "glGetAttribLocation: Invalid character"); |
| + SetGLError(GL_INVALID_VALUE, "glGetAttribLocation", "Invalid character"); |
| return error::kNoError; |
| } |
| ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( |
| @@ -6390,7 +6415,8 @@ error::Error GLES2DecoderImpl::GetAttribLocationHelper( |
| return error::kNoError; |
| } |
| if (!info->IsValid()) { |
| - SetGLError(GL_INVALID_OPERATION, "glGetAttribLocation: program not linked"); |
| + SetGLError( |
| + GL_INVALID_OPERATION, "glGetAttribLocation", "program not linked"); |
| return error::kNoError; |
| } |
| GLint* location = GetSharedMemoryAs<GLint*>( |
| @@ -6451,7 +6477,7 @@ error::Error GLES2DecoderImpl::GetUniformLocationHelper( |
| GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, |
| const std::string& name_str) { |
| if (!StringIsValidForGLES(name_str.c_str())) { |
| - SetGLError(GL_INVALID_VALUE, "glGetUniformLocation: Invalid character"); |
| + SetGLError(GL_INVALID_VALUE, "glGetUniformLocation", "Invalid character"); |
| return error::kNoError; |
| } |
| ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( |
| @@ -6460,8 +6486,8 @@ error::Error GLES2DecoderImpl::GetUniformLocationHelper( |
| return error::kNoError; |
| } |
| if (!info->IsValid()) { |
| - SetGLError(GL_INVALID_OPERATION, |
| - "glGetUniformLocation: program not linked"); |
| + SetGLError( |
| + GL_INVALID_OPERATION, "glGetUniformLocation", "program not linked"); |
| return error::kNoError; |
| } |
| GLint* location = GetSharedMemoryAs<GLint*>( |
| @@ -6523,7 +6549,7 @@ error::Error GLES2DecoderImpl::HandleGetString( |
| uint32 immediate_data_size, const gles2::GetString& c) { |
| GLenum name = static_cast<GLenum>(c.name); |
| if (!validators_->string_type.IsValid(name)) { |
| - SetGLError(GL_INVALID_ENUM, "glGetString: name 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)); |
| @@ -6573,20 +6599,20 @@ error::Error GLES2DecoderImpl::HandleGetString( |
| void GLES2DecoderImpl::DoBufferData( |
| GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) { |
| if (!validators_->buffer_target.IsValid(target)) { |
| - SetGLError(GL_INVALID_ENUM, "glBufferData: target GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glBufferData", "target GL_INVALID_ENUM"); |
| return; |
| } |
| if (!validators_->buffer_usage.IsValid(usage)) { |
| - SetGLError(GL_INVALID_ENUM, "glBufferData: usage GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glBufferData", "usage GL_INVALID_ENUM"); |
| return; |
| } |
| if (size < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glBufferData: size < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0"); |
| return; |
| } |
| BufferManager::BufferInfo* info = GetBufferInfoForTarget(target); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glBufferData: unknown buffer"); |
| + SetGLError(GL_INVALID_VALUE, "glBufferData", "unknown buffer"); |
| return; |
| } |
| // Clear the buffer to 0 if no initial data was passed in. |
| @@ -6649,11 +6675,11 @@ void GLES2DecoderImpl::DoBufferSubData( |
| GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) { |
| BufferManager::BufferInfo* info = GetBufferInfoForTarget(target); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glBufferSubData: unknown buffer"); |
| + SetGLError(GL_INVALID_VALUE, "glBufferSubData", "unknown buffer"); |
| return; |
| } |
| if (!info->SetRange(offset, size, data)) { |
| - SetGLError(GL_INVALID_VALUE, "glBufferSubData: out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glBufferSubData", "out of range"); |
| return; |
| } |
| if (bufferdata_faster_than_buffersubdata_ && |
| @@ -6763,6 +6789,118 @@ bool GLES2DecoderImpl::ClearLevel( |
| return true; |
| } |
| +bool GLES2DecoderImpl::ValidateCompressedTexFuncData( |
| + const char* function_name, |
| + GLsizei width, GLsizei height, GLenum format, size_t size) { |
| + unsigned int bytes_required = 0; |
| + |
| + switch (format) { |
| + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: |
|
apatrick_chromium
2012/06/08 18:46:47
body of switch should be indented 2 spaces.
greggman
2012/06/08 20:01:13
Done.
|
| + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: |
| + { |
| + const int kBlockWidth = 4; |
| + const int kBlockHeight = 4; |
| + const int kBlockSize = 8; |
| + int num_blocks_across = (width + kBlockWidth - 1) / kBlockWidth; |
| + int num_blocks_down = (height + kBlockHeight - 1) / kBlockHeight; |
| + int num_blocks = num_blocks_across * num_blocks_down; |
| + bytes_required = num_blocks * kBlockSize; |
| + } |
| + break; |
| + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: |
| + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: |
| + { |
| + const int kBlockWidth = 4; |
|
apatrick_chromium
2012/06/08 18:46:47
nit: single definition of kBlockWidth and kBlockHe
|
| + const int kBlockHeight = 4; |
| + const int kBlockSize = 16; |
| + int num_blocks_across = (width + kBlockWidth - 1) / kBlockWidth; |
| + int num_blocks_down = (height + kBlockHeight - 1) / kBlockHeight; |
| + int num_blocks = num_blocks_across * num_blocks_down; |
| + bytes_required = num_blocks * kBlockSize; |
| + } |
| + break; |
| + default: |
| + SetGLError(GL_INVALID_ENUM, function_name, "invalid format"); |
| + return false; |
| + } |
| + |
| + if (size != bytes_required) { |
| + SetGLError( |
| + GL_INVALID_VALUE, function_name, "size is not correct for dimensions"); |
| + return false; |
| + } |
| + |
| + return true; |
| +} |
| + |
| +bool GLES2DecoderImpl::ValidateCompressedTexDimensions( |
| + const char* function_name, |
| + GLint level, GLsizei width, GLsizei height, GLenum format) { |
| + switch (format) { |
| + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: |
| + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: |
| + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: |
| + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: { |
| + const int kBlockWidth = 4; |
|
apatrick_chromium
2012/06/08 18:46:47
In fact, why not just have a single constant for D
greggman
2012/06/08 20:01:13
Done.
|
| + const int kBlockHeight = 4; |
| + bool width_valid = (level && width == 1) || |
| + (level && width == 2) || !(width % kBlockWidth); |
| + bool height_valid = (level && height == 1) || |
| + (level && height == 2) || !(height % kBlockHeight); |
|
apatrick_chromium
2012/06/08 18:46:47
nit: up to you but you could have a function like
greggman
2012/06/08 20:01:13
Done.
|
| + if (!width_valid || !height_valid) { |
| + SetGLError( |
| + GL_INVALID_OPERATION, function_name, |
| + "width or height invalid for level"); |
| + return false; |
| + } |
| + return true; |
| + } |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| +bool GLES2DecoderImpl::ValidateCompressedTexSubDimensions( |
| + const char* function_name, |
| + GLenum target, GLint level, GLint xoffset, GLint yoffset, |
| + GLsizei width, GLsizei height, GLenum format, |
| + TextureManager::TextureInfo* texture) { |
| + if (xoffset < 0 || yoffset < 0) { |
| + SetGLError( |
| + GL_INVALID_VALUE, function_name, "xoffset or yoffset < 0"); |
| + return false; |
| + } |
| + |
| + switch (format) { |
| + case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: |
|
apatrick_chromium
2012/06/08 18:46:47
indent body of switch.
greggman
2012/06/08 20:01:13
Done.
|
| + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: |
| + case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: |
| + case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: { |
| + const int kBlockWidth = 4; |
| + const int kBlockHeight = 4; |
| + if ((xoffset % kBlockWidth) || (yoffset % kBlockHeight)) { |
| + SetGLError( |
| + GL_INVALID_OPERATION, function_name, |
| + "xoffset or yoffset not multiple of 4"); |
| + return false; |
| + } |
| + GLsizei tex_width = 0; |
| + GLsizei tex_height = 0; |
| + if (!texture->GetLevelSize(target, level, &tex_width, &tex_height) || |
| + width - xoffset > tex_width || |
| + height - yoffset > tex_height) { |
| + SetGLError( |
| + GL_INVALID_OPERATION, function_name, "dimensions out of range"); |
| + return false; |
| + } |
| + return ValidateCompressedTexDimensions( |
| + function_name, level, width, height, format); |
| + } |
| + default: |
| + return false; |
| + } |
| +} |
| + |
| error::Error GLES2DecoderImpl::DoCompressedTexImage2D( |
| GLenum target, |
| GLint level, |
| @@ -6775,30 +6913,37 @@ error::Error GLES2DecoderImpl::DoCompressedTexImage2D( |
| // TODO(gman): Validate image_size is correct for width, height and format. |
| if (!validators_->texture_target.IsValid(target)) { |
| SetGLError(GL_INVALID_ENUM, |
| - "glCompressedTexImage2D: target GL_INVALID_ENUM"); |
| + "glCompressedTexImage2D", "target GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->compressed_texture_format.IsValid( |
| internal_format)) { |
| SetGLError(GL_INVALID_ENUM, |
| - "glCompressedTexImage2D: internal_format 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, |
| - "glCompressedTexImage2D: dimensions out of range"); |
| + "glCompressedTexImage2D", "dimensions out of range"); |
| return error::kNoError; |
| } |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glCompressedTexImage2D: unknown texture target"); |
| + "glCompressedTexImage2D", "unknown texture target"); |
| return error::kNoError; |
| } |
| if (info->IsImmutable()) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glCompressedTexImage2D: texture is immutable"); |
| + "glCompressedTexImage2D", "texture is immutable"); |
| + return error::kNoError; |
| + } |
| + |
| + if (!ValidateCompressedTexDimensions( |
| + "glCompressedTexImage2D", level, width, height, internal_format) || |
| + !ValidateCompressedTexFuncData( |
| + "glCompressedTexImage2D", width, height, internal_format, image_size)) { |
| return error::kNoError; |
| } |
| @@ -6913,24 +7058,24 @@ error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2DBucket( |
| } |
| if (!validators_->texture_target.IsValid(target)) { |
| SetGLError( |
| - GL_INVALID_ENUM, "glCompressedTexSubImage2D: target GL_INVALID_ENUM"); |
| + GL_INVALID_ENUM, "glCompressedTexSubImage2D", "target GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->compressed_texture_format.IsValid(format)) { |
| SetGLError(GL_INVALID_ENUM, |
| - "glCompressedTexSubImage2D: format GL_INVALID_ENUM"); |
| + "glCompressedTexSubImage2D", "format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (width < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: width < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D", "width < 0"); |
| return error::kNoError; |
| } |
| if (height < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: height < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D", "height < 0"); |
| return error::kNoError; |
| } |
| if (imageSize < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D: imageSize < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D", "imageSize < 0"); |
| return error::kNoError; |
| } |
| DoCompressedTexSubImage2D( |
| @@ -6942,8 +7087,8 @@ bool GLES2DecoderImpl::ValidateTextureParameters( |
| const char* function_name, |
| GLenum target, GLenum format, GLenum type, GLint level) { |
| if (!feature_info_->GetTextureFormatValidator(format).IsValid(type)) { |
| - SetGLError(GL_INVALID_OPERATION, |
| - (std::string(function_name) + ": invalid type " + |
| + SetGLError(GL_INVALID_OPERATION, function_name, |
| + (std::string("invalid type ") + |
| GLES2Util::GetStringEnum(type) + " for format " + |
| GLES2Util::GetStringEnum(format)).c_str()); |
| return false; |
| @@ -6951,8 +7096,8 @@ bool GLES2DecoderImpl::ValidateTextureParameters( |
| uint32 channels = GLES2Util::GetChannelsForFormat(format); |
| if ((channels & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && level) { |
| - SetGLError(GL_INVALID_OPERATION, |
| - (std::string(function_name) + ": invalid type " + |
| + SetGLError(GL_INVALID_OPERATION, function_name, |
| + (std::string("invalid type ") + |
| GLES2Util::GetStringEnum(type) + " for format " + |
| GLES2Util::GetStringEnum(format)).c_str()); |
| return false; |
| @@ -6972,24 +7117,25 @@ error::Error GLES2DecoderImpl::DoTexImage2D( |
| const void* pixels, |
| uint32 pixels_size) { |
| if (!validators_->texture_target.IsValid(target)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexImage2D: target GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexImage2D", "target GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->texture_format.IsValid(internal_format)) { |
| SetGLError(GL_INVALID_ENUM, |
| - "glTexImage2D: internal_format GL_INVALID_ENUM"); |
| + "glTexImage2D", "internal_format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->texture_format.IsValid(format)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexImage2D: format GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexImage2D", "format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->pixel_type.IsValid(type)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexImage2D: type GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexImage2D", "type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (format != internal_format) { |
| - SetGLError(GL_INVALID_OPERATION, "glTexImage2D: format != internalFormat"); |
| + SetGLError(GL_INVALID_OPERATION, |
| + "glTexImage2D", "format != internalFormat"); |
| return error::kNoError; |
| } |
| if (!ValidateTextureParameters("glTexImage2D", target, format, type, level)) { |
| @@ -6997,26 +7143,26 @@ error::Error GLES2DecoderImpl::DoTexImage2D( |
| } |
| if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || |
| border != 0) { |
| - SetGLError(GL_INVALID_VALUE, "glTexImage2D: dimensions out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glTexImage2D", "dimensions out of range"); |
| return error::kNoError; |
| } |
| if ((GLES2Util::GetChannelsForFormat(format) & |
| (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && pixels) { |
| SetGLError( |
| GL_INVALID_OPERATION, |
| - "glTexImage2D: can not supply data for depth or stencil textures"); |
| + "glTexImage2D", "can not supply data for depth or stencil textures"); |
| return error::kNoError; |
| } |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexImage2D: unknown texture for target"); |
| + "glTexImage2D", "unknown texture for target"); |
| return error::kNoError; |
| } |
| if (info->IsImmutable()) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexImage2D: texture is immutable"); |
| + "glTexImage2D", "texture is immutable"); |
| return error::kNoError; |
| } |
| @@ -7141,7 +7287,7 @@ void GLES2DecoderImpl::DoCompressedTexSubImage2D( |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glCompressedTexSubImage2D: unknown texture for target"); |
| + "glCompressedTexSubImage2D", "unknown texture for target"); |
| return; |
| } |
| GLenum type = 0; |
| @@ -7149,21 +7295,31 @@ void GLES2DecoderImpl::DoCompressedTexSubImage2D( |
| if (!info->GetLevelType(target, level, &type, &internal_format)) { |
| SetGLError( |
| GL_INVALID_OPERATION, |
| - "glCompressedTexSubImage2D: level does not exist."); |
| + "glCompressedTexSubImage2D", "level does not exist."); |
| return; |
| } |
| if (internal_format != format) { |
| SetGLError( |
| GL_INVALID_OPERATION, |
| - "glCompressedTexSubImage2D: format does not match internal format."); |
| + "glCompressedTexSubImage2D", "format does not match internal format."); |
| return; |
| } |
| if (!info->ValidForTexture( |
| target, level, xoffset, yoffset, width, height, format, type)) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glCompressedTexSubImage2D: bad dimensions."); |
| + "glCompressedTexSubImage2D", "bad dimensions."); |
| + return; |
| + } |
| + |
| + if (!ValidateCompressedTexFuncData( |
| + "glCompressedTexSubImage2D", width, height, format, image_size) || |
| + !ValidateCompressedTexSubDimensions( |
| + "glCompressedTexSubImage2D", |
| + target, level, xoffset, yoffset, width, height, format, info)) { |
| return; |
| } |
| + |
| + |
| // Note: There is no need to deal with texture cleared tracking here |
| // because the validation above means you can only get here if the level |
| // is already a matching compressed format and in that case |
| @@ -7201,16 +7357,16 @@ void GLES2DecoderImpl::DoCopyTexImage2D( |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glCopyTexImage2D: unknown texture for target"); |
| + "glCopyTexImage2D", "unknown texture for target"); |
| return; |
| } |
| if (info->IsImmutable()) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glCopyTexImage2D: texture is immutable"); |
| + "glCopyTexImage2D", "texture is immutable"); |
| } |
| if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || |
| border != 0) { |
| - SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D: dimensions out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "dimensions out of range"); |
| return; |
| } |
| if (!ValidateTextureParameters( |
| @@ -7224,14 +7380,14 @@ void GLES2DecoderImpl::DoCopyTexImage2D( |
| uint32 channels_needed = GLES2Util::GetChannelsForFormat(internal_format); |
| if ((channels_needed & channels_exist) != channels_needed) { |
| - SetGLError(GL_INVALID_OPERATION, "glCopyTexImage2D: incompatible format"); |
| + SetGLError(GL_INVALID_OPERATION, "glCopyTexImage2D", "incompatible format"); |
| return; |
| } |
| if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { |
| SetGLError( |
| GL_INVALID_OPERATION, |
| - "glCopyImage2D: can not be used with depth or stencil textures"); |
| + "glCopyImage2D", "can not be used with depth or stencil textures"); |
| return; |
| } |
| @@ -7267,7 +7423,7 @@ void GLES2DecoderImpl::DoCopyTexImage2D( |
| info->service_id(), info->target(), |
| target, level, internal_format, GL_UNSIGNED_BYTE, width, height, |
| info->IsImmutable())) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glCopyTexImage2D: dimensions too big"); |
| + SetGLError(GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); |
| return; |
| } |
| if (copyHeight > 0 && copyWidth > 0) { |
| @@ -7303,7 +7459,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D( |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glCopyTexSubImage2D: unknown texture for target"); |
| + "glCopyTexSubImage2D", "unknown texture for target"); |
| return; |
| } |
| GLenum type = 0; |
| @@ -7312,7 +7468,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D( |
| !info->ValidForTexture( |
| target, level, xoffset, yoffset, width, height, format, type)) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glCopyTexSubImage2D: bad dimensions."); |
| + "glCopyTexSubImage2D", "bad dimensions."); |
| return; |
| } |
| @@ -7323,14 +7479,14 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D( |
| if ((channels_needed & channels_exist) != channels_needed) { |
| SetGLError( |
| - GL_INVALID_OPERATION, "glCopyTexSubImage2D: incompatible format"); |
| + GL_INVALID_OPERATION, "glCopyTexSubImage2D", "incompatible format"); |
| return; |
| } |
| if ((channels_needed & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { |
| SetGLError( |
| GL_INVALID_OPERATION, |
| - "glCopySubImage2D: can not be used with depth or stencil textures"); |
| + "glCopySubImage2D", "can not be used with depth or stencil textures"); |
| return; |
| } |
| @@ -7348,7 +7504,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D( |
| Clip(y, height, size.height(), ©Y, ©Height); |
| if (!texture_manager()->ClearTextureLevel(this, info, target, level)) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glCopyTexSubImage2D: dimensions too big"); |
| + SetGLError(GL_OUT_OF_MEMORY, "glCopyTexSubImage2D", "dimensions too big"); |
| return; |
| } |
| @@ -7361,7 +7517,8 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D( |
| if (!GLES2Util::ComputeImageDataSizes( |
| width, height, format, type, unpack_alignment_, &pixels_size, NULL, |
| NULL)) { |
| - SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D: dimensions too large"); |
| + SetGLError( |
| + GL_INVALID_VALUE, "glCopyTexSubImage2D", "dimensions too large"); |
| return; |
| } |
| scoped_array<char> zero(new char[pixels_size]); |
| @@ -7395,32 +7552,30 @@ void GLES2DecoderImpl::DoTexSubImage2D( |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexSubImage2D: unknown texture for target"); |
| + "glTexSubImage2D", "unknown texture for target"); |
| return; |
| } |
| GLenum current_type = 0; |
| GLenum internal_format = 0; |
| if (!info->GetLevelType(target, level, ¤t_type, &internal_format)) { |
| SetGLError( |
| - GL_INVALID_OPERATION, |
| - "glTexSubImage2D: level does not exist."); |
| + GL_INVALID_OPERATION, "glTexSubImage2D", "level does not exist."); |
| return; |
| } |
| if (format != internal_format) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexSubImage2D: format does not match internal format."); |
| + "glTexSubImage2D", "format does not match internal format."); |
| return; |
| } |
| if (type != current_type) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexSubImage2D: type does not match type of texture."); |
| + "glTexSubImage2D", "type does not match type of texture."); |
| return; |
| } |
| if (!info->ValidForTexture( |
| target, level, xoffset, yoffset, width, height, format, type)) { |
| - SetGLError(GL_INVALID_VALUE, |
| - "glTexSubImage2D: bad dimensions."); |
| + SetGLError(GL_INVALID_VALUE, "glTexSubImage2D", "bad dimensions."); |
| return; |
| } |
| @@ -7428,7 +7583,7 @@ void GLES2DecoderImpl::DoTexSubImage2D( |
| (GLES2Util::kDepth | GLES2Util::kStencil)) != 0) { |
| SetGLError( |
| GL_INVALID_OPERATION, |
| - "glTexSubImage2D: can not supply data for depth or stencil textures"); |
| + "glTexSubImage2D", "can not supply data for depth or stencil textures"); |
| return; |
| } |
| @@ -7439,7 +7594,7 @@ void GLES2DecoderImpl::DoTexSubImage2D( |
| if (xoffset != 0 || yoffset != 0 || |
| width != tex_width || height != tex_height) { |
| if (!texture_manager()->ClearTextureLevel(this, info, target, level)) { |
| - SetGLError(GL_OUT_OF_MEMORY, "glTexSubImage2D: dimensions too big"); |
| + SetGLError(GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); |
| return; |
| } |
| glTexSubImage2D( |
| @@ -7482,23 +7637,23 @@ error::Error GLES2DecoderImpl::HandleTexSubImage2D( |
| const void* pixels = GetSharedMemoryAs<const void*>( |
| c.pixels_shm_id, c.pixels_shm_offset, data_size); |
| if (!validators_->texture_target.IsValid(target)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D", "target GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (width < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: width < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glTexSubImage2D", "width < 0"); |
| return error::kNoError; |
| } |
| if (height < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glTexSubImage2D", "height < 0"); |
| return error::kNoError; |
| } |
| if (!validators_->texture_format.IsValid(format)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D", "format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->pixel_type.IsValid(type)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D", "type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (pixels == NULL) { |
| @@ -7531,23 +7686,23 @@ error::Error GLES2DecoderImpl::HandleTexSubImage2DImmediate( |
| const void* pixels = GetImmediateDataAs<const void*>( |
| c, data_size, immediate_data_size); |
| if (!validators_->texture_target.IsValid(target)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D", "target GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (width < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: width < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glTexSubImage2D", "width < 0"); |
| return error::kNoError; |
| } |
| if (height < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glTexSubImage2D", "height < 0"); |
| return error::kNoError; |
| } |
| if (!validators_->texture_format.IsValid(format)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D", "format GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->pixel_type.IsValid(type)) { |
| - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM"); |
| + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D", "type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (pixels == NULL) { |
| @@ -7574,12 +7729,12 @@ error::Error GLES2DecoderImpl::HandleGetVertexAttribPointerv( |
| } |
| if (!validators_->vertex_pointer.IsValid(pname)) { |
| SetGLError(GL_INVALID_ENUM, |
| - "glGetVertexAttribPointerv: pname GL_INVALID_ENUM"); |
| + "glGetVertexAttribPointerv", "pname GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (index >= group_->max_vertex_attribs()) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glGetVertexAttribPointerv: index out of range."); |
| + "glGetVertexAttribPointerv", "index out of range."); |
| return error::kNoError; |
| } |
| result->SetNumResults(1); |
| @@ -7617,7 +7772,7 @@ bool GLES2DecoderImpl::GetUniformSetup( |
| } |
| if (!info->IsValid()) { |
| // Program was not linked successfully. (ie, glLinkProgram) |
| - SetGLError(GL_INVALID_OPERATION, "glGetUniform: program not linked"); |
| + SetGLError(GL_INVALID_OPERATION, "glGetUniform", "program not linked"); |
| return false; |
| } |
| *service_id = info->service_id(); |
| @@ -7627,13 +7782,13 @@ bool GLES2DecoderImpl::GetUniformSetup( |
| fake_location, real_location, &array_index); |
| if (!uniform_info) { |
| // No such location. |
| - SetGLError(GL_INVALID_OPERATION, "glGetUniform: unknown location"); |
| + SetGLError(GL_INVALID_OPERATION, "glGetUniform", "unknown location"); |
| return false; |
| } |
| GLenum type = uniform_info->type; |
| GLsizei size = GLES2Util::GetGLDataTypeSizeForUniforms(type); |
| if (size == 0) { |
| - SetGLError(GL_INVALID_OPERATION, "glGetUniform: unknown type"); |
| + SetGLError(GL_INVALID_OPERATION, "glGetUniform", "unknown type"); |
| return false; |
| } |
| result = GetSharedMemoryAs<SizedResult<GLint>*>( |
| @@ -7712,12 +7867,12 @@ error::Error GLES2DecoderImpl::HandleGetShaderPrecisionFormat( |
| } |
| if (!validators_->shader_type.IsValid(shader_type)) { |
| SetGLError(GL_INVALID_ENUM, |
| - "glGetShaderPrecisionFormat: shader_type GL_INVALID_ENUM"); |
| + "glGetShaderPrecisionFormat", "shader_type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| if (!validators_->shader_precision.IsValid(precision_type)) { |
| SetGLError(GL_INVALID_ENUM, |
| - "glGetShaderPrecisionFormat: precision_type GL_INVALID_ENUM"); |
| + "glGetShaderPrecisionFormat", "precision_type GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| @@ -7803,7 +7958,7 @@ error::Error GLES2DecoderImpl::HandleGetActiveUniform( |
| const ProgramManager::ProgramInfo::UniformInfo* uniform_info = |
| info->GetUniformInfo(index); |
| if (!uniform_info) { |
| - SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glGetActiveUniform", "index out of range"); |
| return error::kNoError; |
| } |
| result->success = 1; // true. |
| @@ -7837,7 +7992,7 @@ error::Error GLES2DecoderImpl::HandleGetActiveAttrib( |
| const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = |
| info->GetAttribInfo(index); |
| if (!attrib_info) { |
| - SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: index out of range"); |
| + SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib", "index out of range"); |
| return error::kNoError; |
| } |
| result->success = 1; // true. |
| @@ -7851,17 +8006,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, "glShaderBinary: not supported"); |
| + 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, "glShaderBinary: n < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glShaderBinary", "n < 0"); |
| return error::kNoError; |
| } |
| GLsizei length = static_cast<GLsizei>(c.length); |
| if (length < 0) { |
| - SetGLError(GL_INVALID_VALUE, "glShaderBinary: length < 0"); |
| + SetGLError(GL_INVALID_VALUE, "glShaderBinary", "length < 0"); |
| return error::kNoError; |
| } |
| uint32 data_size; |
| @@ -7880,7 +8035,7 @@ error::Error GLES2DecoderImpl::HandleShaderBinary( |
| for (GLsizei ii = 0; ii < n; ++ii) { |
| ShaderManager::ShaderInfo* info = GetShaderInfo(shaders[ii]); |
| if (!info) { |
| - SetGLError(GL_INVALID_VALUE, "glShaderBinary: unknown shader"); |
| + SetGLError(GL_INVALID_VALUE, "glShaderBinary", "unknown shader"); |
| return error::kNoError; |
| } |
| service_ids[ii] = info->service_id(); |
| @@ -8112,7 +8267,7 @@ error::Error GLES2DecoderImpl::HandleGetMultipleIntegervCHROMIUM( |
| uint32 num = util_.GLGetNumValuesReturned(enums[ii]); |
| if (num == 0) { |
| SetGLError(GL_INVALID_ENUM, |
| - "glGetMulitpleCHROMIUM: pname GL_INVALID_ENUM"); |
| + "glGetMulitpleCHROMIUM", "pname GL_INVALID_ENUM"); |
| return error::kNoError; |
| } |
| // Num will never be more than 4. |
| @@ -8129,7 +8284,7 @@ error::Error GLES2DecoderImpl::HandleGetMultipleIntegervCHROMIUM( |
| if (result_size != static_cast<uint32>(c.size)) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glGetMulitpleCHROMIUM: bad size GL_INVALID_VALUE"); |
| + "glGetMulitpleCHROMIUM", "bad size GL_INVALID_VALUE"); |
| return error::kNoError; |
| } |
| @@ -8259,7 +8414,7 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT( |
| break; |
| default: |
| if (!feature_info_->feature_flags().occlusion_query_boolean) { |
| - SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT: not enabled"); |
| + SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "not enabled"); |
| return error::kNoError; |
| } |
| break; |
| @@ -8267,12 +8422,12 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT( |
| if (current_query_) { |
| SetGLError( |
| - GL_INVALID_OPERATION, "glBeginQueryEXT: query already in progress"); |
| + GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); |
| return error::kNoError; |
| } |
| if (client_id == 0) { |
| - SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT: id is 0"); |
| + SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0"); |
| return error::kNoError; |
| } |
| @@ -8292,7 +8447,7 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT( |
| // group_->GetIdAllocator(id_namespaces::kQueries); |
| // if (!id_allocator->InUse(client_id)) { |
| // SetGLError(GL_INVALID_OPERATION, |
| - // "glBeginQueryEXT: id not made by glGenQueriesEXT"); |
| + // "glBeginQueryEXT", "id not made by glGenQueriesEXT"); |
| // return error::kNoError; |
| // } |
| query = query_manager_->CreateQuery( |
| @@ -8300,7 +8455,8 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT( |
| } |
| if (query->target() != target) { |
| - SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT: target does not match"); |
| + SetGLError( |
| + GL_INVALID_OPERATION, "glBeginQueryEXT", "target does not match"); |
| return error::kNoError; |
| } else if (query->shm_id() != sync_shm_id || |
| query->shm_offset() != sync_shm_offset) { |
| @@ -8322,12 +8478,12 @@ error::Error GLES2DecoderImpl::HandleEndQueryEXT( |
| uint32 submit_count = static_cast<GLuint>(c.submit_count); |
| if (!current_query_) { |
| - SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT: No active query"); |
| + SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "No active query"); |
| return error::kNoError; |
| } |
| if (current_query_->target() != target) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glEndQueryEXT: target does not match active query"); |
| + "glEndQueryEXT", "target does not match active query"); |
| return error::kNoError; |
| } |
| @@ -8344,7 +8500,7 @@ error::Error GLES2DecoderImpl::HandleCreateStreamTextureCHROMIUM( |
| const gles2::CreateStreamTextureCHROMIUM& c) { |
| if (!feature_info_->feature_flags().chromium_stream_texture) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glOpenStreamTextureCHROMIUM: " |
| + "glOpenStreamTextureCHROMIUM", "" |
| "not supported."); |
| return error::kNoError; |
| } |
| @@ -8361,21 +8517,21 @@ error::Error GLES2DecoderImpl::HandleCreateStreamTextureCHROMIUM( |
| texture_manager()->GetTextureInfo(client_id); |
| if (!info) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glCreateStreamTextureCHROMIUM: " |
| + "glCreateStreamTextureCHROMIUM", "" |
| "bad texture id."); |
| return error::kNoError; |
| } |
| if (info->IsStreamTexture()) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glCreateStreamTextureCHROMIUM: " |
| + "glCreateStreamTextureCHROMIUM", "" |
| "is already a stream texture."); |
| return error::kNoError; |
| } |
| if (info->target() && info->target() != GL_TEXTURE_EXTERNAL_OES) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glCreateStreamTextureCHROMIUM: " |
| + "glCreateStreamTextureCHROMIUM", "" |
| "is already bound to incompatible target."); |
| return error::kNoError; |
| } |
| @@ -8390,7 +8546,7 @@ error::Error GLES2DecoderImpl::HandleCreateStreamTextureCHROMIUM( |
| info->SetStreamTexture(true); |
| } else { |
| SetGLError(GL_OUT_OF_MEMORY, |
| - "glCreateStreamTextureCHROMIUM: " |
| + "glCreateStreamTextureCHROMIUM", "" |
| "failed to create platform texture."); |
| } |
| @@ -8413,7 +8569,7 @@ error::Error GLES2DecoderImpl::HandleDestroyStreamTextureCHROMIUM( |
| texture_manager()->SetInfoTarget(info, 0); |
| } else { |
| SetGLError(GL_INVALID_VALUE, |
| - "glDestroyStreamTextureCHROMIUM: bad texture id."); |
| + "glDestroyStreamTextureCHROMIUM", "bad texture id."); |
| } |
| return error::kNoError; |
| @@ -8437,15 +8593,16 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( |
| GLuint io_surface_id, GLuint plane) { |
| #if defined(OS_MACOSX) |
| if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL) { |
| - SetGLError(GL_INVALID_OPERATION, |
| - "glTexImageIOSurface2DCHROMIUM: only supported on desktop GL."); |
| + SetGLError( |
| + GL_INVALID_OPERATION, |
| + "glTexImageIOSurface2DCHROMIUM", "only supported on desktop GL."); |
| return; |
| } |
| IOSurfaceSupport* surface_support = IOSurfaceSupport::Initialize(); |
| if (!surface_support) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexImageIOSurface2DCHROMIUM: only supported on 10.6."); |
| + "glTexImageIOSurface2DCHROMIUM", "only supported on 10.6."); |
| return; |
| } |
| @@ -8456,20 +8613,21 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( |
| // know what's going on. |
| SetGLError( |
| GL_INVALID_OPERATION, |
| - "glTexImageIOSurface2DCHROMIUM: requires TEXTURE_RECTANGLE_ARB target"); |
| + "glTexImageIOSurface2DCHROMIUM", |
| + "requires TEXTURE_RECTANGLE_ARB target"); |
| return; |
| } |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexImageIOSurface2DCHROMIUM: no rectangle texture bound"); |
| + "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound"); |
| return; |
| } |
| if (info == texture_manager()->GetDefaultTextureInfo(target)) { |
| // Maybe this is conceptually valid, but disallow it to avoid accidents. |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexImageIOSurface2DCHROMIUM: can't bind default texture"); |
| + "glTexImageIOSurface2DCHROMIUM", "can't bind default texture"); |
| return; |
| } |
| @@ -8480,8 +8638,9 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( |
| // IOSurface in this case. |
| CFTypeRef surface = surface_support->IOSurfaceLookup(io_surface_id); |
| if (!surface) { |
| - SetGLError(GL_INVALID_OPERATION, |
| - "glTexImageIOSurface2DCHROMIUM: no IOSurface with the given ID"); |
| + SetGLError( |
| + GL_INVALID_OPERATION, |
| + "glTexImageIOSurface2DCHROMIUM", "no IOSurface with the given ID"); |
| return; |
| } |
| @@ -8509,7 +8668,7 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( |
| if (err != kCGLNoError) { |
| SetGLError( |
| GL_INVALID_OPERATION, |
| - "glTexImageIOSurface2DCHROMIUM: error in CGLTexImageIOSurface2D"); |
| + "glTexImageIOSurface2DCHROMIUM", "error in CGLTexImageIOSurface2D"); |
| return; |
| } |
| @@ -8519,7 +8678,7 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( |
| #else |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexImageIOSurface2DCHROMIUM: not supported."); |
| + "glTexImageIOSurface2DCHROMIUM", "not supported."); |
| #endif |
| } |
| @@ -8575,20 +8734,20 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( |
| TextureManager::TextureInfo* source_info = GetTextureInfo(source_id); |
| if (!source_info || !dest_info) { |
| - SetGLError(GL_INVALID_VALUE, "glCopyTextureCHROMIUM: unknown texture id"); |
| + SetGLError(GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "unknown texture id"); |
| return; |
| } |
| if (GL_TEXTURE_2D != target) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glCopyTextureCHROMIUM: invalid texture target"); |
| + "glCopyTextureCHROMIUM", "invalid texture target"); |
| return; |
| } |
| if (dest_info->target() != GL_TEXTURE_2D || |
| source_info->target() != GL_TEXTURE_2D) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glCopyTextureCHROMIUM: invalid texture target binding"); |
| + "glCopyTextureCHROMIUM", "invalid texture target binding"); |
| return; |
| } |
| @@ -8596,7 +8755,7 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( |
| if (!source_info->GetLevelSize(GL_TEXTURE_2D, 0, &source_width, |
| &source_height)) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glCopyTextureChromium: source texture has no level 0"); |
| + "glCopyTextureChromium", "source texture has no level 0"); |
| return; |
| } |
| @@ -8604,7 +8763,7 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( |
| if (!texture_manager()->ValidForTarget(GL_TEXTURE_2D, level, source_width, |
| source_height, 1)) { |
| SetGLError(GL_INVALID_VALUE, |
| - "glCopyTextureCHROMIUM: Bad dimensions"); |
| + "glCopyTextureCHROMIUM", "Bad dimensions"); |
| return; |
| } |
| @@ -8735,13 +8894,14 @@ void GLES2DecoderImpl::DoTexStorage2DEXT( |
| TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoTexStorage2DEXT"); |
| if (!texture_manager()->ValidForTarget(target, 0, width, height, 1) || |
| TextureManager::ComputeMipMapCount(width, height, 1) < levels) { |
| - SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT: dimensions out of range"); |
| + SetGLError( |
| + GL_INVALID_VALUE, "glTexStorage2DEXT", "dimensions out of range"); |
| return; |
| } |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexStorage2DEXT: unknown texture for target"); |
| + "glTexStorage2DEXT", "unknown texture for target"); |
| return; |
| } |
| if (info->IsAttachedToFramebuffer()) { |
| @@ -8749,7 +8909,7 @@ void GLES2DecoderImpl::DoTexStorage2DEXT( |
| } |
| if (info->IsImmutable()) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glTexStorage2DEXT: texture is immutable"); |
| + "glTexStorage2DEXT", "texture is immutable"); |
| return; |
| } |
| CopyRealGLErrorsToWrapper(); |
| @@ -8790,14 +8950,14 @@ void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target, |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glProduceTextureCHROMIUM: unknown texture for target"); |
| + "glProduceTextureCHROMIUM", "unknown texture for target"); |
| return; |
| } |
| TextureDefinition* definition = texture_manager()->Save(info); |
| if (!definition) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glProduceTextureCHROMIUM: invalid texture"); |
| + "glProduceTextureCHROMIUM", "invalid texture"); |
| return; |
| } |
| @@ -8809,7 +8969,7 @@ void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target, |
| bool success = texture_manager()->Restore(info, definition); |
| DCHECK(success); |
| SetGLError(GL_INVALID_OPERATION, |
| - "glProduceTextureCHROMIUM: invalid mailbox name"); |
| + "glProduceTextureCHROMIUM", "invalid mailbox name"); |
| return; |
| } |
| @@ -8821,7 +8981,7 @@ void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target, |
| TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| if (!info) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glConsumeTextureCHROMIUM: unknown texture for target"); |
| + "glConsumeTextureCHROMIUM", "unknown texture for target"); |
| return; |
| } |
| @@ -8831,13 +8991,13 @@ void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target, |
| *reinterpret_cast<const MailboxName*>(mailbox))); |
| if (!definition.get()) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glConsumeTextureCHROMIUM: invalid mailbox name"); |
| + "glConsumeTextureCHROMIUM", "invalid mailbox name"); |
| return; |
| } |
| if (!texture_manager()->Restore(info, definition.release())) { |
| SetGLError(GL_INVALID_OPERATION, |
| - "glConsumeTextureCHROMIUM: invalid texture"); |
| + "glConsumeTextureCHROMIUM", "invalid texture"); |
| return; |
| } |