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 a1947f4bc3c535c08b64694850718969337cb9f7..720d54e339e7877895f31dc4468acf6adb41c53f 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h |
@@ -86,10 +86,6 @@ error::Error GLES2DecoderImpl::HandleBindBufferRange( |
GLuint buffer = c.buffer; |
GLintptr offset = static_cast<GLintptr>(c.offset); |
GLsizeiptr size = static_cast<GLsizeiptr>(c.size); |
- if (size < 0) { |
- LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glBindBufferRange", "size < 0"); |
- return error::kNoError; |
- } |
if (!group_->GetBufferServiceId(buffer, &buffer)) { |
if (!group_->bind_generates_resource()) { |
LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glBindBufferRange", |
@@ -616,10 +612,6 @@ 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 (size < 0) { |
- LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyBufferSubData", "size < 0"); |
- return error::kNoError; |
- } |
glCopyBufferSubData(readtarget, writetarget, readoffset, writeoffset, size); |
return error::kNoError; |
} |
@@ -697,6 +689,32 @@ error::Error GLES2DecoderImpl::HandleCopyTexSubImage2D( |
return error::kNoError; |
} |
+error::Error GLES2DecoderImpl::HandleCopyTexSubImage3D( |
+ uint32_t immediate_data_size, |
+ const void* cmd_data) { |
+ if (!unsafe_es3_apis_enabled()) |
+ return error::kUnknownCommand; |
+ const gles2::cmds::CopyTexSubImage3D& c = |
+ *static_cast<const gles2::cmds::CopyTexSubImage3D*>(cmd_data); |
+ (void)c; |
+ error::Error error; |
+ error = WillAccessBoundFramebufferForRead(); |
+ if (error != error::kNoError) |
+ return error; |
+ GLenum target = static_cast<GLenum>(c.target); |
+ GLint level = static_cast<GLint>(c.level); |
+ GLint xoffset = static_cast<GLint>(c.xoffset); |
+ GLint yoffset = static_cast<GLint>(c.yoffset); |
+ GLint zoffset = static_cast<GLint>(c.zoffset); |
+ GLint x = static_cast<GLint>(c.x); |
+ GLint y = static_cast<GLint>(c.y); |
+ GLsizei width = static_cast<GLsizei>(c.width); |
+ GLsizei height = static_cast<GLsizei>(c.height); |
+ glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, |
+ height); |
+ return error::kNoError; |
+} |
+ |
error::Error GLES2DecoderImpl::HandleCreateProgram(uint32_t immediate_data_size, |
const void* cmd_data) { |
const gles2::cmds::CreateProgram& c = |
@@ -1526,11 +1544,6 @@ error::Error GLES2DecoderImpl::HandleGetInternalformativ( |
Result* result = GetSharedMemoryAs<Result*>( |
c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values)); |
GLint* params = result ? result->GetData() : NULL; |
- if (bufSize < 0) { |
- LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glGetInternalformativ", |
- "bufSize < 0"); |
- return error::kNoError; |
- } |
if (params == NULL) { |
return error::kOutOfBounds; |
} |
@@ -1978,16 +1991,6 @@ error::Error GLES2DecoderImpl::HandleInvalidateSubFramebufferImmediate( |
if (attachments == NULL) { |
return error::kOutOfBounds; |
} |
- if (width < 0) { |
- LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glInvalidateSubFramebuffer", |
- "width < 0"); |
- return error::kNoError; |
- } |
- if (height < 0) { |
- LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glInvalidateSubFramebuffer", |
- "height < 0"); |
- return error::kNoError; |
- } |
glInvalidateSubFramebuffer(target, count, attachments, x, y, width, height); |
return error::kNoError; |
} |
@@ -2799,23 +2802,65 @@ 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 (levels < 0) { |
- LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage3D", "levels < 0"); |
- return error::kNoError; |
+ glTexStorage3D(target, levels, internalFormat, width, height, depth); |
+ return error::kNoError; |
+} |
+ |
+error::Error GLES2DecoderImpl::HandleTransformFeedbackVaryingsBucket( |
+ uint32_t immediate_data_size, |
+ const void* cmd_data) { |
+ if (!unsafe_es3_apis_enabled()) |
+ return error::kUnknownCommand; |
+ const gles2::cmds::TransformFeedbackVaryingsBucket& c = |
+ *static_cast<const gles2::cmds::TransformFeedbackVaryingsBucket*>( |
+ cmd_data); |
+ (void)c; |
+ GLuint program = static_cast<GLuint>(c.program); |
+ |
+ const size_t kMinBucketSize = sizeof(GLint); |
+ // Each string has at least |length| in the header and a NUL character. |
+ const size_t kMinStringSize = sizeof(GLint) + 1; |
+ Bucket* bucket = GetBucket(c.varyings_bucket_id); |
+ if (!bucket) { |
+ return error::kInvalidArguments; |
} |
- if (width < 0) { |
- LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage3D", "width < 0"); |
- return error::kNoError; |
+ const size_t bucket_size = bucket->size(); |
+ if (bucket_size < kMinBucketSize) { |
+ return error::kInvalidArguments; |
} |
- if (height < 0) { |
- LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage3D", "height < 0"); |
- return error::kNoError; |
+ const char* bucket_data = bucket->GetDataAs<const char*>(0, bucket_size); |
+ const GLint* header = reinterpret_cast<const GLint*>(bucket_data); |
+ GLsizei count = static_cast<GLsizei>(header[0]); |
+ if (count < 0) { |
+ return error::kInvalidArguments; |
} |
- if (depth < 0) { |
- LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage3D", "depth < 0"); |
- return error::kNoError; |
+ const size_t max_count = (bucket_size - kMinBucketSize) / kMinStringSize; |
+ if (max_count < static_cast<size_t>(count)) { |
+ return error::kInvalidArguments; |
} |
- glTexStorage3D(target, levels, internalFormat, width, height, depth); |
+ const GLint* length = header + 1; |
+ scoped_ptr<const char* []> strs; |
+ if (count > 0) |
+ strs.reset(new const char* [count]); |
+ const char** varyings = strs.get(); |
+ base::CheckedNumeric<size_t> total_size = sizeof(GLint); |
+ total_size *= count + 1; // Header size. |
+ if (!total_size.IsValid()) |
+ return error::kInvalidArguments; |
+ for (GLsizei ii = 0; ii < count; ++ii) { |
+ varyings[ii] = bucket_data + total_size.ValueOrDefault(0); |
+ total_size += length[ii]; |
+ total_size += 1; // NUL char at the end of each char array. |
+ if (!total_size.IsValid() || total_size.ValueOrDefault(0) > bucket_size || |
+ varyings[ii][length[ii]] != 0) { |
+ return error::kInvalidArguments; |
+ } |
+ } |
+ if (total_size.ValueOrDefault(0) != bucket_size) { |
+ return error::kInvalidArguments; |
+ } |
+ GLenum buffermode = static_cast<GLenum>(c.buffermode); |
+ DoTransformFeedbackVaryings(program, count, varyings, buffermode); |
return error::kNoError; |
} |