Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 10535073: Enforce compressed texture restrictions (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/common_decoder.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(), &copyY, &copyHeight);
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, &current_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;
}
« no previous file with comments | « gpu/command_buffer/service/common_decoder.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698