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

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

Issue 1975023002: Add GpuMemoryBuffer CreateFromClientId interface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Just the interface Created 4 years, 7 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
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 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 : CreateGpuMemoryBufferRequest(size, 161 : CreateGpuMemoryBufferRequest(size,
162 format, 162 format,
163 gfx::BufferUsage::GPU_READ, 163 gfx::BufferUsage::GPU_READ,
164 client_id, 164 client_id,
165 gpu::kNullSurfaceHandle), 165 gpu::kNullSurfaceHandle),
166 handle(handle) {} 166 handle(handle) {}
167 ~CreateGpuMemoryBufferFromHandleRequest() {} 167 ~CreateGpuMemoryBufferFromHandleRequest() {}
168 gfx::GpuMemoryBufferHandle handle; 168 gfx::GpuMemoryBufferHandle handle;
169 }; 169 };
170 170
171 struct BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromClientIdRequest
172 : public CreateGpuMemoryBufferRequest {
173 CreateGpuMemoryBufferFromClientIdRequest(
174 int client_id,
175 const gfx::GpuMemoryBufferId& gpu_memory_buffer_id)
176 : CreateGpuMemoryBufferRequest(gfx::Size(),
177 gfx::BufferFormat::RGBA_8888,
178 gfx::BufferUsage::GPU_READ,
179 client_id,
180 gpu::kNullSurfaceHandle),
181 gpu_memory_buffer_id(gpu_memory_buffer_id) {}
182 ~CreateGpuMemoryBufferFromClientIdRequest() {}
183 gfx::GpuMemoryBufferId gpu_memory_buffer_id;
184 };
185
171 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager( 186 BrowserGpuMemoryBufferManager::BrowserGpuMemoryBufferManager(
172 int gpu_client_id, 187 int gpu_client_id,
173 uint64_t gpu_client_tracing_id) 188 uint64_t gpu_client_tracing_id)
174 : native_configurations_(GetNativeGpuMemoryBufferConfigurations()), 189 : native_configurations_(GetNativeGpuMemoryBufferConfigurations()),
175 gpu_client_id_(gpu_client_id), 190 gpu_client_id_(gpu_client_id),
176 gpu_client_tracing_id_(gpu_client_tracing_id), 191 gpu_client_tracing_id_(gpu_client_tracing_id),
177 gpu_host_id_(0) { 192 gpu_host_id_(0) {
178 DCHECK(!g_gpu_memory_buffer_manager); 193 DCHECK(!g_gpu_memory_buffer_manager);
179 g_gpu_memory_buffer_manager = this; 194 g_gpu_memory_buffer_manager = this;
180 } 195 }
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 DLOG(ERROR) << "Child process attempted to allocate a GpuMemoryBuffer with " 320 DLOG(ERROR) << "Child process attempted to allocate a GpuMemoryBuffer with "
306 "an existing ID."; 321 "an existing ID.";
307 callback.Run(gfx::GpuMemoryBufferHandle()); 322 callback.Run(gfx::GpuMemoryBufferHandle());
308 return; 323 return;
309 } 324 }
310 325
311 callback.Run(gpu::GpuMemoryBufferImplSharedMemory::AllocateForChildProcess( 326 callback.Run(gpu::GpuMemoryBufferImplSharedMemory::AllocateForChildProcess(
312 id, size, format, child_process_handle)); 327 id, size, format, child_process_handle));
313 } 328 }
314 329
330 std::unique_ptr<gfx::GpuMemoryBuffer>
331 BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromClientId(
332 int client_id,
333 const gfx::GpuMemoryBufferId& gpu_memory_buffer_id) {
334 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
335
336 CreateGpuMemoryBufferFromClientIdRequest request(client_id,
337 gpu_memory_buffer_id);
338 BrowserThread::PostTask(
339 BrowserThread::IO, FROM_HERE,
340 base::Bind(&BrowserGpuMemoryBufferManager::
341 HandleCreateGpuMemoryBufferFromClientIdOnIO,
342 base::Unretained(this), // Safe as we wait for result below.
343 base::Unretained(&request)));
344
345 // We're blocking the UI thread, which is generally undesirable.
346 TRACE_EVENT0(
347 "browser",
348 "BrowserGpuMemoryBufferManager::CreateGpuMemoryBufferFromClientId");
349 base::ThreadRestrictions::ScopedAllowWait allow_wait;
350 request.event.Wait();
351 return std::move(request.result);
352 }
353
315 gfx::GpuMemoryBuffer* 354 gfx::GpuMemoryBuffer*
316 BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( 355 BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer(
317 ClientBuffer buffer) { 356 ClientBuffer buffer) {
318 return gpu::GpuMemoryBufferImpl::FromClientBuffer(buffer); 357 return gpu::GpuMemoryBufferImpl::FromClientBuffer(buffer);
319 } 358 }
320 359
321 void BrowserGpuMemoryBufferManager::SetDestructionSyncToken( 360 void BrowserGpuMemoryBufferManager::SetDestructionSyncToken(
322 gfx::GpuMemoryBuffer* buffer, 361 gfx::GpuMemoryBuffer* buffer,
323 const gpu::SyncToken& sync_token) { 362 const gpu::SyncToken& sync_token) {
324 static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token( 363 static_cast<gpu::GpuMemoryBufferImpl*>(buffer)->set_destruction_sync_token(
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 request->result = gpu::GpuMemoryBufferImplSharedMemory::CreateFromHandle( 566 request->result = gpu::GpuMemoryBufferImplSharedMemory::CreateFromHandle(
528 handle, request->size, request->format, request->usage, 567 handle, request->size, request->format, request->usage,
529 base::Bind( 568 base::Bind(
530 &GpuMemoryBufferDeleted, 569 &GpuMemoryBufferDeleted,
531 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), 570 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO),
532 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO, 571 base::Bind(&BrowserGpuMemoryBufferManager::DestroyGpuMemoryBufferOnIO,
533 base::Unretained(this), new_id, request->client_id))); 572 base::Unretained(this), new_id, request->client_id)));
534 request->event.Signal(); 573 request->event.Signal();
535 } 574 }
536 575
576 void BrowserGpuMemoryBufferManager::HandleCreateGpuMemoryBufferFromClientIdOnIO(
577 CreateGpuMemoryBufferFromClientIdRequest* request) {
578 DCHECK_CURRENTLY_ON(BrowserThread::IO);
579
580 // This must be robust to renderer processes specifying invalid ids or the
581 // client being removed.
582 ClientMap::iterator client_it = clients_.find(request->client_id);
583 if (client_it == clients_.end()) {
584 LOG(ERROR) << "CreateGpuMemoryBufferFromClientId: invalid client.";
585 request->event.Signal();
586 return;
587 }
588 BufferMap& buffers = client_it->second;
589 BufferMap::iterator buffer_it = buffers.find(request->gpu_memory_buffer_id);
590 if (buffer_it == buffers.end()) {
591 LOG(ERROR) << "CreateGpuMemoryBufferFromClientId: invalid id.";
592 request->event.Signal();
593 return;
594 }
595
596 // TODO(ccameron): Implement this.
597 NOTIMPLEMENTED();
598 request->event.Signal();
599 }
600
537 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO( 601 void BrowserGpuMemoryBufferManager::HandleGpuMemoryBufferCreatedOnIO(
538 CreateGpuMemoryBufferRequest* request, 602 CreateGpuMemoryBufferRequest* request,
539 const gfx::GpuMemoryBufferHandle& handle) { 603 const gfx::GpuMemoryBufferHandle& handle) {
540 DCHECK_CURRENTLY_ON(BrowserThread::IO); 604 DCHECK_CURRENTLY_ON(BrowserThread::IO);
541 605
542 // Early out if factory failed to create the buffer. 606 // Early out if factory failed to create the buffer.
543 if (handle.is_null()) { 607 if (handle.is_null()) {
544 request->event.Signal(); 608 request->event.Signal();
545 return; 609 return;
546 } 610 }
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 // The gpu_client uses a fixed tracing ID. 780 // The gpu_client uses a fixed tracing ID.
717 return gpu_client_tracing_id_; 781 return gpu_client_tracing_id_;
718 } 782 }
719 783
720 // In normal cases, |client_id| is a child process id, so we can perform 784 // In normal cases, |client_id| is a child process id, so we can perform
721 // the standard conversion. 785 // the standard conversion.
722 return ChildProcessHostImpl::ChildProcessUniqueIdToTracingProcessId( 786 return ChildProcessHostImpl::ChildProcessUniqueIdToTracingProcessId(
723 client_id); 787 client_id);
724 } 788 }
725 789
790 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo() = default;
791
792 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(
793 const gfx::Size& size,
794 gfx::GpuMemoryBufferType type,
795 gfx::BufferFormat format,
796 gfx::BufferUsage usage,
797 int gpu_host_id)
798 : size(size),
799 type(type),
800 format(format),
801 usage(usage),
802 gpu_host_id(gpu_host_id) {}
803
804 BrowserGpuMemoryBufferManager::BufferInfo::BufferInfo(const BufferInfo& other) =
805 default;
806
807 BrowserGpuMemoryBufferManager::BufferInfo::~BufferInfo() {}
808
726 } // namespace content 809 } // 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