| 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/transfer_buffer_manager.h" | 5 #include "gpu/command_buffer/service/transfer_buffer_manager.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 if (memory_tracker_) { | 33 if (memory_tracker_) { |
| 34 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( | 34 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
| 35 this, "gpu::TransferBufferManager", | 35 this, "gpu::TransferBufferManager", |
| 36 base::ThreadTaskRunnerHandle::Get()); | 36 base::ThreadTaskRunnerHandle::Get()); |
| 37 } | 37 } |
| 38 } | 38 } |
| 39 | 39 |
| 40 TransferBufferManager::~TransferBufferManager() { | 40 TransferBufferManager::~TransferBufferManager() { |
| 41 while (!registered_buffers_.empty()) { | 41 while (!registered_buffers_.empty()) { |
| 42 BufferMap::iterator it = registered_buffers_.begin(); | 42 BufferMap::iterator it = registered_buffers_.begin(); |
| 43 if (it->second->backing()->is_shared()) { | 43 DCHECK(shared_memory_bytes_allocated_ >= it->second->size()); |
| 44 DCHECK(shared_memory_bytes_allocated_ >= it->second->size()); | 44 shared_memory_bytes_allocated_ -= it->second->size(); |
| 45 shared_memory_bytes_allocated_ -= it->second->size(); | |
| 46 } | |
| 47 registered_buffers_.erase(it); | 45 registered_buffers_.erase(it); |
| 48 } | 46 } |
| 49 DCHECK(!shared_memory_bytes_allocated_); | 47 DCHECK(!shared_memory_bytes_allocated_); |
| 50 | 48 |
| 51 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( | 49 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( |
| 52 this); | 50 this); |
| 53 } | 51 } |
| 54 | 52 |
| 55 bool TransferBufferManager::RegisterTransferBuffer( | 53 bool TransferBufferManager::RegisterTransferBuffer( |
| 56 int32_t id, | 54 int32_t id, |
| 57 std::unique_ptr<BufferBacking> buffer_backing) { | 55 std::unique_ptr<BufferBacking> buffer_backing) { |
| 58 if (id <= 0) { | 56 if (id <= 0) { |
| 59 DVLOG(0) << "Cannot register transfer buffer with non-positive ID."; | 57 DVLOG(0) << "Cannot register transfer buffer with non-positive ID."; |
| 60 return false; | 58 return false; |
| 61 } | 59 } |
| 62 | 60 |
| 63 // Fail if the ID is in use. | 61 // Fail if the ID is in use. |
| 64 if (registered_buffers_.find(id) != registered_buffers_.end()) { | 62 if (registered_buffers_.find(id) != registered_buffers_.end()) { |
| 65 DVLOG(0) << "Buffer ID already in use."; | 63 DVLOG(0) << "Buffer ID already in use."; |
| 66 return false; | 64 return false; |
| 67 } | 65 } |
| 68 | 66 |
| 69 // Register the shared memory with the ID. | 67 // Register the shared memory with the ID. |
| 70 scoped_refptr<Buffer> buffer(new gpu::Buffer(std::move(buffer_backing))); | 68 scoped_refptr<Buffer> buffer(new gpu::Buffer(std::move(buffer_backing))); |
| 71 | 69 |
| 72 // Check buffer alignment is sane. | 70 // Check buffer alignment is sane. |
| 73 DCHECK(!(reinterpret_cast<uintptr_t>(buffer->memory()) & | 71 DCHECK(!(reinterpret_cast<uintptr_t>(buffer->memory()) & |
| 74 (kCommandBufferEntrySize - 1))); | 72 (kCommandBufferEntrySize - 1))); |
| 75 | 73 |
| 76 if (buffer->backing()->is_shared()) | 74 shared_memory_bytes_allocated_ += buffer->size(); |
| 77 shared_memory_bytes_allocated_ += buffer->size(); | 75 |
| 78 registered_buffers_[id] = buffer; | 76 registered_buffers_[id] = buffer; |
| 79 | 77 |
| 80 return true; | 78 return true; |
| 81 } | 79 } |
| 82 | 80 |
| 83 void TransferBufferManager::DestroyTransferBuffer(int32_t id) { | 81 void TransferBufferManager::DestroyTransferBuffer(int32_t id) { |
| 84 BufferMap::iterator it = registered_buffers_.find(id); | 82 BufferMap::iterator it = registered_buffers_.find(id); |
| 85 if (it == registered_buffers_.end()) { | 83 if (it == registered_buffers_.end()) { |
| 86 DVLOG(0) << "Transfer buffer ID was not registered."; | 84 DVLOG(0) << "Transfer buffer ID was not registered."; |
| 87 return; | 85 return; |
| 88 } | 86 } |
| 89 | 87 |
| 90 if (it->second->backing()->is_shared()) { | 88 DCHECK(shared_memory_bytes_allocated_ >= it->second->size()); |
| 91 DCHECK(shared_memory_bytes_allocated_ >= it->second->size()); | 89 shared_memory_bytes_allocated_ -= it->second->size(); |
| 92 shared_memory_bytes_allocated_ -= it->second->size(); | 90 |
| 93 } | |
| 94 registered_buffers_.erase(it); | 91 registered_buffers_.erase(it); |
| 95 } | 92 } |
| 96 | 93 |
| 97 scoped_refptr<Buffer> TransferBufferManager::GetTransferBuffer(int32_t id) { | 94 scoped_refptr<Buffer> TransferBufferManager::GetTransferBuffer(int32_t id) { |
| 98 if (id == 0) | 95 if (id == 0) |
| 99 return NULL; | 96 return NULL; |
| 100 | 97 |
| 101 BufferMap::iterator it = registered_buffers_.find(id); | 98 BufferMap::iterator it = registered_buffers_.find(id); |
| 102 if (it == registered_buffers_.end()) | 99 if (it == registered_buffers_.end()) |
| 103 return NULL; | 100 return NULL; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 125 | 122 |
| 126 for (const auto& buffer_entry : registered_buffers_) { | 123 for (const auto& buffer_entry : registered_buffers_) { |
| 127 int32_t buffer_id = buffer_entry.first; | 124 int32_t buffer_id = buffer_entry.first; |
| 128 const Buffer* buffer = buffer_entry.second.get(); | 125 const Buffer* buffer = buffer_entry.second.get(); |
| 129 std::string dump_name = | 126 std::string dump_name = |
| 130 base::StringPrintf("gpu/transfer_memory/client_%d/buffer_%d", | 127 base::StringPrintf("gpu/transfer_memory/client_%d/buffer_%d", |
| 131 memory_tracker_->ClientId(), buffer_id); | 128 memory_tracker_->ClientId(), buffer_id); |
| 132 MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(dump_name); | 129 MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(dump_name); |
| 133 dump->AddScalar(MemoryAllocatorDump::kNameSize, | 130 dump->AddScalar(MemoryAllocatorDump::kNameSize, |
| 134 MemoryAllocatorDump::kUnitsBytes, buffer->size()); | 131 MemoryAllocatorDump::kUnitsBytes, buffer->size()); |
| 135 if (buffer->backing()->is_shared()) { | 132 auto guid = |
| 136 auto guid = GetBufferGUIDForTracing(memory_tracker_->ClientTracingId(), | 133 GetBufferGUIDForTracing(memory_tracker_->ClientTracingId(), buffer_id); |
| 137 buffer_id); | 134 pmd->CreateSharedGlobalAllocatorDump(guid); |
| 138 pmd->CreateSharedGlobalAllocatorDump(guid); | 135 pmd->AddOwnershipEdge(dump->guid(), guid); |
| 139 pmd->AddOwnershipEdge(dump->guid(), guid); | |
| 140 } | |
| 141 } | 136 } |
| 142 | 137 |
| 143 return true; | 138 return true; |
| 144 } | 139 } |
| 145 | 140 |
| 146 } // namespace gpu | 141 } // namespace gpu |
| OLD | NEW |