Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: gpu/command_buffer/service/buffer_manager.cc

Issue 16043008: Add workaround for Mali-400 zero-sized buffer bug. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gpu/command_buffer/service/buffer_manager.h ('k') | gpu/config/gpu_driver_bug_list_json.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/buffer_manager.h" 5 #include "gpu/command_buffer/service/buffer_manager.h"
6 #include <limits> 6 #include <limits>
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 9 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
10 #include "gpu/command_buffer/service/error_state.h" 10 #include "gpu/command_buffer/service/error_state.h"
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 return true; 233 return true;
234 } 234 }
235 } 235 }
236 return false; 236 return false;
237 } 237 }
238 238
239 bool BufferManager::IsUsageClientSideArray(GLenum usage) { 239 bool BufferManager::IsUsageClientSideArray(GLenum usage) {
240 return usage == GL_STREAM_DRAW && use_client_side_arrays_for_stream_buffers_; 240 return usage == GL_STREAM_DRAW && use_client_side_arrays_for_stream_buffers_;
241 } 241 }
242 242
243 bool BufferManager::UseNonZeroSizeForClientSideArrayBuffer() {
244 return feature_info_ && feature_info_->workarounds(
245 ).use_non_zero_size_for_client_side_stream_buffers;
246 }
247
243 void BufferManager::SetInfo( 248 void BufferManager::SetInfo(
244 Buffer* buffer, GLsizeiptr size, GLenum usage, const GLvoid* data) { 249 Buffer* buffer, GLsizeiptr size, GLenum usage, const GLvoid* data) {
245 DCHECK(buffer); 250 DCHECK(buffer);
246 memory_tracker_->TrackMemFree(buffer->size()); 251 memory_tracker_->TrackMemFree(buffer->size());
247 bool is_client_side_array = IsUsageClientSideArray(usage); 252 bool is_client_side_array = IsUsageClientSideArray(usage);
248 bool shadow = buffer->target() == GL_ELEMENT_ARRAY_BUFFER || 253 bool shadow = buffer->target() == GL_ELEMENT_ARRAY_BUFFER ||
249 allow_buffers_on_multiple_targets_ || 254 allow_buffers_on_multiple_targets_ ||
250 is_client_side_array; 255 is_client_side_array;
251 buffer->SetInfo(size, usage, shadow, data, is_client_side_array); 256 buffer->SetInfo(size, usage, shadow, data, is_client_side_array);
252 memory_tracker_->TrackMemAlloc(buffer->size()); 257 memory_tracker_->TrackMemAlloc(buffer->size());
253 } 258 }
254 259
255 void BufferManager::DoBufferData( 260 void BufferManager::DoBufferData(
256 ErrorState* error_state, 261 ErrorState* error_state,
257 Buffer* buffer, 262 Buffer* buffer,
258 GLsizeiptr size, 263 GLsizeiptr size,
259 GLenum usage, 264 GLenum usage,
260 const GLvoid* data) { 265 const GLvoid* data) {
261 // Clear the buffer to 0 if no initial data was passed in. 266 // Clear the buffer to 0 if no initial data was passed in.
262 scoped_ptr<int8[]> zero; 267 scoped_ptr<int8[]> zero;
263 if (!data) { 268 if (!data) {
264 zero.reset(new int8[size]); 269 zero.reset(new int8[size]);
265 memset(zero.get(), 0, size); 270 memset(zero.get(), 0, size);
266 data = zero.get(); 271 data = zero.get();
267 } 272 }
268 273
269 ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(error_state, "glBufferData"); 274 ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(error_state, "glBufferData");
270 if (IsUsageClientSideArray(usage)) { 275 if (IsUsageClientSideArray(usage)) {
271 glBufferData(buffer->target(), 0, NULL, usage); 276 GLsizei empty_size = UseNonZeroSizeForClientSideArrayBuffer() ? 1 : 0;
277 glBufferData(buffer->target(), empty_size, NULL, usage);
272 } else { 278 } else {
273 glBufferData(buffer->target(), size, data, usage); 279 glBufferData(buffer->target(), size, data, usage);
274 } 280 }
275 GLenum error = ERRORSTATE_PEEK_GL_ERROR(error_state, "glBufferData"); 281 GLenum error = ERRORSTATE_PEEK_GL_ERROR(error_state, "glBufferData");
276 if (error == GL_NO_ERROR) { 282 if (error == GL_NO_ERROR) {
277 SetInfo(buffer, size, usage, data); 283 SetInfo(buffer, size, usage, data);
278 } else { 284 } else {
279 SetInfo(buffer, 0, usage, NULL); 285 SetInfo(buffer, 0, usage, NULL);
280 } 286 }
281 } 287 }
(...skipping 24 matching lines...) Expand all
306 if (buffer->target() == 0) { 312 if (buffer->target() == 0) {
307 buffer->set_target(target); 313 buffer->set_target(target);
308 } 314 }
309 return true; 315 return true;
310 } 316 }
311 317
312 } // namespace gles2 318 } // namespace gles2
313 } // namespace gpu 319 } // namespace gpu
314 320
315 321
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/buffer_manager.h ('k') | gpu/config/gpu_driver_bug_list_json.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698