Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: gpu/command_buffer/service/transfer_buffer_manager.cc

Issue 10825288: Fix transfer buffer accounting (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698