mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
99 lines
2.7 KiB
C++
99 lines
2.7 KiB
C++
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "gpu/command_buffer/service/transfer_buffer_manager.h"
|
|
|
|
#include <limits>
|
|
|
|
#include "base/logging.h"
|
|
#include "base/memory/scoped_ptr.h"
|
|
#include "base/process/process_handle.h"
|
|
#include "base/trace_event/trace_event.h"
|
|
#include "gpu/command_buffer/common/cmd_buffer_common.h"
|
|
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
|
|
|
|
using ::base::SharedMemory;
|
|
|
|
namespace gpu {
|
|
|
|
TransferBufferManagerInterface::~TransferBufferManagerInterface() {
|
|
}
|
|
|
|
TransferBufferManager::TransferBufferManager()
|
|
: shared_memory_bytes_allocated_(0) {
|
|
}
|
|
|
|
TransferBufferManager::~TransferBufferManager() {
|
|
while (!registered_buffers_.empty()) {
|
|
BufferMap::iterator it = registered_buffers_.begin();
|
|
DCHECK(shared_memory_bytes_allocated_ >= it->second->size());
|
|
shared_memory_bytes_allocated_ -= it->second->size();
|
|
registered_buffers_.erase(it);
|
|
}
|
|
DCHECK(!shared_memory_bytes_allocated_);
|
|
}
|
|
|
|
bool TransferBufferManager::Initialize() {
|
|
return true;
|
|
}
|
|
|
|
bool TransferBufferManager::RegisterTransferBuffer(
|
|
int32 id,
|
|
scoped_ptr<BufferBacking> buffer_backing) {
|
|
if (id <= 0) {
|
|
DVLOG(0) << "Cannot register transfer buffer with non-positive ID.";
|
|
return false;
|
|
}
|
|
|
|
// Fail if the ID is in use.
|
|
if (registered_buffers_.find(id) != registered_buffers_.end()) {
|
|
DVLOG(0) << "Buffer ID already in use.";
|
|
return false;
|
|
}
|
|
|
|
// Register the shared memory with the ID.
|
|
scoped_refptr<Buffer> buffer(new gpu::Buffer(buffer_backing.Pass()));
|
|
|
|
// Check buffer alignment is sane.
|
|
DCHECK(!(reinterpret_cast<uintptr_t>(buffer->memory()) &
|
|
(kCommandBufferEntrySize - 1)));
|
|
|
|
shared_memory_bytes_allocated_ += buffer->size();
|
|
TRACE_COUNTER_ID1(
|
|
"gpu", "GpuTransferBufferMemory", this, shared_memory_bytes_allocated_);
|
|
|
|
registered_buffers_[id] = buffer;
|
|
|
|
return true;
|
|
}
|
|
|
|
void TransferBufferManager::DestroyTransferBuffer(int32 id) {
|
|
BufferMap::iterator it = registered_buffers_.find(id);
|
|
if (it == registered_buffers_.end()) {
|
|
DVLOG(0) << "Transfer buffer ID was not registered.";
|
|
return;
|
|
}
|
|
|
|
DCHECK(shared_memory_bytes_allocated_ >= it->second->size());
|
|
shared_memory_bytes_allocated_ -= it->second->size();
|
|
TRACE_COUNTER_ID1(
|
|
"gpu", "GpuTransferBufferMemory", this, shared_memory_bytes_allocated_);
|
|
|
|
registered_buffers_.erase(it);
|
|
}
|
|
|
|
scoped_refptr<Buffer> TransferBufferManager::GetTransferBuffer(int32 id) {
|
|
if (id == 0)
|
|
return NULL;
|
|
|
|
BufferMap::iterator it = registered_buffers_.find(id);
|
|
if (it == registered_buffers_.end())
|
|
return NULL;
|
|
|
|
return it->second;
|
|
}
|
|
|
|
} // namespace gpu
|
|
|