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 |