| 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 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 bool BufferManager::RequestBuffersAccess( | 824 bool BufferManager::RequestBuffersAccess( |
| 829 ErrorState* error_state, | 825 ErrorState* error_state, |
| 830 const IndexedBufferBindingHost* bindings, | 826 const IndexedBufferBindingHost* bindings, |
| 831 const std::vector<GLsizeiptr>& variable_sizes, | 827 const std::vector<GLsizeiptr>& variable_sizes, |
| 832 GLsizei count, | 828 GLsizei count, |
| 833 const char* func_name, | 829 const char* func_name, |
| 834 const char* message_tag) { | 830 const char* message_tag) { |
| 835 DCHECK(error_state); | 831 DCHECK(error_state); |
| 836 DCHECK(bindings); | 832 DCHECK(bindings); |
| 837 for (size_t ii = 0; ii < variable_sizes.size(); ++ii) { | 833 for (size_t ii = 0; ii < variable_sizes.size(); ++ii) { |
| 834 if (variable_sizes[ii] == 0) |
| 835 continue; |
| 838 Buffer* buffer = bindings->GetBufferBinding(ii); | 836 Buffer* buffer = bindings->GetBufferBinding(ii); |
| 839 if (!buffer) { | 837 if (!buffer) { |
| 840 std::string msg = base::StringPrintf( | 838 std::string msg = base::StringPrintf( |
| 841 "%s : no buffer bound at index %zu", message_tag, ii); | 839 "%s : no buffer bound at index %zu", message_tag, ii); |
| 842 ERRORSTATE_SET_GL_ERROR( | 840 ERRORSTATE_SET_GL_ERROR( |
| 843 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); | 841 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); |
| 844 return false; | 842 return false; |
| 845 } | 843 } |
| 846 if (buffer->GetMappedRange()) { | 844 if (buffer->GetMappedRange()) { |
| 847 std::string msg = base::StringPrintf( | 845 std::string msg = base::StringPrintf( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 859 "%s : buffer or buffer range not large enough at index %zu", | 857 "%s : buffer or buffer range not large enough at index %zu", |
| 860 message_tag, ii); | 858 message_tag, ii); |
| 861 ERRORSTATE_SET_GL_ERROR( | 859 ERRORSTATE_SET_GL_ERROR( |
| 862 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); | 860 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); |
| 863 return false; | 861 return false; |
| 864 } | 862 } |
| 865 } | 863 } |
| 866 return true; | 864 return true; |
| 867 } | 865 } |
| 868 | 866 |
| 869 void BufferManager::IncreaseMappedBufferCount() { | |
| 870 DCHECK_GT(std::numeric_limits<uint32_t>::max(), mapped_buffer_count_); | |
| 871 mapped_buffer_count_++; | |
| 872 } | |
| 873 | |
| 874 void BufferManager::DecreaseMappedBufferCount() { | |
| 875 DCHECK_LT(0u, mapped_buffer_count_); | |
| 876 mapped_buffer_count_--; | |
| 877 } | |
| 878 | |
| 879 } // namespace gles2 | 867 } // namespace gles2 |
| 880 } // namespace gpu | 868 } // namespace gpu |
| OLD | NEW |