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

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder_autogen.h

Issue 1949303003: Improve indexed gl state related GL commands. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@tex
Patch Set: fix a DCHECK failure Created 4 years, 7 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
Index: gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index 0dbc41a6c26d3edd06ff29c89a6af3cbd42172b1..5a4798a21b2d3810d68a78dbef07307172d95c9b 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -59,6 +59,10 @@ error::Error GLES2DecoderImpl::HandleBindBufferBase(
GLenum target = static_cast<GLenum>(c.target);
GLuint index = static_cast<GLuint>(c.index);
GLuint buffer = c.buffer;
+ if (!validators_->indexed_buffer_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindBufferBase", target, "target");
+ return error::kNoError;
+ }
DoBindBufferBase(target, index, buffer);
return error::kNoError;
}
@@ -76,6 +80,10 @@ error::Error GLES2DecoderImpl::HandleBindBufferRange(
GLuint buffer = c.buffer;
GLintptr offset = static_cast<GLintptr>(c.offset);
GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
+ if (!validators_->indexed_buffer_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindBufferRange", target, "target");
+ return error::kNoError;
+ }
DoBindBufferRange(target, index, buffer, offset, size);
return error::kNoError;
}
@@ -150,6 +158,11 @@ error::Error GLES2DecoderImpl::HandleBindTransformFeedback(
(void)c;
GLenum target = static_cast<GLenum>(c.target);
GLuint transformfeedback = c.transformfeedback;
+ if (!validators_->transform_feedback_bind_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTransformFeedback", target,
+ "target");
+ return error::kNoError;
+ }
DoBindTransformFeedback(target, transformfeedback);
return error::kNoError;
}
@@ -360,6 +373,10 @@ error::Error GLES2DecoderImpl::HandleClearBufferfi(uint32_t immediate_data_size,
GLint drawbuffers = static_cast<GLint>(c.drawbuffers);
GLfloat depth = static_cast<GLfloat>(c.depth);
GLint stencil = static_cast<GLint>(c.stencil);
+ if (!validators_->bufferfi.IsValid(buffer)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glClearBufferfi", buffer, "buffer");
+ return error::kNoError;
+ }
DoClearBufferfi(buffer, drawbuffers, depth, stencil);
return error::kNoError;
}
@@ -383,6 +400,10 @@ error::Error GLES2DecoderImpl::HandleClearBufferfvImmediate(
}
const GLfloat* value =
GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
+ if (!validators_->bufferfv.IsValid(buffer)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glClearBufferfv", buffer, "buffer");
+ return error::kNoError;
+ }
if (value == NULL) {
return error::kOutOfBounds;
}
@@ -409,6 +430,10 @@ error::Error GLES2DecoderImpl::HandleClearBufferivImmediate(
}
const GLint* value =
GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
+ if (!validators_->bufferiv.IsValid(buffer)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glClearBufferiv", buffer, "buffer");
+ return error::kNoError;
+ }
if (value == NULL) {
return error::kOutOfBounds;
}
@@ -435,6 +460,10 @@ error::Error GLES2DecoderImpl::HandleClearBufferuivImmediate(
}
const GLuint* value =
GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size);
+ if (!validators_->bufferuiv.IsValid(buffer)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glClearBufferuiv", buffer, "buffer");
+ return error::kNoError;
+ }
if (value == NULL) {
return error::kOutOfBounds;
}
@@ -589,6 +618,16 @@ error::Error GLES2DecoderImpl::HandleCompressedTexSubImage3D(
uint32_t data_size = imageSize;
const void* data = GetSharedMemoryAs<const void*>(
c.data_shm_id, c.data_shm_offset, data_size);
+ if (!validators_->texture_3_d_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glCompressedTexSubImage3D", target,
+ "target");
+ return error::kNoError;
+ }
+ if (!validators_->compressed_texture_format.IsValid(format)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glCompressedTexSubImage3D", format,
+ "format");
+ return error::kNoError;
+ }
if (data == NULL) {
return error::kOutOfBounds;
}
@@ -610,6 +649,16 @@ error::Error GLES2DecoderImpl::HandleCopyBufferSubData(
GLintptr readoffset = static_cast<GLintptr>(c.readoffset);
GLintptr writeoffset = static_cast<GLintptr>(c.writeoffset);
GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
+ if (!validators_->buffer_target.IsValid(readtarget)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyBufferSubData", readtarget,
+ "readtarget");
+ return error::kNoError;
+ }
+ if (!validators_->buffer_target.IsValid(writetarget)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyBufferSubData", writetarget,
+ "writetarget");
+ return error::kNoError;
+ }
glCopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size);
return error::kNoError;
}
@@ -708,6 +757,10 @@ error::Error GLES2DecoderImpl::HandleCopyTexSubImage3D(
GLint y = static_cast<GLint>(c.y);
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
+ if (!validators_->texture_3_d_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexSubImage3D", target, "target");
+ return error::kNoError;
+ }
glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width,
height);
return error::kNoError;
@@ -1127,6 +1180,16 @@ error::Error GLES2DecoderImpl::HandleFramebufferTextureLayer(
GLuint texture = c.texture;
GLint level = static_cast<GLint>(c.level);
GLint layer = static_cast<GLint>(c.layer);
+ if (!validators_->frame_buffer_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTextureLayer", target,
+ "target");
+ return error::kNoError;
+ }
+ if (!validators_->attachment.IsValid(attachment)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTextureLayer", attachment,
+ "attachment");
+ return error::kNoError;
+ }
DoFramebufferTextureLayer(target, attachment, texture, level, layer);
return error::kNoError;
}
@@ -1347,6 +1410,15 @@ error::Error GLES2DecoderImpl::HandleGetBufferParameteri64v(
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint64* params = result ? result->GetData() : NULL;
+ if (!validators_->buffer_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteri64v", target,
+ "target");
+ return error::kNoError;
+ }
+ if (!validators_->buffer_parameter_64.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteri64v", pname, "pname");
+ return error::kNoError;
+ }
if (params == NULL) {
return error::kOutOfBounds;
}
@@ -1499,6 +1571,10 @@ error::Error GLES2DecoderImpl::HandleGetInteger64v(uint32_t immediate_data_size,
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint64* params = result ? result->GetData() : NULL;
+ if (!validators_->g_l_state.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetInteger64v", pname, "pname");
+ return error::kNoError;
+ }
if (params == NULL) {
return error::kOutOfBounds;
}
@@ -1530,22 +1606,21 @@ error::Error GLES2DecoderImpl::HandleGetIntegeri_v(uint32_t immediate_data_size,
Result* result = GetSharedMemoryAs<Result*>(c.data_shm_id, c.data_shm_offset,
Result::ComputeSize(num_values));
GLint* data = result ? result->GetData() : NULL;
+ if (!validators_->indexed_g_l_state.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetIntegeri_v", pname, "pname");
+ return error::kNoError;
+ }
if (data == NULL) {
return error::kOutOfBounds;
}
- LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetIntegeri_v");
// Check that the client initialized the result.
if (result->size != 0) {
return error::kInvalidArguments;
}
- glGetIntegeri_v(pname, index, data);
- GLenum error = LOCAL_PEEK_GL_ERROR("GetIntegeri_v");
- if (error == GL_NO_ERROR) {
- result->SetNumResults(num_values);
- }
+ DoGetIntegeri_v(pname, index, data);
+ result->SetNumResults(num_values);
return error::kNoError;
}
-
error::Error GLES2DecoderImpl::HandleGetInteger64i_v(
uint32_t immediate_data_size,
const void* cmd_data) {
@@ -1562,22 +1637,21 @@ error::Error GLES2DecoderImpl::HandleGetInteger64i_v(
Result* result = GetSharedMemoryAs<Result*>(c.data_shm_id, c.data_shm_offset,
Result::ComputeSize(num_values));
GLint64* data = result ? result->GetData() : NULL;
+ if (!validators_->indexed_g_l_state.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetInteger64i_v", pname, "pname");
+ return error::kNoError;
+ }
if (data == NULL) {
return error::kOutOfBounds;
}
- LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("GetInteger64i_v");
// Check that the client initialized the result.
if (result->size != 0) {
return error::kInvalidArguments;
}
- glGetInteger64i_v(pname, index, data);
- GLenum error = LOCAL_PEEK_GL_ERROR("GetInteger64i_v");
- if (error == GL_NO_ERROR) {
- result->SetNumResults(num_values);
- }
+ DoGetInteger64i_v(pname, index, data);
+ result->SetNumResults(num_values);
return error::kNoError;
}
-
error::Error GLES2DecoderImpl::HandleGetIntegerv(uint32_t immediate_data_size,
const void* cmd_data) {
const gles2::cmds::GetIntegerv& c =
@@ -1699,6 +1773,10 @@ error::Error GLES2DecoderImpl::HandleGetSamplerParameterfv(
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLfloat* params = result ? result->GetData() : NULL;
+ if (!validators_->sampler_parameter.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetSamplerParameterfv", pname, "pname");
+ return error::kNoError;
+ }
if (params == NULL) {
return error::kOutOfBounds;
}
@@ -1731,6 +1809,10 @@ error::Error GLES2DecoderImpl::HandleGetSamplerParameteriv(
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
+ if (!validators_->sampler_parameter.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetSamplerParameteriv", pname, "pname");
+ return error::kNoError;
+ }
if (params == NULL) {
return error::kOutOfBounds;
}
@@ -1795,6 +1877,10 @@ error::Error GLES2DecoderImpl::HandleGetSynciv(uint32_t immediate_data_size,
Result* result = GetSharedMemoryAs<Result*>(
c.values_shm_id, c.values_shm_offset, Result::ComputeSize(num_values));
GLint* values = result ? result->GetData() : NULL;
+ if (!validators_->sync_parameter.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetSynciv", pname, "pname");
+ return error::kNoError;
+ }
if (values == NULL) {
return error::kOutOfBounds;
}
@@ -1976,6 +2062,10 @@ error::Error GLES2DecoderImpl::HandleGetVertexAttribIiv(
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLint* params = result ? result->GetData() : NULL;
+ if (!validators_->vertex_attribute.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribIiv", pname, "pname");
+ return error::kNoError;
+ }
if (params == NULL) {
return error::kOutOfBounds;
}
@@ -2008,6 +2098,10 @@ error::Error GLES2DecoderImpl::HandleGetVertexAttribIuiv(
Result* result = GetSharedMemoryAs<Result*>(
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
GLuint* params = result ? result->GetData() : NULL;
+ if (!validators_->vertex_attribute.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetVertexAttribIuiv", pname, "pname");
+ return error::kNoError;
+ }
if (params == NULL) {
return error::kOutOfBounds;
}
@@ -2082,6 +2176,11 @@ error::Error GLES2DecoderImpl::HandleInvalidateFramebufferImmediate(
}
const GLenum* attachments =
GetImmediateDataAs<const GLenum*>(c, data_size, immediate_data_size);
+ if (!validators_->frame_buffer_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glInvalidateFramebuffer", target,
+ "target");
+ return error::kNoError;
+ }
if (attachments == NULL) {
return error::kOutOfBounds;
}
@@ -2118,6 +2217,11 @@ error::Error GLES2DecoderImpl::HandleInvalidateSubFramebufferImmediate(
GLint y = static_cast<GLint>(c.y);
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
+ if (!validators_->frame_buffer_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glInvalidateSubFramebuffer", target,
+ "target");
+ return error::kNoError;
+ }
if (attachments == NULL) {
return error::kOutOfBounds;
}
@@ -2361,6 +2465,10 @@ error::Error GLES2DecoderImpl::HandleReadBuffer(uint32_t immediate_data_size,
*static_cast<const gles2::cmds::ReadBuffer*>(cmd_data);
(void)c;
GLenum src = static_cast<GLenum>(c.src);
+ if (!validators_->read_buffer.IsValid(src)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glReadBuffer", src, "src");
+ return error::kNoError;
+ }
DoReadBuffer(src);
return error::kNoError;
}
@@ -2441,6 +2549,10 @@ error::Error GLES2DecoderImpl::HandleSamplerParameterf(
GLuint sampler = c.sampler;
GLenum pname = static_cast<GLenum>(c.pname);
GLfloat param = static_cast<GLfloat>(c.param);
+ if (!validators_->sampler_parameter.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glSamplerParameterf", pname, "pname");
+ return error::kNoError;
+ }
DoSamplerParameterf(sampler, pname, param);
return error::kNoError;
}
@@ -2464,6 +2576,10 @@ error::Error GLES2DecoderImpl::HandleSamplerParameterfvImmediate(
}
const GLfloat* params =
GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size);
+ if (!validators_->sampler_parameter.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glSamplerParameterfv", pname, "pname");
+ return error::kNoError;
+ }
if (params == NULL) {
return error::kOutOfBounds;
}
@@ -2482,6 +2598,10 @@ error::Error GLES2DecoderImpl::HandleSamplerParameteri(
GLuint sampler = c.sampler;
GLenum pname = static_cast<GLenum>(c.pname);
GLint param = static_cast<GLint>(c.param);
+ if (!validators_->sampler_parameter.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glSamplerParameteri", pname, "pname");
+ return error::kNoError;
+ }
DoSamplerParameteri(sampler, pname, param);
return error::kNoError;
}
@@ -2505,6 +2625,10 @@ error::Error GLES2DecoderImpl::HandleSamplerParameterivImmediate(
}
const GLint* params =
GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size);
+ if (!validators_->sampler_parameter.IsValid(pname)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glSamplerParameteriv", pname, "pname");
+ return error::kNoError;
+ }
if (params == NULL) {
return error::kOutOfBounds;
}
@@ -2891,6 +3015,15 @@ error::Error GLES2DecoderImpl::HandleTexStorage3D(uint32_t immediate_data_size,
GLsizei width = static_cast<GLsizei>(c.width);
GLsizei height = static_cast<GLsizei>(c.height);
GLsizei depth = static_cast<GLsizei>(c.depth);
+ if (!validators_->texture_3_d_target.IsValid(target)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage3D", target, "target");
+ return error::kNoError;
+ }
+ if (!validators_->texture_internal_format_storage.IsValid(internalFormat)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage3D", internalFormat,
+ "internalFormat");
+ return error::kNoError;
+ }
DoTexStorage3D(target, levels, internalFormat, width, height, depth);
return error::kNoError;
}
@@ -2922,6 +3055,11 @@ error::Error GLES2DecoderImpl::HandleTransformFeedbackVaryingsBucket(
len.size() > 0 ? const_cast<const GLint*>(&len[0]) : NULL;
(void)length;
GLenum buffermode = static_cast<GLenum>(c.buffermode);
+ if (!validators_->buffer_mode.IsValid(buffermode)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glTransformFeedbackVaryings", buffermode,
+ "buffermode");
+ return error::kNoError;
+ }
DoTransformFeedbackVaryings(program, count, varyings, buffermode);
return error::kNoError;
}
@@ -4287,6 +4425,11 @@ error::Error GLES2DecoderImpl::HandleBeginTransformFeedback(
*static_cast<const gles2::cmds::BeginTransformFeedback*>(cmd_data);
(void)c;
GLenum primitivemode = static_cast<GLenum>(c.primitivemode);
+ if (!validators_->transform_feedback_primitive_mode.IsValid(primitivemode)) {
+ LOCAL_SET_GL_ERROR_INVALID_ENUM("glBeginTransformFeedback", primitivemode,
+ "primitivemode");
+ return error::kNoError;
+ }
DoBeginTransformFeedback(primitivemode);
return error::kNoError;
}
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698