| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "services/ui/public/cpp/mojo_gpu_memory_buffer_manager.h" | 5 #include "services/ui/public/cpp/mojo_gpu_memory_buffer_manager.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/synchronization/waitable_event.h" |
| 9 #include "gpu/ipc/client/gpu_memory_buffer_impl.h" |
| 10 #include "mojo/public/cpp/bindings/sync_call_restrictions.h" |
| 11 #include "services/service_manager/public/cpp/connector.h" |
| 12 #include "services/ui/common/generic_shared_memory_id_generator.h" |
| 8 #include "services/ui/public/cpp/mojo_gpu_memory_buffer.h" | 13 #include "services/ui/public/cpp/mojo_gpu_memory_buffer.h" |
| 9 | 14 |
| 10 namespace ui { | 15 namespace ui { |
| 11 | 16 |
| 12 MojoGpuMemoryBufferManager::MojoGpuMemoryBufferManager() {} | 17 namespace { |
| 18 |
| 19 #if 1 // !defined(OS_WIN) |
| 20 void DeletedGpuMemoryBuffer(gfx::GpuMemoryBufferId id, |
| 21 const gpu::SyncToken& sync_token) { |
| 22 NOTIMPLEMENTED(); |
| 23 } |
| 24 #endif // !defined(OS_WIN) |
| 25 |
| 26 } // namespace |
| 27 |
| 28 MojoGpuMemoryBufferManager::MojoGpuMemoryBufferManager( |
| 29 mojom::GpuService* gpu_service) |
| 30 : main_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 31 gpu_service_(gpu_service) {} |
| 13 | 32 |
| 14 MojoGpuMemoryBufferManager::~MojoGpuMemoryBufferManager() {} | 33 MojoGpuMemoryBufferManager::~MojoGpuMemoryBufferManager() {} |
| 15 | 34 |
| 16 std::unique_ptr<gfx::GpuMemoryBuffer> | 35 std::unique_ptr<gfx::GpuMemoryBuffer> |
| 17 MojoGpuMemoryBufferManager::AllocateGpuMemoryBuffer( | 36 MojoGpuMemoryBufferManager::AllocateGpuMemoryBuffer( |
| 18 const gfx::Size& size, | 37 const gfx::Size& size, |
| 19 gfx::BufferFormat format, | 38 gfx::BufferFormat format, |
| 20 gfx::BufferUsage usage, | 39 gfx::BufferUsage usage, |
| 21 gpu::SurfaceHandle surface_handle) { | 40 gpu::SurfaceHandle surface_handle) { |
| 41 #if defined(OS_WIN) |
| 42 // TODO(sad): Because the host needs a valid base::ProcessHandle to this |
| 43 // client. |
| 22 return MojoGpuMemoryBufferImpl::Create(size, format, usage); | 44 return MojoGpuMemoryBufferImpl::Create(size, format, usage); |
| 45 #else |
| 46 #if 1 |
| 47 DCHECK(!main_task_runner_->BelongsToCurrentThread()); |
| 48 base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| 49 base::WaitableEvent::InitialState::NOT_SIGNALED); |
| 50 gfx::GpuMemoryBufferHandle handle; |
| 51 gfx::GpuMemoryBufferId id = GetNextGenericSharedMemoryId(); |
| 52 main_task_runner_->PostTask( |
| 53 FROM_HERE, |
| 54 base::Bind(&MojoGpuMemoryBufferManager::AllocateGpuMemoryBufferOnMain, |
| 55 base::Unretained(this), id, size, format, usage, &handle, |
| 56 &event)); |
| 57 event.Wait(); |
| 58 std::unique_ptr<gpu::GpuMemoryBufferImpl> buffer = |
| 59 handle.is_null() ? nullptr |
| 60 : gpu::GpuMemoryBufferImpl::CreateFromHandle( |
| 61 handle, size, format, usage, |
| 62 base::Bind(&DeletedGpuMemoryBuffer, handle.id)); |
| 63 if (buffer) |
| 64 return buffer; |
| 65 // XXX: This needs to happen in the main thread. |
| 66 // gpu_service_->DestroyGpuMemoryBuffer(id, gpu::SyncToken()); |
| 67 #endif |
| 68 return MojoGpuMemoryBufferImpl::Create(size, format, usage); |
| 69 #endif |
| 70 } |
| 71 |
| 72 void MojoGpuMemoryBufferManager::AllocateGpuMemoryBufferOnMain( |
| 73 gfx::GpuMemoryBufferId id, |
| 74 const gfx::Size& size, |
| 75 gfx::BufferFormat format, |
| 76 gfx::BufferUsage usage, |
| 77 gfx::GpuMemoryBufferHandle* handle, |
| 78 base::WaitableEvent* event) { |
| 79 EnsureGpuServiceConnection(); |
| 80 mojo::SyncCallRestrictions::ScopedAllowSyncCall allow_sync_call; |
| 81 gpu_service_->CreateGpuMemoryBuffer(id, size, format, usage, handle); |
| 82 event->Signal(); |
| 23 } | 83 } |
| 24 | 84 |
| 25 std::unique_ptr<gfx::GpuMemoryBuffer> | 85 std::unique_ptr<gfx::GpuMemoryBuffer> |
| 26 MojoGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( | 86 MojoGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( |
| 27 const gfx::GpuMemoryBufferHandle& handle, | 87 const gfx::GpuMemoryBufferHandle& handle, |
| 28 const gfx::Size& size, | 88 const gfx::Size& size, |
| 29 gfx::BufferFormat format) { | 89 gfx::BufferFormat format) { |
| 30 const gfx::BufferUsage usage = gfx::BufferUsage::GPU_READ; | 90 const gfx::BufferUsage usage = gfx::BufferUsage::GPU_READ; |
| 31 return MojoGpuMemoryBufferImpl::CreateFromHandle(handle, size, format, usage); | 91 return MojoGpuMemoryBufferImpl::CreateFromHandle(handle, size, format, usage); |
| 32 } | 92 } |
| 33 | 93 |
| 34 gfx::GpuMemoryBuffer* | 94 gfx::GpuMemoryBuffer* |
| 35 MojoGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( | 95 MojoGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( |
| 36 ClientBuffer buffer) { | 96 ClientBuffer buffer) { |
| 37 return MojoGpuMemoryBufferImpl::FromClientBuffer(buffer); | 97 return MojoGpuMemoryBufferImpl::FromClientBuffer(buffer); |
| 38 } | 98 } |
| 39 | 99 |
| 40 void MojoGpuMemoryBufferManager::SetDestructionSyncToken( | 100 void MojoGpuMemoryBufferManager::SetDestructionSyncToken( |
| 41 gfx::GpuMemoryBuffer* buffer, | 101 gfx::GpuMemoryBuffer* buffer, |
| 42 const gpu::SyncToken& sync_token) { | 102 const gpu::SyncToken& sync_token) { |
| 43 NOTIMPLEMENTED(); | 103 NOTIMPLEMENTED(); |
| 44 } | 104 } |
| 45 | 105 |
| 106 void MojoGpuMemoryBufferManager::EnsureGpuServiceConnection() { |
| 107 #if 0 |
| 108 CHECK(base::ThreadTaskRunnerHandle::Get()); |
| 109 if (gpu_service_ && !gpu_service_.encountered_error()) |
| 110 return; |
| 111 connector_->ConnectToInterface("service:ui", &gpu_service_); |
| 112 #endif |
| 113 } |
| 114 |
| 46 } // namespace ui | 115 } // namespace ui |
| OLD | NEW |