From 80ed8daba081b51706fa057b11b8d2b06b0c174f Mon Sep 17 00:00:00 2001 From: "bsalomon@google.com" Date: Thu, 6 Jun 2013 20:10:45 +0000 Subject: 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 --- gpu/command_buffer/service/buffer_manager.cc | 8 +++++++- gpu/command_buffer/service/buffer_manager.h | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'gpu/command_buffer') 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); -- cgit v1.1