blob: 7ce8843bbacfd716a14e2672ae360f8a1ff85b25 [file] [log] [blame]
// Copyright 2016 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 "services/ui/surfaces/mus_gpu_memory_buffer_manager.h"
#include "base/logging.h"
#include "gpu/ipc/client/gpu_memory_buffer_impl.h"
#include "gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.h"
#include "gpu/ipc/common/gpu_memory_buffer_support.h"
#include "services/ui/common/generic_shared_memory_id_generator.h"
#include "services/ui/gpu/interfaces/gpu_service_internal.mojom.h"
namespace ui {
MusGpuMemoryBufferManager::MusGpuMemoryBufferManager(
mojom::GpuServiceInternalPtr gpu_service,
int client_id)
: gpu_service_(std::move(gpu_service)),
client_id_(client_id),
weak_factory_(this) {}
MusGpuMemoryBufferManager::~MusGpuMemoryBufferManager() {}
std::unique_ptr<gfx::GpuMemoryBuffer>
MusGpuMemoryBufferManager::AllocateGpuMemoryBuffer(
const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferUsage usage,
gpu::SurfaceHandle surface_handle) {
gfx::GpuMemoryBufferId id = GetNextGenericSharedMemoryId();
const bool is_native =
gpu::IsNativeGpuMemoryBufferConfigurationSupported(format, usage);
if (is_native) {
gfx::GpuMemoryBufferHandle handle;
gpu_service_->CreateGpuMemoryBuffer(id, size, format, usage, client_id_,
surface_handle, &handle);
if (handle.is_null())
return nullptr;
return gpu::GpuMemoryBufferImpl::CreateFromHandle(
handle, size, format, usage,
base::Bind(&MusGpuMemoryBufferManager::DestroyGpuMemoryBuffer,
weak_factory_.GetWeakPtr(), id, client_id_, is_native));
}
DCHECK(gpu::GpuMemoryBufferImplSharedMemory::IsUsageSupported(usage))
<< static_cast<int>(usage);
return gpu::GpuMemoryBufferImplSharedMemory::Create(
id, size, format,
base::Bind(&MusGpuMemoryBufferManager::DestroyGpuMemoryBuffer,
weak_factory_.GetWeakPtr(), id, client_id_, is_native));
}
std::unique_ptr<gfx::GpuMemoryBuffer>
MusGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle(
const gfx::GpuMemoryBufferHandle& handle,
const gfx::Size& size,
gfx::BufferFormat format) {
NOTIMPLEMENTED();
return nullptr;
}
void MusGpuMemoryBufferManager::SetDestructionSyncToken(
gfx::GpuMemoryBuffer* buffer,
const gpu::SyncToken& sync_token) {
static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token(
sync_token);
}
void MusGpuMemoryBufferManager::DestroyGpuMemoryBuffer(
gfx::GpuMemoryBufferId id,
int client_id,
bool is_native,
const gpu::SyncToken& sync_token) {
if (is_native) {
gpu_service_->DestroyGpuMemoryBuffer(id, client_id, sync_token);
}
}
} // namespace ui