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

Side by Side Diff: content/browser/gpu/browser_gpu_memory_buffer_manager.cc

Issue 2572703004: exo: Directly create GpuMemoryBufferImpl when a handle is available. (Closed)
Patch Set: null callback Created 4 years 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "content/browser/gpu/browser_gpu_memory_buffer_manager.h" 5 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 ~CreateGpuMemoryBufferRequest() {} 71 ~CreateGpuMemoryBufferRequest() {}
72 base::WaitableEvent event; 72 base::WaitableEvent event;
73 gfx::Size size; 73 gfx::Size size;
74 gfx::BufferFormat format; 74 gfx::BufferFormat format;
75 gfx::BufferUsage usage; 75 gfx::BufferUsage usage;
76 int client_id; 76 int client_id;
77 gpu::SurfaceHandle surface_handle; 77 gpu::SurfaceHandle surface_handle;
78 std::unique_ptr<gfx::GpuMemoryBuffer> result; 78 std::unique_ptr<gfx::GpuMemoryBuffer> result;
79 }; 79 };
80 80
81 struct BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandleRequest
82 : public CreateGpuMemoryBufferRequest {
83 CreateGpuMemoryBufferFromHandleRequest(
84 const gfx::GpuMemoryBufferHandle& handle,
85 const gfx::Size& size,
86 gfx::BufferFormat format,
87 int client_id)
88 : CreateGpuMemoryBufferRequest(size,
89 format,
90 gfx::BufferUsage::GPU_READ,
91 client_id,
92 gpu::kNullSurfaceHandle),
93 handle(handle) {}
94 ~CreateGpuMemoryBufferFromHandleRequest() {}
95 gfx::GpuMemoryBufferHandle handle;
96 };
97
98 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager( 81 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager(
99 int gpu_client_id, 82 int gpu_client_id,
100 uint64_t gpu_client_tracing_id) 83 uint64_t gpu_client_tracing_id)
101 : native_configurations_(gpu::GetNativeGpuMemoryBufferConfigurations()), 84 : native_configurations_(gpu::GetNativeGpuMemoryBufferConfigurations()),
102 gpu_client_id_(gpu_client_id), 85 gpu_client_id_(gpu_client_id),
103 gpu_client_tracing_id_(gpu_client_tracing_id), 86 gpu_client_tracing_id_(gpu_client_tracing_id),
104 gpu_host_id_(0) { 87 gpu_host_id_(0) {
105 DCHECK(!g_gpu_memory_buffer_manager); 88 DCHECK(!g_gpu_memory_buffer_manager);
106 g_gpu_memory_buffer_manager = this; 89 g_gpu_memory_buffer_manager = this;
107 } 90 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 130
148 std::unique_ptr<gfx::GpuMemoryBuffer> 131 std::unique_ptr<gfx::GpuMemoryBuffer>
149 BrowserGpuMemoryBufferManager::CreateGpuMemoryBuffer( 132 BrowserGpuMemoryBufferManager::CreateGpuMemoryBuffer(
150 const gfx::Size& size, 133 const gfx::Size& size,
151 gfx::BufferFormat format, 134 gfx::BufferFormat format,
152 gfx::BufferUsage usage, 135 gfx::BufferUsage usage,
153 gpu::SurfaceHandle surface_handle) { 136 gpu::SurfaceHandle surface_handle) {
154 return AllocateGpuMemoryBufferForSurface(size, format, usage, surface_handle); 137 return AllocateGpuMemoryBufferForSurface(size, format, usage, surface_handle);
155 } 138 }
156 139
157 std::unique_ptr<gfx::GpuMemoryBuffer>
158 BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle(
159 const gfx::GpuMemoryBufferHandle& handle,
160 const gfx::Size& size,
161 gfx::BufferFormat format) {
162 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
163
164 CreateGpuMemoryBufferFromHandleRequest request(handle, size, format,
165 gpu_client_id_);
166 BrowserThread::PostTask(
167 BrowserThread::IO, FROM_HERE,
168 base::Bind(&BrowserGpuMemoryBufferManager::
169 HandleCreateGpuMemoryBufferFromHandleOnIO,
170 base::Unretained(this), // Safe as we wait for result below.
171 base::Unretained(&request)));
172
173 // We're blocking the UI thread, which is generally undesirable.
174 TRACE_EVENT0(
175 "browser",
176 "BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromHandle");
177 base::ThreadRestrictions::ScopedAllowWait allow_wait;
178 request.event.Wait();
179 return std::move(request.result);
180 }
181
182 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess( 140 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess(
183 gfx::GpuMemoryBufferId id, 141 gfx::GpuMemoryBufferId id,
184 const gfx::Size& size, 142 const gfx::Size& size,
185 gfx::BufferFormat format, 143 gfx::BufferFormat format,
186 gfx::BufferUsage usage, 144 gfx::BufferUsage usage,
187 int child_client_id, 145 int child_client_id,
188 const AllocationCallback& callback) { 146 const AllocationCallback& callback) {
189 DCHECK_CURRENTLY_ON(BrowserThread::IO); 147 DCHECK_CURRENTLY_ON(BrowserThread::IO);
190 148
191 // Use service side allocation for native configurations. 149 // Use service side allocation for native configurations.
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 request->result = gpu::GpuMemoryBufferImplSharedMemory::Create( 329 request->result = gpu::GpuMemoryBufferImplSharedMemory::Create(
372 new_id, request->size, request->format, 330 new_id, request->size, request->format,
373 base::Bind( 331 base::Bind(
374 &GpuMemoryBufferDeleted, 332 &GpuMemoryBufferDeleted,
375 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO), 333 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO),
376 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, 334 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO,
377 base::Unretained(this), new_id, request->client_id))); 335 base::Unretained(this), new_id, request->client_id)));
378 request->event.Signal(); 336 request->event.Signal();
379 } 337 }
380 338
381 void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromHandleOnIO(
382 CreateGpuMemoryBufferFromHandleRequest* request) {
383 DCHECK_CURRENTLY_ON(BrowserThread::IO);
384
385 gfx::GpuMemoryBufferId new_id = content::GetNextGenericSharedMemoryId();
386
387 BufferMap& buffers = clients_[request->client_id];
388 auto insert_result = buffers.insert(std::make_pair(
389 new_id, BufferInfo(request->size, request->handle.type,
390 request->format, request->usage, 0)));
391 DCHECK(insert_result.second);
392
393 gfx::GpuMemoryBufferHandle handle = request->handle;
394 handle.id = new_id;
395
396 // Note: Unretained is safe as IO thread is stopped before manager is
397 // destroyed.
398 request->result = gpu::GpuMemoryBufferImpl::CreateFromHandle(
399 handle, request->size, request->format, request->usage,
400 base::Bind(
401 &GpuMemoryBufferDeleted,
402 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO),
403 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO,
404 base::Unretained(this), new_id, request->client_id)));
405 request->event.Signal();
406 }
407
408 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( 339 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO(
409 CreateGpuMemoryBufferRequest* request, 340 CreateGpuMemoryBufferRequest* request,
410 const gfx::GpuMemoryBufferHandle& handle) { 341 const gfx::GpuMemoryBufferHandle& handle) {
411 DCHECK_CURRENTLY_ON(BrowserThread::IO); 342 DCHECK_CURRENTLY_ON(BrowserThread::IO);
412 343
413 // Early out if factory failed to create the buffer. 344 // Early out if factory failed to create the buffer.
414 if (handle.is_null()) { 345 if (handle.is_null()) {
415 request->event.Signal(); 346 request->event.Signal();
416 return; 347 return;
417 } 348 }
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 format(format), 537 format(format),
607 usage(usage), 538 usage(usage),
608 gpu_host_id(gpu_host_id) {} 539 gpu_host_id(gpu_host_id) {}
609 540
610 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) = 541 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) =
611 default; 542 default;
612 543
613 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {} 544 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {}
614 545
615 } // namespace content 546 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/gpu/browser_gpu_memory_buffer_manager.h ('k') | content/child/child_gpu_memory_buffer_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698