| 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 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 max_buffer_size_(kDefaultMaxBufferSize), | 40 max_buffer_size_(kDefaultMaxBufferSize), |
| 41 allow_buffers_on_multiple_targets_(false), | 41 allow_buffers_on_multiple_targets_(false), |
| 42 allow_fixed_attribs_(false), | 42 allow_fixed_attribs_(false), |
| 43 buffer_count_(0), | 43 buffer_count_(0), |
| 44 primitive_restart_fixed_index_(0), | 44 primitive_restart_fixed_index_(0), |
| 45 lost_context_(false), | 45 lost_context_(false), |
| 46 use_client_side_arrays_for_stream_buffers_( | 46 use_client_side_arrays_for_stream_buffers_( |
| 47 feature_info | 47 feature_info |
| 48 ? feature_info->workarounds() | 48 ? feature_info->workarounds() |
| 49 .use_client_side_arrays_for_stream_buffers | 49 .use_client_side_arrays_for_stream_buffers |
| 50 : 0), | 50 : 0) { |
| 51 mapped_buffer_count_(0) { | |
| 52 // When created from InProcessCommandBuffer, we won't have a |memory_tracker_| | 51 // When created from InProcessCommandBuffer, we won't have a |memory_tracker_| |
| 53 // so don't register a dump provider. | 52 // so don't register a dump provider. |
| 54 if (memory_tracker_) { | 53 if (memory_tracker_) { |
| 55 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( | 54 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
| 56 this, "gpu::BufferManager", base::ThreadTaskRunnerHandle::Get()); | 55 this, "gpu::BufferManager", base::ThreadTaskRunnerHandle::Get()); |
| 57 } | 56 } |
| 58 } | 57 } |
| 59 | 58 |
| 60 BufferManager::~BufferManager() { | 59 BufferManager::~BufferManager() { |
| 61 DCHECK(buffers_.empty()); | 60 DCHECK(buffers_.empty()); |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 range_set_.insert(std::make_pair(range, max_v)); | 331 range_set_.insert(std::make_pair(range, max_v)); |
| 333 *max_value = max_v; | 332 *max_value = max_v; |
| 334 return true; | 333 return true; |
| 335 } | 334 } |
| 336 | 335 |
| 337 void Buffer::SetMappedRange(GLintptr offset, GLsizeiptr size, GLenum access, | 336 void Buffer::SetMappedRange(GLintptr offset, GLsizeiptr size, GLenum access, |
| 338 void* pointer, scoped_refptr<gpu::Buffer> shm, | 337 void* pointer, scoped_refptr<gpu::Buffer> shm, |
| 339 unsigned int shm_offset) { | 338 unsigned int shm_offset) { |
| 340 mapped_range_.reset( | 339 mapped_range_.reset( |
| 341 new MappedRange(offset, size, access, pointer, shm, shm_offset)); | 340 new MappedRange(offset, size, access, pointer, shm, shm_offset)); |
| 342 manager_->IncreaseMappedBufferCount(); | |
| 343 } | 341 } |
| 344 | 342 |
| 345 void Buffer::RemoveMappedRange() { | 343 void Buffer::RemoveMappedRange() { |
| 346 if (mapped_range_.get()) | |
| 347 manager_->DecreaseMappedBufferCount(); | |
| 348 mapped_range_.reset(nullptr); | 344 mapped_range_.reset(nullptr); |
| 349 } | 345 } |
| 350 | 346 |
| 351 bool BufferManager::GetClientId(GLuint service_id, GLuint* client_id) const { | 347 bool BufferManager::GetClientId(GLuint service_id, GLuint* client_id) const { |
| 352 // This doesn't need to be fast. It's only used during slow queries. | 348 // This doesn't need to be fast. It's only used during slow queries. |
| 353 for (BufferMap::const_iterator it = buffers_.begin(); | 349 for (BufferMap::const_iterator it = buffers_.begin(); |
| 354 it != buffers_.end(); ++it) { | 350 it != buffers_.end(); ++it) { |
| 355 if (it->second->service_id() == service_id) { | 351 if (it->second->service_id() == service_id) { |
| 356 *client_id = it->first; | 352 *client_id = it->first; |
| 357 return true; | 353 return true; |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 813 bool BufferManager::RequestBuffersAccess( | 809 bool BufferManager::RequestBuffersAccess( |
| 814 ErrorState* error_state, | 810 ErrorState* error_state, |
| 815 const IndexedBufferBindingHost* bindings, | 811 const IndexedBufferBindingHost* bindings, |
| 816 const std::vector<GLsizeiptr>& variable_sizes, | 812 const std::vector<GLsizeiptr>& variable_sizes, |
| 817 GLsizei count, | 813 GLsizei count, |
| 818 const char* func_name, | 814 const char* func_name, |
| 819 const char* message_tag) { | 815 const char* message_tag) { |
| 820 DCHECK(error_state); | 816 DCHECK(error_state); |
| 821 DCHECK(bindings); | 817 DCHECK(bindings); |
| 822 for (size_t ii = 0; ii < variable_sizes.size(); ++ii) { | 818 for (size_t ii = 0; ii < variable_sizes.size(); ++ii) { |
| 819 if (variable_sizes[ii] == 0) |
| 820 continue; |
| 823 Buffer* buffer = bindings->GetBufferBinding(ii); | 821 Buffer* buffer = bindings->GetBufferBinding(ii); |
| 824 if (!buffer) { | 822 if (!buffer) { |
| 825 std::string msg = base::StringPrintf( | 823 std::string msg = base::StringPrintf( |
| 826 "%s : no buffer bound at index %zu", message_tag, ii); | 824 "%s : no buffer bound at index %zu", message_tag, ii); |
| 827 ERRORSTATE_SET_GL_ERROR( | 825 ERRORSTATE_SET_GL_ERROR( |
| 828 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); | 826 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); |
| 829 return false; | 827 return false; |
| 830 } | 828 } |
| 831 if (buffer->GetMappedRange()) { | 829 if (buffer->GetMappedRange()) { |
| 832 std::string msg = base::StringPrintf( | 830 std::string msg = base::StringPrintf( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 844 "%s : buffer or buffer range not large enough at index %zu", | 842 "%s : buffer or buffer range not large enough at index %zu", |
| 845 message_tag, ii); | 843 message_tag, ii); |
| 846 ERRORSTATE_SET_GL_ERROR( | 844 ERRORSTATE_SET_GL_ERROR( |
| 847 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); | 845 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); |
| 848 return false; | 846 return false; |
| 849 } | 847 } |
| 850 } | 848 } |
| 851 return true; | 849 return true; |
| 852 } | 850 } |
| 853 | 851 |
| 854 void BufferManager::IncreaseMappedBufferCount() { | |
| 855 DCHECK_GT(std::numeric_limits<uint32_t>::max(), mapped_buffer_count_); | |
| 856 mapped_buffer_count_++; | |
| 857 } | |
| 858 | |
| 859 void BufferManager::DecreaseMappedBufferCount() { | |
| 860 DCHECK_LT(0u, mapped_buffer_count_); | |
| 861 mapped_buffer_count_--; | |
| 862 } | |
| 863 | |
| 864 } // namespace gles2 | 852 } // namespace gles2 |
| 865 } // namespace gpu | 853 } // namespace gpu |
| OLD | NEW |