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/feature_info.h" | 11 #include "gpu/command_buffer/service/feature_info.h" |
11 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | |
12 #include "gpu/command_buffer/service/memory_tracking.h" | 12 #include "gpu/command_buffer/service/memory_tracking.h" |
13 #include "ui/gl/gl_bindings.h" | 13 #include "ui/gl/gl_bindings.h" |
14 | 14 |
15 namespace gpu { | 15 namespace gpu { |
16 namespace gles2 { | 16 namespace gles2 { |
17 | 17 |
18 BufferManager::BufferManager( | 18 BufferManager::BufferManager( |
19 MemoryTracker* memory_tracker, | 19 MemoryTracker* memory_tracker, |
20 FeatureInfo* feature_info) | 20 FeatureInfo* feature_info) |
21 : memory_tracker_( | 21 : memory_tracker_( |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 memory_tracker_->TrackMemFree(buffer->size()); | 246 memory_tracker_->TrackMemFree(buffer->size()); |
247 bool is_client_side_array = IsUsageClientSideArray(usage); | 247 bool is_client_side_array = IsUsageClientSideArray(usage); |
248 bool shadow = buffer->target() == GL_ELEMENT_ARRAY_BUFFER || | 248 bool shadow = buffer->target() == GL_ELEMENT_ARRAY_BUFFER || |
249 allow_buffers_on_multiple_targets_ || | 249 allow_buffers_on_multiple_targets_ || |
250 is_client_side_array; | 250 is_client_side_array; |
251 buffer->SetInfo(size, usage, shadow, data, is_client_side_array); | 251 buffer->SetInfo(size, usage, shadow, data, is_client_side_array); |
252 memory_tracker_->TrackMemAlloc(buffer->size()); | 252 memory_tracker_->TrackMemAlloc(buffer->size()); |
253 } | 253 } |
254 | 254 |
255 void BufferManager::DoBufferData( | 255 void BufferManager::DoBufferData( |
256 GLES2Decoder* decoder, | 256 ErrorState* error_state, |
257 Buffer* buffer, | 257 Buffer* buffer, |
258 GLsizeiptr size, | 258 GLsizeiptr size, |
259 GLenum usage, | 259 GLenum usage, |
260 const GLvoid* data) { | 260 const GLvoid* data) { |
261 // Clear the buffer to 0 if no initial data was passed in. | 261 // Clear the buffer to 0 if no initial data was passed in. |
262 scoped_ptr<int8[]> zero; | 262 scoped_ptr<int8[]> zero; |
263 if (!data) { | 263 if (!data) { |
264 zero.reset(new int8[size]); | 264 zero.reset(new int8[size]); |
265 memset(zero.get(), 0, size); | 265 memset(zero.get(), 0, size); |
266 data = zero.get(); | 266 data = zero.get(); |
267 } | 267 } |
268 | 268 |
269 GLESDECODER_COPY_REAL_GL_ERRORS_TO_WRAPPER(decoder, "glBufferData"); | 269 ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(error_state, "glBufferData"); |
270 if (IsUsageClientSideArray(usage)) { | 270 if (IsUsageClientSideArray(usage)) { |
271 glBufferData(buffer->target(), 0, NULL, usage); | 271 glBufferData(buffer->target(), 0, NULL, usage); |
272 } else { | 272 } else { |
273 glBufferData(buffer->target(), size, data, usage); | 273 glBufferData(buffer->target(), size, data, usage); |
274 } | 274 } |
275 GLenum error = GLESDECODER_PEEK_GL_ERROR(decoder, "glBufferData"); | 275 GLenum error = ERRORSTATE_PEEK_GL_ERROR(error_state, "glBufferData"); |
276 if (error == GL_NO_ERROR) { | 276 if (error == GL_NO_ERROR) { |
277 SetInfo(buffer, size, usage, data); | 277 SetInfo(buffer, size, usage, data); |
278 } else { | 278 } else { |
279 SetInfo(buffer, 0, usage, NULL); | 279 SetInfo(buffer, 0, usage, NULL); |
280 } | 280 } |
281 } | 281 } |
282 | 282 |
283 void BufferManager::DoBufferSubData( | 283 void BufferManager::DoBufferSubData( |
284 GLES2Decoder* decoder, | 284 ErrorState* error_state, |
285 Buffer* buffer, | 285 Buffer* buffer, |
286 GLintptr offset, | 286 GLintptr offset, |
287 GLsizeiptr size, | 287 GLsizeiptr size, |
288 const GLvoid* data) { | 288 const GLvoid* data) { |
289 if (!buffer->SetRange(offset, size, data)) { | 289 if (!buffer->SetRange(offset, size, data)) { |
290 GLESDECODER_SET_GL_ERROR( | 290 ERRORSTATE_SET_GL_ERROR( |
291 decoder, GL_INVALID_VALUE, "glBufferSubData", "out of range"); | 291 error_state, GL_INVALID_VALUE, "glBufferSubData", "out of range"); |
292 return; | 292 return; |
293 } | 293 } |
294 | 294 |
295 if (!buffer->IsClientSideArray()) { | 295 if (!buffer->IsClientSideArray()) { |
296 glBufferSubData(buffer->target(), offset, size, data); | 296 glBufferSubData(buffer->target(), offset, size, data); |
297 } | 297 } |
298 } | 298 } |
299 | 299 |
300 bool BufferManager::SetTarget(Buffer* buffer, GLenum target) { | 300 bool BufferManager::SetTarget(Buffer* buffer, GLenum target) { |
301 // Check that we are not trying to bind it to a different target. | 301 // Check that we are not trying to bind it to a different target. |
302 if (buffer->target() != 0 && buffer->target() != target && | 302 if (buffer->target() != 0 && buffer->target() != target && |
303 !allow_buffers_on_multiple_targets_) { | 303 !allow_buffers_on_multiple_targets_) { |
304 return false; | 304 return false; |
305 } | 305 } |
306 if (buffer->target() == 0) { | 306 if (buffer->target() == 0) { |
307 buffer->set_target(target); | 307 buffer->set_target(target); |
308 } | 308 } |
309 return true; | 309 return true; |
310 } | 310 } |
311 | 311 |
312 } // namespace gles2 | 312 } // namespace gles2 |
313 } // namespace gpu | 313 } // namespace gpu |
314 | 314 |
315 | 315 |
OLD | NEW |