summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer
diff options
context:
space:
mode:
authorbsalomon@google.com <bsalomon@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-06 20:10:45 +0000
committerbsalomon@google.com <bsalomon@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-06 20:10:45 +0000
commit80ed8daba081b51706fa057b11b8d2b06b0c174f (patch)
treeb6985a78b309cc7c79a29dfb06ddecfb707e685f /gpu/command_buffer
parentd302f93a5efeecdcd1cb08688f8c11de720d19b7 (diff)
downloadchromium_src-80ed8daba081b51706fa057b11b8d2b06b0c174f.zip
chromium_src-80ed8daba081b51706fa057b11b8d2b06b0c174f.tar.gz
chromium_src-80ed8daba081b51706fa057b11b8d2b06b0c174f.tar.bz2
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 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204571 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer')
-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 ed4c1f1..4966237 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);