| 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/bind.h" |    7 #include "base/bind.h" | 
|    8 #include "base/logging.h" |    8 #include "base/logging.h" | 
|    9 #include "base/memory/ptr_util.h" |    9 #include "base/memory/ptr_util.h" | 
|   10 #include "base/memory/shared_memory.h" |   10 #include "base/memory/shared_memory.h" | 
 |   11 #include "base/synchronization/waitable_event.h" | 
|   11 #include "gpu/ipc/client/gpu_memory_buffer_impl.h" |   12 #include "gpu/ipc/client/gpu_memory_buffer_impl.h" | 
|   12 #include "mojo/public/cpp/system/buffer.h" |   13 #include "mojo/public/cpp/system/buffer.h" | 
|   13 #include "mojo/public/cpp/system/platform_handle.h" |   14 #include "mojo/public/cpp/system/platform_handle.h" | 
 |   15 #include "services/service_manager/public/cpp/connector.h" | 
|   14 #include "ui/gfx/buffer_format_util.h" |   16 #include "ui/gfx/buffer_format_util.h" | 
|   15  |   17  | 
|   16 namespace ui { |   18 namespace ui { | 
|   17  |   19  | 
|   18 MojoGpuMemoryBufferManager::MojoGpuMemoryBufferManager() |   20 namespace { | 
|   19     : weak_ptr_factory_(this) {} |  | 
|   20  |   21  | 
|   21 MojoGpuMemoryBufferManager::~MojoGpuMemoryBufferManager() {} |   22 void OnGpuMemoryBufferAllocated(gfx::GpuMemoryBufferHandle* ret_handle, | 
 |   23                                 base::WaitableEvent* wait, | 
 |   24                                 const gfx::GpuMemoryBufferHandle& handle) { | 
 |   25   *ret_handle = handle; | 
 |   26   wait->Signal(); | 
 |   27 } | 
 |   28  | 
 |   29 }  // namespace | 
 |   30  | 
 |   31 MojoGpuMemoryBufferManager::MojoGpuMemoryBufferManager( | 
 |   32     service_manager::Connector* connector) | 
 |   33     : thread_("GpuMemoryThread"), | 
 |   34       connector_(connector->Clone()), | 
 |   35       weak_ptr_factory_(this) { | 
 |   36   CHECK(thread_.Start()); | 
 |   37   // The thread is owned by this object. Which means the test will not run if | 
 |   38   // the object has been destroyed. So Unretained() is safe. | 
 |   39   thread_.task_runner()->PostTask( | 
 |   40       FROM_HERE, base::Bind(&MojoGpuMemoryBufferManager::InitThread, | 
 |   41                             base::Unretained(this))); | 
 |   42 } | 
 |   43  | 
 |   44 MojoGpuMemoryBufferManager::~MojoGpuMemoryBufferManager() { | 
 |   45   thread_.task_runner()->PostTask( | 
 |   46       FROM_HERE, base::Bind(&MojoGpuMemoryBufferManager::TearDownThread, | 
 |   47                             base::Unretained(this))); | 
 |   48   thread_.Stop(); | 
 |   49 } | 
 |   50  | 
 |   51 void MojoGpuMemoryBufferManager::InitThread() { | 
 |   52   connector_->ConnectToInterface("service:ui", &gpu_service_); | 
 |   53 } | 
 |   54  | 
 |   55 void MojoGpuMemoryBufferManager::TearDownThread() { | 
 |   56   gpu_service_.reset(); | 
 |   57 } | 
 |   58  | 
 |   59 void MojoGpuMemoryBufferManager::AllocateGpuMemoryBufferOnThread( | 
 |   60     const gfx::Size& size, | 
 |   61     gfx::BufferFormat format, | 
 |   62     gfx::BufferUsage usage, | 
 |   63     gfx::GpuMemoryBufferHandle* handle, | 
 |   64     base::WaitableEvent* wait) { | 
 |   65   DCHECK(thread_.task_runner()->BelongsToCurrentThread()); | 
 |   66   // |handle| and |wait| are both on the stack, and will be alive until |wait| | 
 |   67   // is signaled. So it is safe for OnGpuMemoryBufferAllocated() to operate on | 
 |   68   // these. | 
 |   69   gpu_service_->CreateGpuMemoryBuffer( | 
 |   70       gfx::GpuMemoryBufferId(++counter_), size, format, usage, | 
 |   71       base::Bind(&OnGpuMemoryBufferAllocated, handle, wait)); | 
 |   72 } | 
|   22  |   73  | 
|   23 void MojoGpuMemoryBufferManager::DeletedGpuMemoryBuffer( |   74 void MojoGpuMemoryBufferManager::DeletedGpuMemoryBuffer( | 
|   24     gfx::GpuMemoryBufferId id, |   75     gfx::GpuMemoryBufferId id, | 
|   25     const gpu::SyncToken& sync_token) { |   76     const gpu::SyncToken& sync_token) { | 
 |   77   if (!thread_.task_runner()->BelongsToCurrentThread()) { | 
 |   78     thread_.task_runner()->PostTask( | 
 |   79         FROM_HERE, | 
 |   80         base::Bind(&MojoGpuMemoryBufferManager::DeletedGpuMemoryBuffer, | 
 |   81                    base::Unretained(this), id, sync_token)); | 
 |   82     return; | 
 |   83   } | 
 |   84   gpu_service_->DestroyGpuMemoryBuffer(id, sync_token); | 
|   26 } |   85 } | 
|   27  |   86  | 
|   28 std::unique_ptr<gfx::GpuMemoryBuffer> |   87 std::unique_ptr<gfx::GpuMemoryBuffer> | 
|   29 MojoGpuMemoryBufferManager::AllocateGpuMemoryBuffer( |   88 MojoGpuMemoryBufferManager::AllocateGpuMemoryBuffer( | 
|   30     const gfx::Size& size, |   89     const gfx::Size& size, | 
|   31     gfx::BufferFormat format, |   90     gfx::BufferFormat format, | 
|   32     gfx::BufferUsage usage, |   91     gfx::BufferUsage usage, | 
|   33     gpu::SurfaceHandle surface_handle) { |   92     gpu::SurfaceHandle surface_handle) { | 
|   34   // TODO(sad): Get the memory buffer handle from GpuService. |   93   // Note: this can be called from multiple threads at the same time. Some of | 
|   35   size_t bytes = gfx::BufferSizeForBufferFormat(size, format); |   94   // those threads may not have a TaskRunner set. | 
|   36  |   95   DCHECK_EQ(gpu::kNullSurfaceHandle, surface_handle); | 
|   37   mojo::ScopedSharedBufferHandle handle = |   96   CHECK(!thread_.task_runner()->BelongsToCurrentThread()); | 
|   38       mojo::SharedBufferHandle::Create(bytes); |   97   gfx::GpuMemoryBufferHandle gmb_handle; | 
|   39   if (!handle.is_valid()) |   98   base::WaitableEvent wait(base::WaitableEvent::ResetPolicy::AUTOMATIC, | 
 |   99                            base::WaitableEvent::InitialState::NOT_SIGNALED); | 
 |  100   thread_.task_runner()->PostTask( | 
 |  101       FROM_HERE, | 
 |  102       base::Bind(&MojoGpuMemoryBufferManager::AllocateGpuMemoryBufferOnThread, | 
 |  103                  base::Unretained(this), size, format, usage, &gmb_handle, | 
 |  104                  &wait)); | 
 |  105   wait.Wait(); | 
 |  106   if (gmb_handle.is_null()) | 
|   40     return nullptr; |  107     return nullptr; | 
|   41  |  | 
|   42   base::SharedMemoryHandle shm_handle; |  | 
|   43   size_t shared_memory_size; |  | 
|   44   bool readonly; |  | 
|   45   MojoResult result = mojo::UnwrapSharedMemoryHandle( |  | 
|   46       std::move(handle), &shm_handle, &shared_memory_size, &readonly); |  | 
|   47   if (result != MOJO_RESULT_OK) |  | 
|   48     return nullptr; |  | 
|   49   DCHECK_EQ(shared_memory_size, bytes); |  | 
|   50  |  | 
|   51   const int stride = base::checked_cast<int>( |  | 
|   52       gfx::RowSizeForBufferFormat(size.width(), format, 0)); |  | 
|   53  |  | 
|   54   gfx::GpuMemoryBufferHandle gmb_handle; |  | 
|   55   gmb_handle.type = gfx::SHARED_MEMORY_BUFFER; |  | 
|   56   gmb_handle.id = gfx::GpuMemoryBufferId(++counter_); |  | 
|   57   gmb_handle.handle = shm_handle; |  | 
|   58   gmb_handle.offset = 0; |  | 
|   59   gmb_handle.stride = stride; |  | 
|   60  |  | 
|   61   std::unique_ptr<gpu::GpuMemoryBufferImpl> buffer( |  108   std::unique_ptr<gpu::GpuMemoryBufferImpl> buffer( | 
|   62       gpu::GpuMemoryBufferImpl::CreateFromHandle( |  109       gpu::GpuMemoryBufferImpl::CreateFromHandle( | 
|   63           gmb_handle, size, format, usage, |  110           gmb_handle, size, format, usage, | 
|   64           base::Bind(&MojoGpuMemoryBufferManager::DeletedGpuMemoryBuffer, |  111           base::Bind(&MojoGpuMemoryBufferManager::DeletedGpuMemoryBuffer, | 
|   65                      weak_ptr_factory_.GetWeakPtr(), gmb_handle.id))); |  112                      weak_ptr_factory_.GetWeakPtr(), gmb_handle.id))); | 
|   66   if (!buffer) |  113   if (!buffer) { | 
 |  114     DeletedGpuMemoryBuffer(gmb_handle.id, gpu::SyncToken()); | 
|   67     return nullptr; |  115     return nullptr; | 
|   68  |  116   } | 
|   69   return std::move(buffer); |  117   return std::move(buffer); | 
|   70 } |  118 } | 
|   71  |  119  | 
|   72 std::unique_ptr<gfx::GpuMemoryBuffer> |  120 std::unique_ptr<gfx::GpuMemoryBuffer> | 
|   73 MojoGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( |  121 MojoGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle( | 
|   74     const gfx::GpuMemoryBufferHandle& handle, |  122     const gfx::GpuMemoryBufferHandle& handle, | 
|   75     const gfx::Size& size, |  123     const gfx::Size& size, | 
|   76     gfx::BufferFormat format) { |  124     gfx::BufferFormat format) { | 
|   77   NOTIMPLEMENTED(); |  125   NOTIMPLEMENTED(); | 
|   78   return nullptr; |  126   return nullptr; | 
|   79 } |  127 } | 
|   80  |  128  | 
|   81 gfx::GpuMemoryBuffer* |  129 gfx::GpuMemoryBuffer* | 
|   82 MojoGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( |  130 MojoGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( | 
|   83     ClientBuffer buffer) { |  131     ClientBuffer buffer) { | 
|   84   return gpu::GpuMemoryBufferImpl::FromClientBuffer(buffer); |  132   return gpu::GpuMemoryBufferImpl::FromClientBuffer(buffer); | 
|   85 } |  133 } | 
|   86  |  134  | 
|   87 void MojoGpuMemoryBufferManager::SetDestructionSyncToken( |  135 void MojoGpuMemoryBufferManager::SetDestructionSyncToken( | 
|   88     gfx::GpuMemoryBuffer* buffer, |  136     gfx::GpuMemoryBuffer* buffer, | 
|   89     const gpu::SyncToken& sync_token) { |  137     const gpu::SyncToken& sync_token) { | 
|   90   static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token( |  138   static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token( | 
|   91       sync_token); |  139       sync_token); | 
|   92 } |  140 } | 
|   93  |  141  | 
|   94 }  // namespace ui |  142 }  // namespace ui | 
| OLD | NEW |