Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(372)

Side by Side Diff: services/ui/public/cpp/mojo_gpu_memory_buffer_manager.cc

Issue 2479043002: mus: Get the gpu memory buffer from the window server. (Closed)
Patch Set: . Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698