| Index: services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc
|
| diff --git a/services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc b/services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc
|
| index 342670b1f499efa0be663afe2770642a8451ec4b..e8c93e576e00aa8112888e97a8c671cadc53e9be 100644
|
| --- a/services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc
|
| +++ b/services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc
|
| @@ -5,11 +5,30 @@
|
| #include "services/ui/public/cpp/mojo_gpu_memory_buffer_manager.h"
|
|
|
| #include "base/logging.h"
|
| +#include "base/synchronization/waitable_event.h"
|
| +#include "gpu/ipc/client/gpu_memory_buffer_impl.h"
|
| +#include "mojo/public/cpp/bindings/sync_call_restrictions.h"
|
| +#include "services/service_manager/public/cpp/connector.h"
|
| +#include "services/ui/common/generic_shared_memory_id_generator.h"
|
| #include "services/ui/public/cpp/mojo_gpu_memory_buffer.h"
|
|
|
| namespace ui {
|
|
|
| -MojoGpuMemoryBufferManager::MojoGpuMemoryBufferManager() {}
|
| +namespace {
|
| +
|
| +#if 1 // !defined(OS_WIN)
|
| +void DeletedGpuMemoryBuffer(gfx::GpuMemoryBufferId id,
|
| + const gpu::SyncToken& sync_token) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +#endif // !defined(OS_WIN)
|
| +
|
| +} // namespace
|
| +
|
| +MojoGpuMemoryBufferManager::MojoGpuMemoryBufferManager(
|
| + mojom::GpuService* gpu_service)
|
| + : main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
|
| + gpu_service_(gpu_service) {}
|
|
|
| MojoGpuMemoryBufferManager::~MojoGpuMemoryBufferManager() {}
|
|
|
| @@ -19,7 +38,48 @@ MojoGpuMemoryBufferManager::AllocateGpuMemoryBuffer(
|
| gfx::BufferFormat format,
|
| gfx::BufferUsage usage,
|
| gpu::SurfaceHandle surface_handle) {
|
| +#if defined(OS_WIN)
|
| + // TODO(sad): Because the host needs a valid base::ProcessHandle to this
|
| + // client.
|
| + return MojoGpuMemoryBufferImpl::Create(size, format, usage);
|
| +#else
|
| +#if 1
|
| + DCHECK(!main_task_runner_->BelongsToCurrentThread());
|
| + base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
|
| + base::WaitableEvent::InitialState::NOT_SIGNALED);
|
| + gfx::GpuMemoryBufferHandle handle;
|
| + gfx::GpuMemoryBufferId id = GetNextGenericSharedMemoryId();
|
| + main_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&MojoGpuMemoryBufferManager::AllocateGpuMemoryBufferOnMain,
|
| + base::Unretained(this), id, size, format, usage, &handle,
|
| + &event));
|
| + event.Wait();
|
| + std::unique_ptr<gpu::GpuMemoryBufferImpl> buffer =
|
| + handle.is_null() ? nullptr
|
| + : gpu::GpuMemoryBufferImpl::CreateFromHandle(
|
| + handle, size, format, usage,
|
| + base::Bind(&DeletedGpuMemoryBuffer, handle.id));
|
| + if (buffer)
|
| + return buffer;
|
| +// XXX: This needs to happen in the main thread.
|
| +// gpu_service_->DestroyGpuMemoryBuffer(id, gpu::SyncToken());
|
| +#endif
|
| return MojoGpuMemoryBufferImpl::Create(size, format, usage);
|
| +#endif
|
| +}
|
| +
|
| +void MojoGpuMemoryBufferManager::AllocateGpuMemoryBufferOnMain(
|
| + gfx::GpuMemoryBufferId id,
|
| + const gfx::Size& size,
|
| + gfx::BufferFormat format,
|
| + gfx::BufferUsage usage,
|
| + gfx::GpuMemoryBufferHandle* handle,
|
| + base::WaitableEvent* event) {
|
| + EnsureGpuServiceConnection();
|
| + mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync_call;
|
| + gpu_service_->CreateGpuMemoryBuffer(id, size, format, usage, handle);
|
| + event->Signal();
|
| }
|
|
|
| std::unique_ptr<gfx::GpuMemoryBuffer>
|
| @@ -43,4 +103,13 @@ void MojoGpuMemoryBufferManager::SetDestructionSyncToken(
|
| NOTIMPLEMENTED();
|
| }
|
|
|
| +void MojoGpuMemoryBufferManager::EnsureGpuServiceConnection() {
|
| +#if 0
|
| + CHECK(base::ThreadTaskRunnerHandle::Get());
|
| + if (gpu_service_ && !gpu_service_.encountered_error())
|
| + return;
|
| + connector_->ConnectToInterface("service:ui", &gpu_service_);
|
| +#endif
|
| +}
|
| +
|
| } // namespace ui
|
|
|