summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-27 18:16:12 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-27 18:16:12 +0000
commitaea9451b78849d51b87ef8799d3f8cb63ea4cb5d (patch)
tree18867ce86340f79d7c8448cb78c3d6c3184b11e7 /gpu
parentd59beab37dcbdf73dd07382af50095eaada55616 (diff)
downloadchromium_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-xgpu/command_buffer/build_gles2_cmd_buffer.py51
-rw-r--r--gpu/command_buffer/client/gles2_c_lib.cc31
-rw-r--r--gpu/command_buffer/client/gles2_c_lib_autogen.h22
-rw-r--r--gpu/command_buffer/client/gles2_implementation.cc7
-rw-r--r--gpu/command_buffer/client/gles2_implementation.h34
-rw-r--r--gpu/command_buffer/client/gles2_implementation_autogen.h28
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*>();