OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |