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
3 // found in the LICENSE file.
5 #include "gpu/command_buffer/service/transfer_buffer_manager.h"
9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/debug/trace_event.h"
12 #include "base/process/process_handle.h"
13 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
15 using ::base::SharedMemory;
19 TransferBufferManagerInterface::~TransferBufferManagerInterface() {
22 TransferBufferManager::TransferBufferManager()
23 : shared_memory_bytes_allocated_(0) {
26 TransferBufferManager::~TransferBufferManager() {
27 while (!registered_buffers_.empty()) {
28 BufferMap::iterator it = registered_buffers_.begin();
29 DCHECK(shared_memory_bytes_allocated_ >= it->second.size);
30 shared_memory_bytes_allocated_ -= it->second.size;
31 delete it->second.shared_memory;
32 registered_buffers_.erase(it);
34 DCHECK(!shared_memory_bytes_allocated_);
37 bool TransferBufferManager::Initialize() {
41 bool TransferBufferManager::RegisterTransferBuffer(
43 base::SharedMemory* shared_memory,
46 DVLOG(0) << "Cannot register transfer buffer with non-positive ID.";
50 // Fail if the ID is in use.
51 if (registered_buffers_.find(id) != registered_buffers_.end()) {
52 DVLOG(0) << "Buffer ID already in use.";
56 // Duplicate the handle.
57 base::SharedMemoryHandle duped_shared_memory_handle;
58 if (!shared_memory->ShareToProcess(base::GetCurrentProcessHandle(),
59 &duped_shared_memory_handle)) {
60 DVLOG(0) << "Failed to duplicate shared memory handle.";
63 scoped_ptr<SharedMemory> duped_shared_memory(
64 new SharedMemory(duped_shared_memory_handle, false));
66 // Map the shared memory into this process. This validates the size.
67 if (!duped_shared_memory->Map(size)) {
68 DVLOG(0) << "Failed to map shared memory.";
72 // If it could be mapped register the shared memory with the ID.
74 buffer.ptr = duped_shared_memory->memory();
76 buffer.shared_memory = duped_shared_memory.release();
78 shared_memory_bytes_allocated_ += size;
80 "gpu", "GpuTransferBufferMemory", this, shared_memory_bytes_allocated_);
82 registered_buffers_[id] = buffer;
87 void TransferBufferManager::DestroyTransferBuffer(int32 id) {
88 BufferMap::iterator it = registered_buffers_.find(id);
89 if (it == registered_buffers_.end()) {
90 DVLOG(0) << "Transfer buffer ID was not registered.";
94 DCHECK(shared_memory_bytes_allocated_ >= it->second.size);
95 shared_memory_bytes_allocated_ -= it->second.size;
97 "gpu", "GpuTransferBufferMemory", this, shared_memory_bytes_allocated_);
99 delete it->second.shared_memory;
100 registered_buffers_.erase(it);
103 Buffer TransferBufferManager::GetTransferBuffer(int32 id) {
107 BufferMap::iterator it = registered_buffers_.find(id);
108 if (it == registered_buffers_.end())