| 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 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 806 bool BufferManager::RequestBuffersAccess( | 802 bool BufferManager::RequestBuffersAccess( |
| 807 ErrorState* error_state, | 803 ErrorState* error_state, |
| 808 const IndexedBufferBindingHost* bindings, | 804 const IndexedBufferBindingHost* bindings, |
| 809 const std::vector<GLsizeiptr>& variable_sizes, | 805 const std::vector<GLsizeiptr>& variable_sizes, |
| 810 GLsizei count, | 806 GLsizei count, |
| 811 const char* func_name, | 807 const char* func_name, |
| 812 const char* message_tag) { | 808 const char* message_tag) { |
| 813 DCHECK(error_state); | 809 DCHECK(error_state); |
| 814 DCHECK(bindings); | 810 DCHECK(bindings); |
| 815 for (size_t ii = 0; ii < variable_sizes.size(); ++ii) { | 811 for (size_t ii = 0; ii < variable_sizes.size(); ++ii) { |
| 812 if (variable_sizes[ii] == 0) |
| 813 continue; |
| 816 Buffer* buffer = bindings->GetBufferBinding(ii); | 814 Buffer* buffer = bindings->GetBufferBinding(ii); |
| 817 if (!buffer) { | 815 if (!buffer) { |
| 818 std::string msg = base::StringPrintf( | 816 std::string msg = base::StringPrintf( |
| 819 "%s : no buffer bound at index %zu", message_tag, ii); | 817 "%s : no buffer bound at index %zu", message_tag, ii); |
| 820 ERRORSTATE_SET_GL_ERROR( | 818 ERRORSTATE_SET_GL_ERROR( |
| 821 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); | 819 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); |
| 822 return false; | 820 return false; |
| 823 } | 821 } |
| 824 if (buffer->GetMappedRange()) { | 822 if (buffer->GetMappedRange()) { |
| 825 std::string msg = base::StringPrintf( | 823 std::string msg = base::StringPrintf( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 837 "%s : buffer or buffer range not large enough at index %zu", | 835 "%s : buffer or buffer range not large enough at index %zu", |
| 838 message_tag, ii); | 836 message_tag, ii); |
| 839 ERRORSTATE_SET_GL_ERROR( | 837 ERRORSTATE_SET_GL_ERROR( |
| 840 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); | 838 error_state, GL_INVALID_OPERATION, func_name, msg.c_str()); |
| 841 return false; | 839 return false; |
| 842 } | 840 } |
| 843 } | 841 } |
| 844 return true; | 842 return true; |
| 845 } | 843 } |
| 846 | 844 |
| 847 void BufferManager::IncreaseMappedBufferCount() { | |
| 848 DCHECK_GT(std::numeric_limits<uint32_t>::max(), mapped_buffer_count_); | |
| 849 mapped_buffer_count_++; | |
| 850 } | |
| 851 | |
| 852 void BufferManager::DecreaseMappedBufferCount() { | |
| 853 DCHECK_LT(0u, mapped_buffer_count_); | |
| 854 mapped_buffer_count_--; | |
| 855 } | |
| 856 | |
| 857 bool BufferManager::RequestBufferAccessV(ErrorState* error_state, | 845 bool BufferManager::RequestBufferAccessV(ErrorState* error_state, |
| 858 Buffer* buffer, | 846 Buffer* buffer, |
| 859 const char* func_name, | 847 const char* func_name, |
| 860 const char* error_message_format, | 848 const char* error_message_format, |
| 861 va_list varargs) { | 849 va_list varargs) { |
| 862 DCHECK(error_state); | 850 DCHECK(error_state); |
| 863 | 851 |
| 864 if (!buffer || buffer->IsDeleted()) { | 852 if (!buffer || buffer->IsDeleted()) { |
| 865 std::string message_tag = base::StringPrintV(error_message_format, varargs); | 853 std::string message_tag = base::StringPrintV(error_message_format, varargs); |
| 866 std::string msg = base::StringPrintf("%s : no buffer", message_tag.c_str()); | 854 std::string msg = base::StringPrintf("%s : no buffer", message_tag.c_str()); |
| 867 ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_OPERATION, func_name, | 855 ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_OPERATION, func_name, |
| 868 msg.c_str()); | 856 msg.c_str()); |
| 869 return false; | 857 return false; |
| 870 } | 858 } |
| 871 if (buffer->GetMappedRange()) { | 859 if (buffer->GetMappedRange()) { |
| 872 std::string message_tag = base::StringPrintV(error_message_format, varargs); | 860 std::string message_tag = base::StringPrintV(error_message_format, varargs); |
| 873 std::string msg = base::StringPrintf("%s : buffer is mapped", | 861 std::string msg = base::StringPrintf("%s : buffer is mapped", |
| 874 message_tag.c_str()); | 862 message_tag.c_str()); |
| 875 ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_OPERATION, func_name, | 863 ERRORSTATE_SET_GL_ERROR(error_state, GL_INVALID_OPERATION, func_name, |
| 876 msg.c_str()); | 864 msg.c_str()); |
| 877 return false; | 865 return false; |
| 878 } | 866 } |
| 879 return true; | 867 return true; |
| 880 } | 868 } |
| 881 | 869 |
| 882 } // namespace gles2 | 870 } // namespace gles2 |
| 883 } // namespace gpu | 871 } // namespace gpu |
| OLD | NEW |