Index: gpu/command_buffer/client/gles2_implementation_impl_autogen.h |
diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h |
index d84c123351663f4991e46825515e245d1305524e..625c7473af16d2f27a780be27faca48f03fbbd15 100644 |
--- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h |
+++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h |
@@ -1747,73 +1747,10 @@ void GLES2Implementation::ShaderSource(GLuint shader, |
SetGLError(GL_INVALID_VALUE, "glShaderSource", "count < 0"); |
return; |
} |
- // Compute the total size. |
- base::CheckedNumeric<size_t> total_size = count; |
- total_size += 1; |
- total_size *= sizeof(GLint); |
- if (!total_size.IsValid()) { |
- SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); |
- return; |
- } |
- size_t header_size = total_size.ValueOrDefault(0); |
- std::vector<GLint> header(count + 1); |
- header[0] = static_cast<GLint>(count); |
- for (GLsizei ii = 0; ii < count; ++ii) { |
- GLint len = 0; |
- if (str[ii]) { |
- len = (length && length[ii] >= 0) |
- ? length[ii] |
- : base::checked_cast<GLint>(strlen(str[ii])); |
- } |
- total_size += len; |
- total_size += 1; // NULL at the end of each char array. |
- if (!total_size.IsValid()) { |
- SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); |
- return; |
- } |
- header[ii + 1] = len; |
- } |
- // Pack data into a bucket on the service. |
- helper_->SetBucketSize(kResultBucketId, total_size.ValueOrDefault(0)); |
- size_t offset = 0; |
- for (GLsizei ii = 0; ii <= count; ++ii) { |
- const char* src = |
- (ii == 0) ? reinterpret_cast<const char*>(&header[0]) : str[ii - 1]; |
- base::CheckedNumeric<size_t> checked_size = |
- (ii == 0) ? header_size : static_cast<size_t>(header[ii]); |
- if (ii > 0) { |
- checked_size += 1; // NULL in the end. |
- } |
- if (!checked_size.IsValid()) { |
- SetGLError(GL_INVALID_VALUE, "glShaderSource", "overflow"); |
- return; |
- } |
- size_t size = checked_size.ValueOrDefault(0); |
- while (size) { |
- ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_); |
- if (!buffer.valid() || buffer.size() == 0) { |
- SetGLError(GL_OUT_OF_MEMORY, "glShaderSource", "too large"); |
- return; |
- } |
- size_t copy_size = buffer.size(); |
- if (ii > 0 && buffer.size() == size) |
- --copy_size; |
- if (copy_size) |
- memcpy(buffer.address(), src, copy_size); |
- if (copy_size < buffer.size()) { |
- // Append NULL in the end. |
- DCHECK(copy_size + 1 == buffer.size()); |
- char* str = reinterpret_cast<char*>(buffer.address()); |
- str[copy_size] = 0; |
- } |
- helper_->SetBucketData(kResultBucketId, offset, buffer.size(), |
- buffer.shm_id(), buffer.offset()); |
- offset += buffer.size(); |
- src += buffer.size(); |
- size -= buffer.size(); |
- } |
+ |
+ if (!PackStringsToBucket(count, str, length, "glShaderSource")) { |
+ return; |
} |
- DCHECK_EQ(total_size.ValueOrDefault(0), offset); |
helper_->ShaderSourceBucket(shader, kResultBucketId); |
helper_->SetBucketSize(kResultBucketId, 0); |
CheckGLError(); |
@@ -1990,72 +1927,11 @@ void GLES2Implementation::TransformFeedbackVaryings(GLuint program, |
SetGLError(GL_INVALID_VALUE, "glTransformFeedbackVaryings", "count < 0"); |
return; |
} |
- // Compute the total size. |
- base::CheckedNumeric<size_t> total_size = count; |
- total_size += 1; |
- total_size *= sizeof(GLint); |
- if (!total_size.IsValid()) { |
- SetGLError(GL_INVALID_VALUE, "glTransformFeedbackVaryings", "overflow"); |
- return; |
- } |
- size_t header_size = total_size.ValueOrDefault(0); |
- std::vector<GLint> header(count + 1); |
- header[0] = static_cast<GLint>(count); |
- for (GLsizei ii = 0; ii < count; ++ii) { |
- GLint len = 0; |
- if (varyings[ii]) { |
- len = static_cast<GLint>(strlen(varyings[ii])); |
- } |
- total_size += len; |
- total_size += 1; // NULL at the end of each char array. |
- if (!total_size.IsValid()) { |
- SetGLError(GL_INVALID_VALUE, "glTransformFeedbackVaryings", "overflow"); |
- return; |
- } |
- header[ii + 1] = len; |
- } |
- // Pack data into a bucket on the service. |
- helper_->SetBucketSize(kResultBucketId, total_size.ValueOrDefault(0)); |
- size_t offset = 0; |
- for (GLsizei ii = 0; ii <= count; ++ii) { |
- const char* src = (ii == 0) ? reinterpret_cast<const char*>(&header[0]) |
- : varyings[ii - 1]; |
- base::CheckedNumeric<size_t> checked_size = |
- (ii == 0) ? header_size : static_cast<size_t>(header[ii]); |
- if (ii > 0) { |
- checked_size += 1; // NULL in the end. |
- } |
- if (!checked_size.IsValid()) { |
- SetGLError(GL_INVALID_VALUE, "glTransformFeedbackVaryings", "overflow"); |
- return; |
- } |
- size_t size = checked_size.ValueOrDefault(0); |
- while (size) { |
- ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_); |
- if (!buffer.valid() || buffer.size() == 0) { |
- SetGLError(GL_OUT_OF_MEMORY, "glTransformFeedbackVaryings", |
- "too large"); |
- return; |
- } |
- size_t copy_size = buffer.size(); |
- if (ii > 0 && buffer.size() == size) |
- --copy_size; |
- if (copy_size) |
- memcpy(buffer.address(), src, copy_size); |
- if (copy_size < buffer.size()) { |
- // Append NULL in the end. |
- DCHECK(copy_size + 1 == buffer.size()); |
- char* str = reinterpret_cast<char*>(buffer.address()); |
- str[copy_size] = 0; |
- } |
- helper_->SetBucketData(kResultBucketId, offset, buffer.size(), |
- buffer.shm_id(), buffer.offset()); |
- offset += buffer.size(); |
- src += buffer.size(); |
- size -= buffer.size(); |
- } |
+ |
+ if (!PackStringsToBucket(count, varyings, NULL, |
+ "glTransformFeedbackVaryings")) { |
+ return; |
} |
- DCHECK_EQ(total_size.ValueOrDefault(0), offset); |
helper_->TransformFeedbackVaryingsBucket(program, kResultBucketId, |
buffermode); |
helper_->SetBucketSize(kResultBucketId, 0); |