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..31f6a8b5731d205700703d22fbae56370061b686 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; |
} |
@@ -3517,37 +3528,37 @@ bool GLES2DecoderImpl::GetHelper( |
DCHECK(num_written); |
if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { |
switch (pname) { |
- case GL_IMPLEMENTATION_COLOR_READ_FORMAT: |
- *num_written = 1; |
- if (params) { |
- *params = GL_RGBA; // We don't support other formats. |
- } |
- return true; |
- case GL_IMPLEMENTATION_COLOR_READ_TYPE: |
- *num_written = 1; |
- if (params) { |
- *params = GL_UNSIGNED_BYTE; // We don't support other types. |
- } |
- return true; |
- case GL_MAX_FRAGMENT_UNIFORM_VECTORS: |
- *num_written = 1; |
- if (params) { |
- *params = group_->max_fragment_uniform_vectors(); |
- } |
- return true; |
- case GL_MAX_VARYING_VECTORS: |
- *num_written = 1; |
- if (params) { |
- *params = group_->max_varying_vectors(); |
- } |
- return true; |
- case GL_MAX_VERTEX_UNIFORM_VECTORS: |
- *num_written = 1; |
- if (params) { |
- *params = group_->max_vertex_uniform_vectors(); |
+ case GL_IMPLEMENTATION_COLOR_READ_FORMAT: |
+ *num_written = 1; |
+ if (params) { |
+ *params = GL_RGBA; // We don't support other formats. |
+ } |
+ return true; |
+ case GL_IMPLEMENTATION_COLOR_READ_TYPE: |
+ *num_written = 1; |
+ if (params) { |
+ *params = GL_UNSIGNED_BYTE; // We don't support other types. |
+ } |
+ return true; |
+ case GL_MAX_FRAGMENT_UNIFORM_VECTORS: |
+ *num_written = 1; |
+ if (params) { |
+ *params = group_->max_fragment_uniform_vectors(); |
+ } |
+ return true; |
+ case GL_MAX_VARYING_VECTORS: |
+ *num_written = 1; |
+ if (params) { |
+ *params = group_->max_varying_vectors(); |
+ } |
+ return true; |
+ case GL_MAX_VERTEX_UNIFORM_VECTORS: |
+ *num_written = 1; |
+ if (params) { |
+ *params = group_->max_vertex_uniform_vectors(); |
+ } |
+ return true; |
} |
- return true; |
- } |
} |
switch (pname) { |
case GL_MAX_VIEWPORT_DIMS: |
@@ -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,22 +4397,22 @@ void GLES2DecoderImpl::DoGetRenderbufferParameteriv( |
GetRenderbufferInfoForTarget(GL_RENDERBUFFER); |
if (!renderbuffer) { |
SetGLError(GL_INVALID_OPERATION, |
- "glGetRenderbufferParameteriv: no renderbuffer bound"); |
+ "glGetRenderbufferParameteriv", "no renderbuffer bound"); |
return; |
} |
switch (pname) { |
- case GL_RENDERBUFFER_INTERNAL_FORMAT: |
- *params = renderbuffer->internal_format(); |
- break; |
- case GL_RENDERBUFFER_WIDTH: |
- *params = renderbuffer->width(); |
- break; |
- case GL_RENDERBUFFER_HEIGHT: |
- *params = renderbuffer->height(); |
- break; |
- default: |
- glGetRenderbufferParameterivEXT(target, pname, params); |
- break; |
+ case GL_RENDERBUFFER_INTERNAL_FORMAT: |
+ *params = renderbuffer->internal_format(); |
+ break; |
+ case GL_RENDERBUFFER_WIDTH: |
+ *params = renderbuffer->width(); |
+ break; |
+ case GL_RENDERBUFFER_HEIGHT: |
+ *params = renderbuffer->height(); |
+ break; |
+ default: |
+ glGetRenderbufferParameterivEXT(target, pname, params); |
+ break; |
} |
} |
@@ -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; |
@@ -6345,18 +6370,18 @@ error::Error GLES2DecoderImpl::HandlePixelStorei( |
} |
glPixelStorei(pname, param); |
switch (pname) { |
- case GL_PACK_ALIGNMENT: |
- pack_alignment_ = param; |
- break; |
- case GL_PACK_REVERSE_ROW_ORDER_ANGLE: |
- break; |
- case GL_UNPACK_ALIGNMENT: |
- unpack_alignment_ = param; |
- break; |
- default: |
- // Validation should have prevented us from getting here. |
- NOTREACHED(); |
- break; |
+ case GL_PACK_ALIGNMENT: |
+ pack_alignment_ = param; |
+ break; |
+ case GL_PACK_REVERSE_ROW_ORDER_ANGLE: |
+ break; |
+ case GL_UNPACK_ALIGNMENT: |
+ unpack_alignment_ = param; |
+ break; |
+ default: |
+ // Validation should have prevented us from getting here. |
+ NOTREACHED(); |
+ break; |
} |
return error::kNoError; |
} |
@@ -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,122 @@ bool GLES2DecoderImpl::ClearLevel( |
return true; |
} |
+namespace { |
+ |
+const int kS3TCBlockWidth = 4; |
+const int kS3TCBlockHeight = 4; |
+const int kS3TCDXT1BlockSize = 8; |
+const int kS3TCDXT3AndDXT5BlockSize = 16; |
+ |
+bool IsValidDXTSize(GLint level, GLsizei size) { |
+ return (level && size == 1) || |
+ (level && size == 2) || !(size % kS3TCBlockWidth); |
+} |
+ |
+} // anonymous namespace. |
+ |
+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: |
+ case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: { |
+ int num_blocks_across = |
+ (width + kS3TCBlockWidth - 1) / kS3TCBlockWidth; |
+ int num_blocks_down = |
+ (height + kS3TCBlockHeight - 1) / kS3TCBlockHeight; |
+ int num_blocks = num_blocks_across * num_blocks_down; |
+ bytes_required = num_blocks * kS3TCDXT1BlockSize; |
+ break; |
+ } |
+ case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: |
+ case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: { |
+ int num_blocks_across = |
+ (width + kS3TCBlockWidth - 1) / kS3TCBlockWidth; |
+ int num_blocks_down = |
+ (height + kS3TCBlockHeight - 1) / kS3TCBlockHeight; |
+ int num_blocks = num_blocks_across * num_blocks_down; |
+ bytes_required = num_blocks * kS3TCDXT3AndDXT5BlockSize; |
+ 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: { |
+ if (!IsValidDXTSize(level, width) || !IsValidDXTSize(level, height)) { |
+ 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: |
+ 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 +6917,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 +7062,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 +7091,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 +7100,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 +7121,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 +7147,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 +7291,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 +7299,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 +7361,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 +7384,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 +7427,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 +7463,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 +7472,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 +7483,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 +7508,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 +7521,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 +7556,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 +7587,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 +7598,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 +7641,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 +7690,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 +7733,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 +7776,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 +7786,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 +7871,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 +7962,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 +7996,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 +8010,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 +8039,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 +8271,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 +8288,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; |
} |
@@ -8181,16 +8340,16 @@ error::Error GLES2DecoderImpl::HandleGetProgramInfoCHROMIUM( |
error::ContextLostReason GLES2DecoderImpl::GetContextLostReason() { |
switch (reset_status_) { |
- case GL_NO_ERROR: |
- // TODO(kbr): improve the precision of the error code in this case. |
- // Consider delegating to context for error code if MakeCurrent fails. |
- return error::kUnknown; |
- case GL_GUILTY_CONTEXT_RESET_ARB: |
- return error::kGuilty; |
- case GL_INNOCENT_CONTEXT_RESET_ARB: |
- return error::kInnocent; |
- case GL_UNKNOWN_CONTEXT_RESET_ARB: |
- return error::kUnknown; |
+ case GL_NO_ERROR: |
+ // TODO(kbr): improve the precision of the error code in this case. |
+ // Consider delegating to context for error code if MakeCurrent fails. |
+ return error::kUnknown; |
+ case GL_GUILTY_CONTEXT_RESET_ARB: |
+ return error::kGuilty; |
+ case GL_INNOCENT_CONTEXT_RESET_ARB: |
+ return error::kInnocent; |
+ case GL_UNKNOWN_CONTEXT_RESET_ARB: |
+ return error::kUnknown; |
} |
NOTREACHED(); |
@@ -8259,7 +8418,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 +8426,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 +8451,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 +8459,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 +8482,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 +8504,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 +8521,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 +8550,7 @@ error::Error GLES2DecoderImpl::HandleCreateStreamTextureCHROMIUM( |
info->SetStreamTexture(true); |
} else { |
SetGLError(GL_OUT_OF_MEMORY, |
- "glCreateStreamTextureCHROMIUM: " |
+ "glCreateStreamTextureCHROMIUM", "" |
"failed to create platform texture."); |
} |
@@ -8413,7 +8573,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 +8597,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 +8617,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 +8642,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 +8672,7 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( |
if (err != kCGLNoError) { |
SetGLError( |
GL_INVALID_OPERATION, |
- "glTexImageIOSurface2DCHROMIUM: error in CGLTexImageIOSurface2D"); |
+ "glTexImageIOSurface2DCHROMIUM", "error in CGLTexImageIOSurface2D"); |
return; |
} |
@@ -8519,7 +8682,7 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( |
#else |
SetGLError(GL_INVALID_OPERATION, |
- "glTexImageIOSurface2DCHROMIUM: not supported."); |
+ "glTexImageIOSurface2DCHROMIUM", "not supported."); |
#endif |
} |
@@ -8575,20 +8738,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 +8759,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 +8767,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 +8898,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 +8913,7 @@ void GLES2DecoderImpl::DoTexStorage2DEXT( |
} |
if (info->IsImmutable()) { |
SetGLError(GL_INVALID_OPERATION, |
- "glTexStorage2DEXT: texture is immutable"); |
+ "glTexStorage2DEXT", "texture is immutable"); |
return; |
} |
CopyRealGLErrorsToWrapper(); |
@@ -8790,14 +8954,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 +8973,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 +8985,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 +8995,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; |
} |