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 <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/process_util.h" | 9 #include "base/process_util.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
11 | 11 |
12 using ::base::SharedMemory; | 12 using ::base::SharedMemory; |
13 | 13 |
14 namespace gpu { | 14 namespace gpu { |
15 | 15 |
16 TransferBufferManagerInterface::~TransferBufferManagerInterface() { | 16 TransferBufferManagerInterface::~TransferBufferManagerInterface() { |
17 } | 17 } |
18 | 18 |
19 TransferBufferManager::TransferBufferManager() | 19 TransferBufferManager::TransferBufferManager() |
20 : shared_memory_bytes_allocated_(0) { | 20 : shared_memory_bytes_allocated_(0) { |
21 // Element zero is always NULL. | 21 // Element zero is always NULL. |
22 registered_objects_.push_back(Buffer()); | 22 registered_objects_.push_back(Buffer()); |
23 } | 23 } |
24 | 24 |
25 TransferBufferManager::~TransferBufferManager() { | 25 TransferBufferManager::~TransferBufferManager() { |
26 for (size_t i = 0; i < registered_objects_.size(); ++i) { | 26 for (size_t i = 0; i < registered_objects_.size(); ++i) { |
27 if (registered_objects_[i].shared_memory) { | 27 if (registered_objects_[i].shared_memory) { |
| 28 DCHECK(shared_memory_bytes_allocated_ >= registered_objects_[i].size); |
28 shared_memory_bytes_allocated_ -= registered_objects_[i].size; | 29 shared_memory_bytes_allocated_ -= registered_objects_[i].size; |
29 delete registered_objects_[i].shared_memory; | 30 delete registered_objects_[i].shared_memory; |
30 } | 31 } |
31 } | 32 } |
32 // TODO(gman): Should we report 0 bytes to TRACE here? | 33 DCHECK(!shared_memory_bytes_allocated_); |
33 } | 34 } |
34 | 35 |
35 bool TransferBufferManager::Initialize() { | 36 bool TransferBufferManager::Initialize() { |
36 return true; | 37 return true; |
37 } | 38 } |
38 | 39 |
39 int32 TransferBufferManager::CreateTransferBuffer( | 40 int32 TransferBufferManager::CreateTransferBuffer( |
40 size_t size, int32 id_request) { | 41 size_t size, int32 id_request) { |
41 SharedMemory buffer; | 42 SharedMemory buffer; |
42 if (!buffer.CreateAnonymous(size)) | 43 if (!buffer.CreateAnonymous(size)) |
43 return -1; | 44 return -1; |
44 | 45 |
45 shared_memory_bytes_allocated_ += size; | |
46 TRACE_COUNTER_ID1( | |
47 "CommandBuffer", "SharedMemory", this, shared_memory_bytes_allocated_); | |
48 | |
49 return RegisterTransferBuffer(&buffer, size, id_request); | 46 return RegisterTransferBuffer(&buffer, size, id_request); |
50 } | 47 } |
51 | 48 |
52 int32 TransferBufferManager::RegisterTransferBuffer( | 49 int32 TransferBufferManager::RegisterTransferBuffer( |
53 base::SharedMemory* shared_memory, size_t size, int32 id_request) { | 50 base::SharedMemory* shared_memory, size_t size, int32 id_request) { |
54 // Check we haven't exceeded the range that fits in a 32-bit integer. | 51 // Check we haven't exceeded the range that fits in a 32-bit integer. |
55 if (unused_registered_object_elements_.empty()) { | 52 if (unused_registered_object_elements_.empty()) { |
56 if (registered_objects_.size() > std::numeric_limits<uint32>::max()) | 53 if (registered_objects_.size() > std::numeric_limits<uint32>::max()) |
57 return -1; | 54 return -1; |
58 } | 55 } |
(...skipping 15 matching lines...) Expand all Loading... |
74 if (!duped_shared_memory->Map(size)) | 71 if (!duped_shared_memory->Map(size)) |
75 return -1; | 72 return -1; |
76 | 73 |
77 // If it could be mapped, allocate an ID and register the shared memory with | 74 // If it could be mapped, allocate an ID and register the shared memory with |
78 // that ID. | 75 // that ID. |
79 Buffer buffer; | 76 Buffer buffer; |
80 buffer.ptr = duped_shared_memory->memory(); | 77 buffer.ptr = duped_shared_memory->memory(); |
81 buffer.size = size; | 78 buffer.size = size; |
82 buffer.shared_memory = duped_shared_memory.release(); | 79 buffer.shared_memory = duped_shared_memory.release(); |
83 | 80 |
| 81 shared_memory_bytes_allocated_ += size; |
| 82 TRACE_COUNTER_ID1( |
| 83 "CommandBuffer", "SharedMemory", this, shared_memory_bytes_allocated_); |
| 84 |
84 // If caller requested specific id, first try to use id_request. | 85 // If caller requested specific id, first try to use id_request. |
85 if (id_request != -1) { | 86 if (id_request != -1) { |
86 int32 cur_size = static_cast<int32>(registered_objects_.size()); | 87 int32 cur_size = static_cast<int32>(registered_objects_.size()); |
87 if (cur_size <= id_request) { | 88 if (cur_size <= id_request) { |
88 // Pad registered_objects_ to reach id_request. | 89 // Pad registered_objects_ to reach id_request. |
89 registered_objects_.resize(static_cast<size_t>(id_request + 1)); | 90 registered_objects_.resize(static_cast<size_t>(id_request + 1)); |
90 for (int32 id = cur_size; id < id_request; ++id) | 91 for (int32 id = cur_size; id < id_request; ++id) |
91 unused_registered_object_elements_.insert(id); | 92 unused_registered_object_elements_.insert(id); |
92 registered_objects_[id_request] = buffer; | 93 registered_objects_[id_request] = buffer; |
93 return id_request; | 94 return id_request; |
(...skipping 19 matching lines...) Expand all Loading... |
113 } | 114 } |
114 } | 115 } |
115 | 116 |
116 void TransferBufferManager::DestroyTransferBuffer(int32 handle) { | 117 void TransferBufferManager::DestroyTransferBuffer(int32 handle) { |
117 if (handle <= 0) | 118 if (handle <= 0) |
118 return; | 119 return; |
119 | 120 |
120 if (static_cast<size_t>(handle) >= registered_objects_.size()) | 121 if (static_cast<size_t>(handle) >= registered_objects_.size()) |
121 return; | 122 return; |
122 | 123 |
| 124 DCHECK(shared_memory_bytes_allocated_ >= registered_objects_[handle].size); |
123 shared_memory_bytes_allocated_ -= registered_objects_[handle].size; | 125 shared_memory_bytes_allocated_ -= registered_objects_[handle].size; |
124 TRACE_COUNTER_ID1( | 126 TRACE_COUNTER_ID1( |
125 "CommandBuffer", "SharedMemory", this, shared_memory_bytes_allocated_); | 127 "CommandBuffer", "SharedMemory", this, shared_memory_bytes_allocated_); |
126 | 128 |
127 delete registered_objects_[handle].shared_memory; | 129 delete registered_objects_[handle].shared_memory; |
128 registered_objects_[handle] = Buffer(); | 130 registered_objects_[handle] = Buffer(); |
129 unused_registered_object_elements_.insert(handle); | 131 unused_registered_object_elements_.insert(handle); |
130 | 132 |
131 // Remove all null objects from the end of the vector. This allows the vector | 133 // Remove all null objects from the end of the vector. This allows the vector |
132 // to shrink when, for example, all objects are unregistered. Note that this | 134 // to shrink when, for example, all objects are unregistered. Note that this |
(...skipping 11 matching lines...) Expand all Loading... |
144 return Buffer(); | 146 return Buffer(); |
145 | 147 |
146 if (static_cast<size_t>(handle) >= registered_objects_.size()) | 148 if (static_cast<size_t>(handle) >= registered_objects_.size()) |
147 return Buffer(); | 149 return Buffer(); |
148 | 150 |
149 return registered_objects_[handle]; | 151 return registered_objects_[handle]; |
150 } | 152 } |
151 | 153 |
152 } // namespace gpu | 154 } // namespace gpu |
153 | 155 |
OLD | NEW |