diff options
author | bsalomon@google.com <bsalomon@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-06 20:10:45 +0000 |
---|---|---|
committer | bsalomon@google.com <bsalomon@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-06 20:10:45 +0000 |
commit | 80ed8daba081b51706fa057b11b8d2b06b0c174f (patch) | |
tree | b6985a78b309cc7c79a29dfb06ddecfb707e685f /gpu/command_buffer | |
parent | d302f93a5efeecdcd1cb08688f8c11de720d19b7 (diff) | |
download | chromium_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.cc | 8 | ||||
-rw-r--r-- | gpu/command_buffer/service/buffer_manager.h | 6 |
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); |