summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbsalomon@google.com <bsalomon@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-10 14:01:24 +0000
committerbsalomon@google.com <bsalomon@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-10 14:01:24 +0000
commite2b98feb6166d4ee509d5cbb3cf25db226795d8b (patch)
tree12f552d3901ba786d6d5084824ed188bb67df232
parent7abad9b4d508731879292860ab73358d141b4b9b (diff)
downloadchromium_src-e2b98feb6166d4ee509d5cbb3cf25db226795d8b.zip
chromium_src-e2b98feb6166d4ee509d5cbb3cf25db226795d8b.tar.gz
chromium_src-e2b98feb6166d4ee509d5cbb3cf25db226795d8b.tar.bz2
Merge 204571 "Add workaround for Mali-400 zero-sized buffer bug."
> Add workaround for Mali-400 zero-sized buffer bug. > > BUG=231082 > R=apatrick@chromium.org, gman@chromium.org > > Review URL: https://codereview.chromium.org/16043008 TBR=bsalomon@google.com Review URL: https://codereview.chromium.org/16739003 git-svn-id: svn://svn.chromium.org/chrome/branches/1500/src@205207 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--gpu/command_buffer/service/buffer_manager.cc8
-rw-r--r--gpu/command_buffer/service/buffer_manager.h6
2 files changed, 12 insertions, 2 deletions
diff --git a/gpu/command_buffer/service/buffer_manager.cc b/gpu/command_buffer/service/buffer_manager.cc
index 298b78b..093de20 100644
--- a/gpu/command_buffer/service/buffer_manager.cc
+++ b/gpu/command_buffer/service/buffer_manager.cc
@@ -240,6 +240,11 @@ bool BufferManager::IsUsageClientSideArray(GLenum usage) {
return usage == GL_STREAM_DRAW && use_client_side_arrays_for_stream_buffers_;
}
+bool BufferManager::UseNonZeroSizeForClientSideArrayBuffer() {
+ return feature_info_ && feature_info_->workarounds(
+ ).use_non_zero_size_for_client_side_stream_buffers;
+}
+
void BufferManager::SetInfo(
Buffer* buffer, GLsizeiptr size, GLenum usage, const GLvoid* data) {
DCHECK(buffer);
@@ -268,7 +273,8 @@ void BufferManager::DoBufferData(
ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(error_state, "glBufferData");
if (IsUsageClientSideArray(usage)) {
- glBufferData(buffer->target(), 0, NULL, usage);
+ GLsizei empty_size = UseNonZeroSizeForClientSideArrayBuffer() ? 1 : 0;
+ glBufferData(buffer->target(), empty_size, NULL, usage);
} else {
glBufferData(buffer->target(), size, data, usage);
}
diff --git a/gpu/command_buffer/service/buffer_manager.h b/gpu/command_buffer/service/buffer_manager.h
index 7ccb3f0..2e54eaeb 100644
--- a/gpu/command_buffer/service/buffer_manager.h
+++ b/gpu/command_buffer/service/buffer_manager.h
@@ -219,9 +219,13 @@ class GPU_EXPORT BufferManager {
return memory_tracker_->GetMemRepresented();
}
- // Tell's for a given usage if this would be a client side array.
+ // Tells for a given usage if this would be a client side array.
bool IsUsageClientSideArray(GLenum usage);
+ // Tells whether a buffer that is emulated using client-side arrays should be
+ // set to a non-zero size.
+ bool UseNonZeroSizeForClientSideArrayBuffer();
+
private:
friend class Buffer;
void StartTracking(Buffer* buffer);