diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-27 18:16:12 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-27 18:16:12 +0000 |
commit | aea9451b78849d51b87ef8799d3f8cb63ea4cb5d (patch) | |
tree | 18867ce86340f79d7c8448cb78c3d6c3184b11e7 /gpu | |
parent | d59beab37dcbdf73dd07382af50095eaada55616 (diff) | |
download | chromium_src-aea9451b78849d51b87ef8799d3f8cb63ea4cb5d.zip chromium_src-aea9451b78849d51b87ef8799d3f8cb63ea4cb5d.tar.gz chromium_src-aea9451b78849d51b87ef8799d3f8cb63ea4cb5d.tar.bz2 |
DCHECK glDeleteXXX with id = 0 as this is a bug in client code.
This is only enabled for Chrome code as it's not standard OpenGL.
TEST=ran layout tests
BUG=85268
Review URL: http://codereview.chromium.org/7206031
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90612 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rwxr-xr-x | gpu/command_buffer/build_gles2_cmd_buffer.py | 51 | ||||
-rw-r--r-- | gpu/command_buffer/client/gles2_c_lib.cc | 31 | ||||
-rw-r--r-- | gpu/command_buffer/client/gles2_c_lib_autogen.h | 22 | ||||
-rw-r--r-- | gpu/command_buffer/client/gles2_implementation.cc | 7 | ||||
-rw-r--r-- | gpu/command_buffer/client/gles2_implementation.h | 34 | ||||
-rw-r--r-- | gpu/command_buffer/client/gles2_implementation_autogen.h | 28 |
6 files changed, 103 insertions, 70 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index 76aafeb..99cf0d3 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -2269,6 +2269,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { (func.return_type, func.original_name, func.MakeTypedOriginalArgString(""))) self.WriteClientGLCallLog(func, file) + func.WriteDestinationInitalizationValidation(file) for arg in func.GetOriginalArgs(): arg.WriteClientSideValidationCode(file, func) file.Write(" helper_->%s(%s);\n" % @@ -2691,6 +2692,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { file.Write("%s %s(%s) {\n" % (func.return_type, func.original_name, func.MakeTypedOriginalArgString(""))) + func.WriteDestinationInitalizationValidation(file) self.WriteClientGLCallLog(func, file) for arg in func.GetOriginalArgs(): arg.WriteClientSideValidationCode(file, func) @@ -2764,6 +2766,7 @@ class GENnHandler(TypeHandler): 'count_name': func.GetOriginalArgs()[0].name, } file.Write("%(return_type)s %(name)s(%(typed_args)s) {\n" % args) + func.WriteDestinationInitalizationValidation(file) self.WriteClientGLCallLog(func, file) for arg in func.GetOriginalArgs(): arg.WriteClientSideValidationCode(file, func) @@ -2994,6 +2997,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { file.Write("%s %s(%s) {\n" % (func.return_type, func.original_name, func.MakeTypedOriginalArgString(""))) + func.WriteDestinationInitalizationValidation(file) self.WriteClientGLCallLog(func, file) for arg in func.GetOriginalArgs(): arg.WriteClientSideValidationCode(file, func) @@ -3022,9 +3026,11 @@ class DeleteHandler(TypeHandler): file.Write("%s %s(%s) {\n" % (func.return_type, func.original_name, func.MakeTypedOriginalArgString(""))) + func.WriteDestinationInitalizationValidation(file) self.WriteClientGLCallLog(func, file) for arg in func.GetOriginalArgs(): arg.WriteClientSideValidationCode(file, func) + file.Write(" GPU_DCHECK(%s != 0);\n" % func.GetOriginalArgs()[-1].name) file.Write(" program_and_shader_id_handler_->FreeIds(1, &%s);\n" % func.GetOriginalArgs()[-1].name) file.Write(" helper_->%s(%s);\n" % @@ -3140,6 +3146,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { 'count_name': func.GetOriginalArgs()[0].name, } file.Write("%(return_type)s %(name)s(%(typed_args)s) {\n" % args) + func.WriteDestinationInitalizationValidation(file) self.WriteClientGLCallLog(func, file) file.Write(""" GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { @@ -3147,6 +3154,12 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { } }); """ % func.GetOriginalArgs()[1].name) + file.Write(""" GPU_CLIENT_DCHECK_CODE_BLOCK({ + for (GLsizei i = 0; i < n; ++i) { + GPU_DCHECK(%s[i] != 0); + } + }); +""" % func.GetOriginalArgs()[1].name) for arg in func.GetOriginalArgs(): arg.WriteClientSideValidationCode(file, func) code = """ %(resource_type)s_id_handler_->FreeIds(%(args)s); @@ -3314,6 +3327,7 @@ class GETnHandler(TypeHandler): file.Write("%s %s(%s) {\n" % (func.return_type, func.original_name, func.MakeTypedOriginalArgString(""))) + func.WriteDestinationInitalizationValidation(file) self.WriteClientGLCallLog(func, file) for arg in func.GetOriginalArgs(): arg.WriteClientSideValidationCode(file, func) @@ -3497,6 +3511,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { file.Write("%s %s(%s) {\n" % (func.return_type, func.original_name, func.MakeTypedOriginalArgString(""))) + func.WriteDestinationInitalizationValidation(file) self.WriteClientGLCallLog(func, file) last_arg_name = func.GetLastOriginalArg().name values_str = ' << ", " << '.join( @@ -3721,6 +3736,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { file.Write("%s %s(%s) {\n" % (func.return_type, func.original_name, func.MakeTypedOriginalArgString(""))) + func.WriteDestinationInitalizationValidation(file) self.WriteClientGLCallLog(func, file) last_arg_name = func.GetLastOriginalArg().name file.Write(""" GPU_CLIENT_LOG_CODE_BLOCK({ @@ -4106,6 +4122,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) { file.Write("%s %s(%s) {\n" % (func.return_type, func.original_name, func.MakeTypedOriginalArgString(""))) + func.WriteDestinationInitalizationValidation(file) self.WriteClientGLCallLog(func, file) file.Write(" typedef %s::Result Result;\n" % func.name) file.Write(" Result* result = GetResultAs<Result*>();\n") @@ -4142,8 +4159,8 @@ class STRnHandler(TypeHandler): def WriteGLES2ImplementationHeader(self, func, file): """Overrriden from TypeHandler.""" - code = """%(return_type)s %(func_name)s(%(args)s) { - GPU_CLIENT_LOG("[" << this << "] gl%(func_name)s" << "(" + code_1 = "%(return_type)s %(func_name)s(%(args)s) {\n" + code_2 = """ GPU_CLIENT_LOG("[" << this << "] gl%(func_name)s" << "(" << %(arg0)s << ", " << %(arg1)s << ", " << static_cast<void*>(%(arg2)s) << ", " @@ -4166,19 +4183,22 @@ class STRnHandler(TypeHandler): } """ args = func.GetOriginalArgs() - file.Write(code % { - 'return_type': func.return_type, - 'func_name': func.original_name, - 'args': func.MakeTypedOriginalArgString(""), - 'id_name': args[0].name, - 'bufsize_name': args[1].name, - 'length_name': args[2].name, - 'dest_name': args[3].name, - 'arg0': args[0].name, - 'arg1': args[1].name, - 'arg2': args[2].name, - 'arg3': args[3].name, - }) + str_args = { + 'return_type': func.return_type, + 'func_name': func.original_name, + 'args': func.MakeTypedOriginalArgString(""), + 'id_name': args[0].name, + 'bufsize_name': args[1].name, + 'length_name': args[2].name, + 'dest_name': args[3].name, + 'arg0': args[0].name, + 'arg1': args[1].name, + 'arg2': args[2].name, + 'arg3': args[3].name, + } + file.Write(code_1 % str_args) + func.WriteDestinationInitalizationValidation(file) + file.Write(code_2 % str_args) def WriteServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" @@ -5503,7 +5523,6 @@ class GLGenerator(object): file.Write("%s GLES2%s(%s) {\n" % (func.return_type, func.name, func.MakeTypedOriginalArgString(""))) - func.WriteDestinationInitalizationValidation(file) result_string = "return " if func.return_type == "void": result_string = "" diff --git a/gpu/command_buffer/client/gles2_c_lib.cc b/gpu/command_buffer/client/gles2_c_lib.cc index e8794a5..4e853c2 100644 --- a/gpu/command_buffer/client/gles2_c_lib.cc +++ b/gpu/command_buffer/client/gles2_c_lib.cc @@ -7,37 +7,6 @@ #include <assert.h> #include "../client/gles2_lib.h" -// Check that destination pointers point to initialized memory. -// When the context is lost, calling GL function has no effect so if destination -// pointers point to initialized memory it can often lead to crash bugs. eg. -// -// GLsizei len; -// glGetShaderSource(shader, max_size, &len, buffer); -// std::string src(buffer, buffer + len); // len can be uninitialized here!!! -// -// Because this check is not official GL this check happens only on Chrome code, -// not Pepper. -// -// If it was up to us we'd just always write to the destination but the OpenGL -// spec defines the behavior of OpenGL function, not us. :-( -#if defined(__native_client__) || defined(GLES2_CONFORMANCE_TESTS) - #define GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) - #define GL_CLIENT_DCHECK(v) -#elif defined(GPU_DCHECK) - #define GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) GPU_DCHECK(v) - #define GL_CLIENT_DCHECK(v) GPU_DCHECK(v) -#elif defined(DCHECK) - #define GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) DCHECK(v) - #define GL_CLIENT_DCHECK(v) DCHECK(v) -#else - #define GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) ASSERT(v) - #define GL_CLIENT_DCHECK(v) ASSERT(v) -#endif - -#define GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(type, ptr) \ - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(ptr && \ - (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1))); - extern "C" { // Include the auto-generated part of this file. We split this because it means // we can easily edit the non-auto generated parts right here in this file diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h index 996696d..091d565 100644 --- a/gpu/command_buffer/client/gles2_c_lib_autogen.h +++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h @@ -198,35 +198,26 @@ void GLES2GenTextures(GLsizei n, GLuint* textures) { void GLES2GetActiveAttrib( GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLsizei, length); - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, size); - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLenum, type); gles2::GetGLContext()->GetActiveAttrib( program, index, bufsize, length, size, type, name); } void GLES2GetActiveUniform( GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLsizei, length); - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, size); - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLenum, type); gles2::GetGLContext()->GetActiveUniform( program, index, bufsize, length, size, type, name); } void GLES2GetAttachedShaders( GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLsizei, count); gles2::GetGLContext()->GetAttachedShaders(program, maxcount, count, shaders); } GLint GLES2GetAttribLocation(GLuint program, const char* name) { return gles2::GetGLContext()->GetAttribLocation(program, name); } void GLES2GetBooleanv(GLenum pname, GLboolean* params) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLboolean, params); gles2::GetGLContext()->GetBooleanv(pname, params); } void GLES2GetBufferParameteriv(GLenum target, GLenum pname, GLint* params) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); gles2::GetGLContext()->GetBufferParameteriv(target, pname, params); } GLenum GLES2GetError() { @@ -237,47 +228,37 @@ void GLES2GetFloatv(GLenum pname, GLfloat* params) { } void GLES2GetFramebufferAttachmentParameteriv( GLenum target, GLenum attachment, GLenum pname, GLint* params) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); gles2::GetGLContext()->GetFramebufferAttachmentParameteriv( target, attachment, pname, params); } void GLES2GetIntegerv(GLenum pname, GLint* params) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); gles2::GetGLContext()->GetIntegerv(pname, params); } void GLES2GetProgramiv(GLuint program, GLenum pname, GLint* params) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); gles2::GetGLContext()->GetProgramiv(program, pname, params); } void GLES2GetProgramInfoLog( GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLsizei, length); gles2::GetGLContext()->GetProgramInfoLog(program, bufsize, length, infolog); } void GLES2GetRenderbufferParameteriv( GLenum target, GLenum pname, GLint* params) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); gles2::GetGLContext()->GetRenderbufferParameteriv(target, pname, params); } void GLES2GetShaderiv(GLuint shader, GLenum pname, GLint* params) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); gles2::GetGLContext()->GetShaderiv(shader, pname, params); } void GLES2GetShaderInfoLog( GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLsizei, length); gles2::GetGLContext()->GetShaderInfoLog(shader, bufsize, length, infolog); } void GLES2GetShaderPrecisionFormat( GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, range); - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, precision); gles2::GetGLContext()->GetShaderPrecisionFormat( shadertype, precisiontype, range, precision); } void GLES2GetShaderSource( GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLsizei, length); gles2::GetGLContext()->GetShaderSource(shader, bufsize, length, source); } const GLubyte* GLES2GetString(GLenum name) { @@ -287,14 +268,12 @@ void GLES2GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) { gles2::GetGLContext()->GetTexParameterfv(target, pname, params); } void GLES2GetTexParameteriv(GLenum target, GLenum pname, GLint* params) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); gles2::GetGLContext()->GetTexParameteriv(target, pname, params); } void GLES2GetUniformfv(GLuint program, GLint location, GLfloat* params) { gles2::GetGLContext()->GetUniformfv(program, location, params); } void GLES2GetUniformiv(GLuint program, GLint location, GLint* params) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); gles2::GetGLContext()->GetUniformiv(program, location, params); } GLint GLES2GetUniformLocation(GLuint program, const char* name) { @@ -304,7 +283,6 @@ void GLES2GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) { gles2::GetGLContext()->GetVertexAttribfv(index, pname, params); } void GLES2GetVertexAttribiv(GLuint index, GLenum pname, GLint* params) { - GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); gles2::GetGLContext()->GetVertexAttribiv(index, pname, params); } void GLES2GetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer) { diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc index ecc788d..a8f16f9 100644 --- a/gpu/command_buffer/client/gles2_implementation.cc +++ b/gpu/command_buffer/client/gles2_implementation.cc @@ -482,7 +482,7 @@ GLES2Implementation::GLES2Implementation( } #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) - GLint max_vertex_attribs; + GLint max_vertex_attribs = 0; GetIntegerv(GL_MAX_VERTEX_ATTRIBS, &max_vertex_attribs); buffer_id_handler_->MakeIds( @@ -1662,6 +1662,11 @@ void GLES2Implementation::DeleteBuffers(GLsizei n, const GLuint* buffers) { GPU_CLIENT_LOG(" " << i << ": " << buffers[i]); } }); + GPU_CLIENT_DCHECK_CODE_BLOCK({ + for (GLsizei i = 0; i < n; ++i) { + GPU_DCHECK(buffers[i] != 0); + } + }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteBuffers: n < 0"); return; diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h index 6a3aa75..87f7e20 100644 --- a/gpu/command_buffer/client/gles2_implementation.h +++ b/gpu/command_buffer/client/gles2_implementation.h @@ -23,17 +23,51 @@ // TODO(gman): Replace with macros that work with inline optmization. #define GPU_CLIENT_LOG(args) #define GPU_CLIENT_LOG_CODE_BLOCK(code) + #define GPU_CLIENT_DCHECK_CODE_BLOCK(code) #else #include "base/logging.h" #define GPU_CLIENT_LOG(args) DLOG_IF(INFO, debug_) << args; #define GPU_CLIENT_LOG_CODE_BLOCK(code) code + #define GPU_CLIENT_DCHECK_CODE_BLOCK(code) code #define GPU_CLIENT_DEBUG #endif #else #define GPU_CLIENT_LOG(args) #define GPU_CLIENT_LOG_CODE_BLOCK(code) + #define GPU_CLIENT_DCHECK_CODE_BLOCK(code) #endif +// Check that destination pointers point to initialized memory. +// When the context is lost, calling GL function has no effect so if destination +// pointers point to initialized memory it can often lead to crash bugs. eg. +// +// GLsizei len; +// glGetShaderSource(shader, max_size, &len, buffer); +// std::string src(buffer, buffer + len); // len can be uninitialized here!!! +// +// Because this check is not official GL this check happens only on Chrome code, +// not Pepper. +// +// If it was up to us we'd just always write to the destination but the OpenGL +// spec defines the behavior of OpenGL functions, not us. :-( +#if defined(__native_client__) || defined(GLES2_CONFORMANCE_TESTS) + #define GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) + #define GL_CLIENT_DCHECK(v) +#elif defined(GPU_DCHECK) + #define GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) GPU_DCHECK(v) + #define GL_CLIENT_DCHECK(v) GPU_DCHECK(v) +#elif defined(DCHECK) + #define GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) DCHECK(v) + #define GL_CLIENT_DCHECK(v) DCHECK(v) +#else + #define GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) ASSERT(v) + #define GL_CLIENT_DCHECK(v) ASSERT(v) +#endif + +#define GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(type, ptr) \ + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(ptr && \ + (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1))); + namespace gpu { class MappedMemoryManager; diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h index 0178d16..eb148a2 100644 --- a/gpu/command_buffer/client/gles2_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_autogen.h @@ -202,6 +202,11 @@ void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers) { GPU_CLIENT_LOG(" " << i << ": " << framebuffers[i]); } }); + GPU_CLIENT_DCHECK_CODE_BLOCK({ + for (GLsizei i = 0; i < n; ++i) { + GPU_DCHECK(framebuffers[i] != 0); + } + }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteFramebuffers: n < 0"); return; @@ -212,6 +217,7 @@ void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers) { void DeleteProgram(GLuint program) { GPU_CLIENT_LOG("[" << this << "] glDeleteProgram(" << program << ")"); + GPU_DCHECK(program != 0); program_and_shader_id_handler_->FreeIds(1, &program); helper_->DeleteProgram(program); } @@ -223,6 +229,11 @@ void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { GPU_CLIENT_LOG(" " << i << ": " << renderbuffers[i]); } }); + GPU_CLIENT_DCHECK_CODE_BLOCK({ + for (GLsizei i = 0; i < n; ++i) { + GPU_DCHECK(renderbuffers[i] != 0); + } + }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteRenderbuffers: n < 0"); return; @@ -233,6 +244,7 @@ void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { void DeleteShader(GLuint shader) { GPU_CLIENT_LOG("[" << this << "] glDeleteShader(" << shader << ")"); + GPU_DCHECK(shader != 0); program_and_shader_id_handler_->FreeIds(1, &shader); helper_->DeleteShader(shader); } @@ -244,6 +256,11 @@ void DeleteTextures(GLsizei n, const GLuint* textures) { GPU_CLIENT_LOG(" " << i << ": " << textures[i]); } }); + GPU_CLIENT_DCHECK_CODE_BLOCK({ + for (GLsizei i = 0; i < n; ++i) { + GPU_DCHECK(textures[i] != 0); + } + }); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glDeleteTextures: n < 0"); return; @@ -390,6 +407,7 @@ void GetAttachedShaders( GLint GetAttribLocation(GLuint program, const char* name); void GetBooleanv(GLenum pname, GLboolean* params) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLboolean, params); GPU_CLIENT_LOG("[" << this << "] glGetBooleanv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT typedef GetBooleanv::Result Result; Result* result = GetResultAs<Result*>(); @@ -405,6 +423,7 @@ void GetBooleanv(GLenum pname, GLboolean* params) { }); } void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << this << "] glGetBufferParameteriv(" << GLES2Util::GetStringBufferTarget(target) << ", " << GLES2Util::GetStringBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT typedef GetBufferParameteriv::Result Result; Result* result = GetResultAs<Result*>(); @@ -439,6 +458,7 @@ void GetFloatv(GLenum pname, GLfloat* params) { } void GetFramebufferAttachmentParameteriv( GLenum target, GLenum attachment, GLenum pname, GLint* params) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << this << "] glGetFramebufferAttachmentParameteriv(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringFrameBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT typedef GetFramebufferAttachmentParameteriv::Result Result; Result* result = GetResultAs<Result*>(); @@ -454,6 +474,7 @@ void GetFramebufferAttachmentParameteriv( }); } void GetIntegerv(GLenum pname, GLint* params) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << this << "] glGetIntegerv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT typedef GetIntegerv::Result Result; Result* result = GetResultAs<Result*>(); @@ -469,6 +490,7 @@ void GetIntegerv(GLenum pname, GLint* params) { }); } void GetProgramiv(GLuint program, GLenum pname, GLint* params) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << this << "] glGetProgramiv(" << program << ", " << GLES2Util::GetStringProgramParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT typedef GetProgramiv::Result Result; Result* result = GetResultAs<Result*>(); @@ -485,6 +507,7 @@ void GetProgramiv(GLuint program, GLenum pname, GLint* params) { } void GetProgramInfoLog( GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLsizei, length); GPU_CLIENT_LOG("[" << this << "] glGetProgramInfoLog" << "(" << program << ", " << bufsize << ", " @@ -507,6 +530,7 @@ void GetProgramInfoLog( } } void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << this << "] glGetRenderbufferParameteriv(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << GLES2Util::GetStringRenderBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT typedef GetRenderbufferParameteriv::Result Result; Result* result = GetResultAs<Result*>(); @@ -522,6 +546,7 @@ void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) { }); } void GetShaderiv(GLuint shader, GLenum pname, GLint* params) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << this << "] glGetShaderiv(" << shader << ", " << GLES2Util::GetStringShaderParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT typedef GetShaderiv::Result Result; Result* result = GetResultAs<Result*>(); @@ -538,6 +563,7 @@ void GetShaderiv(GLuint shader, GLenum pname, GLint* params) { } void GetShaderInfoLog( GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLsizei, length); GPU_CLIENT_LOG("[" << this << "] glGetShaderInfoLog" << "(" << shader << ", " << bufsize << ", " @@ -564,6 +590,7 @@ void GetShaderPrecisionFormat( void GetShaderSource( GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLsizei, length); GPU_CLIENT_LOG("[" << this << "] glGetShaderSource" << "(" << shader << ", " << bufsize << ", " @@ -603,6 +630,7 @@ void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) { }); } void GetTexParameteriv(GLenum target, GLenum pname, GLint* params) { + GL_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); GPU_CLIENT_LOG("[" << this << "] glGetTexParameteriv(" << GLES2Util::GetStringTextureTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT typedef GetTexParameteriv::Result Result; Result* result = GetResultAs<Result*>(); |