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

Side by Side Diff: components/viz/common/server_gpu_memory_buffer_manager.cc

Issue 2934203002: exp/wip: Use ServerGpuMemoryBufferManager in browser.
Patch Set: . Created 3 years, 6 months 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
« no previous file with comments | « components/viz/common/server_gpu_memory_buffer_manager.h ('k') | content/browser/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "components/viz/common/server_gpu_memory_buffer_manager.h" 5 #include "components/viz/common/server_gpu_memory_buffer_manager.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/threading/thread_task_runner_handle.h"
9 #include "gpu/ipc/client/gpu_memory_buffer_impl.h" 8 #include "gpu/ipc/client/gpu_memory_buffer_impl.h"
10 #include "gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.h" 9 #include "gpu/ipc/client/gpu_memory_buffer_impl_shared_memory.h"
11 #include "gpu/ipc/common/gpu_memory_buffer_support.h" 10 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
12 #include "services/ui/gpu/interfaces/gpu_service.mojom.h" 11 #include "services/ui/gpu/interfaces/gpu_service.mojom.h"
13 12
14 namespace viz { 13 namespace viz {
15 14
16 ServerGpuMemoryBufferManager::ServerGpuMemoryBufferManager( 15 ServerGpuMemoryBufferManager::ServerGpuMemoryBufferManager(
17 ui::mojom::GpuService* gpu_service, 16 ui::mojom::GpuService* gpu_service,
18 int client_id) 17 int client_id,
18 scoped_refptr<base::SingleThreadTaskRunner> task_runner)
19 : gpu_service_(gpu_service), 19 : gpu_service_(gpu_service),
20 client_id_(client_id), 20 client_id_(client_id),
21 native_configurations_(gpu::GetNativeGpuMemoryBufferConfigurations()), 21 native_configurations_(gpu::GetNativeGpuMemoryBufferConfigurations()),
22 task_runner_(base::ThreadTaskRunnerHandle::Get()), 22 task_runner_(std::move(task_runner)) {}
23 weak_factory_(this) {}
24 23
25 ServerGpuMemoryBufferManager::~ServerGpuMemoryBufferManager() {} 24 ServerGpuMemoryBufferManager::~ServerGpuMemoryBufferManager() {}
26 25
27 void ServerGpuMemoryBufferManager::AllocateGpuMemoryBufferHandle( 26 void ServerGpuMemoryBufferManager::AllocateGpuMemoryBufferHandle(
28 gfx::GpuMemoryBufferId id, 27 gfx::GpuMemoryBufferId id,
29 int client_id, 28 int client_id,
30 const gfx::Size& size, 29 const gfx::Size& size,
31 gfx::BufferFormat format, 30 gfx::BufferFormat format,
32 gfx::BufferUsage usage, 31 gfx::BufferUsage usage,
33 gpu::SurfaceHandle surface_handle, 32 gpu::SurfaceHandle surface_handle,
34 base::OnceCallback<void(const gfx::GpuMemoryBufferHandle&)> callback) { 33 base::OnceCallback<void(const gfx::GpuMemoryBufferHandle&)> callback) {
35 DCHECK(task_runner_->BelongsToCurrentThread()); 34 DCHECK(task_runner_->BelongsToCurrentThread());
36 if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) { 35 if (gpu::GetNativeGpuMemoryBufferType() != gfx::EMPTY_BUFFER) {
37 const bool is_native = native_configurations_.find(std::make_pair( 36 const bool is_native = native_configurations_.find(std::make_pair(
38 format, usage)) != native_configurations_.end(); 37 format, usage)) != native_configurations_.end();
39 if (is_native) { 38 if (is_native) {
40 pending_buffers_.insert(client_id); 39 pending_buffers_.insert(client_id);
41 gpu_service_->CreateGpuMemoryBuffer( 40 gpu_service_->CreateGpuMemoryBuffer(
42 id, size, format, usage, client_id, surface_handle, 41 id, size, format, usage, client_id, surface_handle,
43 base::Bind(&ServerGpuMemoryBufferManager::OnGpuMemoryBufferAllocated, 42 base::Bind(&ServerGpuMemoryBufferManager::OnGpuMemoryBufferAllocated,
44 weak_factory_.GetWeakPtr(), client_id, 43 this, client_id, base::Passed(std::move(callback))));
45 base::Passed(std::move(callback))));
46 return; 44 return;
47 } 45 }
48 } 46 }
49 47
50 // Early out if we cannot fallback to shared memory buffer. 48 // Early out if we cannot fallback to shared memory buffer.
51 if (!gpu::GpuMemoryBufferImplSharedMemory::IsUsageSupported(usage) || 49 if (!gpu::GpuMemoryBufferImplSharedMemory::IsUsageSupported(usage) ||
52 !gpu::GpuMemoryBufferImplSharedMemory::IsSizeValidForFormat(size, 50 !gpu::GpuMemoryBufferImplSharedMemory::IsSizeValidForFormat(size,
53 format)) { 51 format)) {
54 std::move(callback).Run(gfx::GpuMemoryBufferHandle()); 52 std::move(callback).Run(gfx::GpuMemoryBufferHandle());
55 return; 53 return;
56 } 54 }
57 55
58 std::move(callback).Run( 56 std::move(callback).Run(
59 gpu::GpuMemoryBufferImplSharedMemory::CreateGpuMemoryBuffer(id, size, 57 gpu::GpuMemoryBufferImplSharedMemory::CreateGpuMemoryBuffer(id, size,
60 format)); 58 format));
61 } 59 }
62 60
63 std::unique_ptr<gfx::GpuMemoryBuffer> 61 std::unique_ptr<gfx::GpuMemoryBuffer>
64 ServerGpuMemoryBufferManager::CreateGpuMemoryBuffer( 62 ServerGpuMemoryBufferManager::CreateGpuMemoryBuffer(
65 const gfx::Size& size, 63 const gfx::Size& size,
66 gfx::BufferFormat format, 64 gfx::BufferFormat format,
67 gfx::BufferUsage usage, 65 gfx::BufferUsage usage,
68 gpu::SurfaceHandle surface_handle) { 66 gpu::SurfaceHandle surface_handle) {
69 gfx::GpuMemoryBufferId id(next_gpu_memory_id_++); 67 gfx::GpuMemoryBufferId id(next_gpu_memory_id_++);
70 gfx::GpuMemoryBufferHandle handle; 68 std::unique_ptr<gfx::GpuMemoryBuffer> buffer;
71 base::WaitableEvent wait_event( 69 base::WaitableEvent wait_event(
72 base::WaitableEvent::ResetPolicy::MANUAL, 70 base::WaitableEvent::ResetPolicy::MANUAL,
73 base::WaitableEvent::InitialState::NOT_SIGNALED); 71 base::WaitableEvent::InitialState::NOT_SIGNALED);
74 // We block with a WaitableEvent until the callbacks are run. So using 72 // We block with a WaitableEvent until the callbacks are run. So using
75 // base::Unretained() is safe here. 73 // base::Unretained() is safe here.
76 auto reply_callback = base::BindOnce( 74 auto reply_callback = base::BindOnce(
77 &ServerGpuMemoryBufferManager::SignalOnGpuMemoryBufferAllocated, 75 &ServerGpuMemoryBufferManager::SignalOnGpuMemoryBufferAllocated, this,
78 base::Unretained(this), &handle, &wait_event); 76 &buffer, &wait_event, size, format, usage);
79 auto allocate_callback = base::BindOnce( 77 auto alloc_callback = base::BindOnce(
80 &ServerGpuMemoryBufferManager::AllocateGpuMemoryBufferHandle, 78 &ServerGpuMemoryBufferManager::AllocateGpuMemoryBufferHandle, this, id,
81 base::Unretained(this), id, client_id_, size, format, usage, 79 client_id_, size, format, usage, surface_handle,
82 surface_handle, std::move(reply_callback)); 80 std::move(reply_callback));
83 task_runner_->PostTask(FROM_HERE, std::move(allocate_callback)); 81 task_runner_->PostTask(FROM_HERE, std::move(alloc_callback));
84 base::ThreadRestrictions::ScopedAllowWait allow_wait; 82 base::ThreadRestrictions::ScopedAllowWait allow_wait;
85 wait_event.Wait(); 83 wait_event.Wait();
86 if (handle.is_null()) 84 return buffer;
87 return nullptr;
88 return gpu::GpuMemoryBufferImpl::CreateFromHandle(
89 handle, size, format, usage,
90 base::Bind(&ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer,
91 weak_factory_.GetWeakPtr(), id, client_id_));
92 } 85 }
93 86
94 void ServerGpuMemoryBufferManager::SetDestructionSyncToken( 87 void ServerGpuMemoryBufferManager::SetDestructionSyncToken(
95 gfx::GpuMemoryBuffer* buffer, 88 gfx::GpuMemoryBuffer* buffer,
96 const gpu::SyncToken& sync_token) { 89 const gpu::SyncToken& sync_token) {
97 static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token( 90 static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token(
98 sync_token); 91 sync_token);
99 } 92 }
100 93
101 void ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer( 94 void ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer(
102 gfx::GpuMemoryBufferId id, 95 gfx::GpuMemoryBufferId id,
103 int client_id, 96 int client_id,
104 const gpu::SyncToken& sync_token) { 97 const gpu::SyncToken& sync_token) {
105 DCHECK(task_runner_->BelongsToCurrentThread()); 98 if (task_runner_->BelongsToCurrentThread()) {
106 if (native_buffers_[client_id].erase(id)) 99 if (native_buffers_[client_id].erase(id))
107 gpu_service_->DestroyGpuMemoryBuffer(id, client_id, sync_token); 100 gpu_service_->DestroyGpuMemoryBuffer(id, client_id, sync_token);
101 } else {
102 task_runner_->PostTask(
103 FROM_HERE,
104 base::Bind(&ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer, this,
105 id, client_id, sync_token));
106 }
108 } 107 }
109 108
110 void ServerGpuMemoryBufferManager::DestroyAllGpuMemoryBufferForClient( 109 void ServerGpuMemoryBufferManager::DestroyAllGpuMemoryBufferForClient(
111 int client_id) { 110 int client_id) {
112 DCHECK(task_runner_->BelongsToCurrentThread()); 111 DCHECK(task_runner_->BelongsToCurrentThread());
113 for (gfx::GpuMemoryBufferId id : native_buffers_[client_id]) 112 for (gfx::GpuMemoryBufferId id : native_buffers_[client_id])
114 gpu_service_->DestroyGpuMemoryBuffer(id, client_id, gpu::SyncToken()); 113 gpu_service_->DestroyGpuMemoryBuffer(id, client_id, gpu::SyncToken());
115 native_buffers_.erase(client_id); 114 native_buffers_.erase(client_id);
116 pending_buffers_.erase(client_id); 115 pending_buffers_.erase(client_id);
117 } 116 }
(...skipping 10 matching lines...) Expand all
128 gpu::SyncToken()); 127 gpu::SyncToken());
129 std::move(callback).Run(gfx::GpuMemoryBufferHandle()); 128 std::move(callback).Run(gfx::GpuMemoryBufferHandle());
130 return; 129 return;
131 } 130 }
132 if (!handle.is_null()) 131 if (!handle.is_null())
133 native_buffers_[client_id].insert(handle.id); 132 native_buffers_[client_id].insert(handle.id);
134 std::move(callback).Run(handle); 133 std::move(callback).Run(handle);
135 } 134 }
136 135
137 void ServerGpuMemoryBufferManager::SignalOnGpuMemoryBufferAllocated( 136 void ServerGpuMemoryBufferManager::SignalOnGpuMemoryBufferAllocated(
138 gfx::GpuMemoryBufferHandle* handle, 137 std::unique_ptr<gfx::GpuMemoryBuffer>* buffer,
139 base::WaitableEvent* wait_event, 138 base::WaitableEvent* wait_event,
140 const gfx::GpuMemoryBufferHandle& allocated_handle) { 139 const gfx::Size& size,
141 *handle = allocated_handle; 140 gfx::BufferFormat format,
141 gfx::BufferUsage usage,
142 const gfx::GpuMemoryBufferHandle& handle) {
143 if (!handle.is_null()) {
144 *buffer = gpu::GpuMemoryBufferImpl::CreateFromHandle(
145 handle, size, format, usage,
146 base::Bind(&ServerGpuMemoryBufferManager::DestroyGpuMemoryBuffer, this,
147 handle.id, client_id_));
148 }
142 wait_event->Signal(); 149 wait_event->Signal();
143 } 150 }
144 151
145 } // namespace viz 152 } // namespace viz
OLDNEW
« no previous file with comments | « components/viz/common/server_gpu_memory_buffer_manager.h ('k') | content/browser/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698