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

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

Issue 540443002: Enable sync allocation of GpuMemoryBuffers from the browser process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_channel_host_factory.h" 5 #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/synchronization/waitable_event.h" 9 #include "base/synchronization/waitable_event.h"
10 #include "base/threading/thread_restrictions.h" 10 #include "base/threading/thread_restrictions.h"
11 #include "content/browser/gpu/gpu_data_manager_impl.h" 11 #include "content/browser/gpu/gpu_data_manager_impl.h"
12 #include "content/browser/gpu/gpu_memory_buffer_factory_host_impl.h"
12 #include "content/browser/gpu/gpu_process_host.h" 13 #include "content/browser/gpu/gpu_process_host.h"
13 #include "content/browser/gpu/gpu_surface_tracker.h" 14 #include "content/browser/gpu/gpu_surface_tracker.h"
14 #include "content/common/child_process_host_impl.h" 15 #include "content/common/child_process_host_impl.h"
15 #include "content/common/gpu/client/gpu_memory_buffer_impl.h" 16 #include "content/common/gpu/client/gpu_memory_buffer_impl.h"
16 #include "content/common/gpu/gpu_messages.h" 17 #include "content/common/gpu/gpu_messages.h"
17 #include "content/public/browser/browser_thread.h" 18 #include "content/public/browser/browser_thread.h"
18 #include "content/public/browser/gpu_data_manager.h" 19 #include "content/public/browser/gpu_data_manager.h"
19 #include "content/public/common/content_client.h" 20 #include "content/public/common/content_client.h"
20 #include "ipc/ipc_channel_handle.h" 21 #include "ipc/ipc_channel_handle.h"
21 #include "ipc/ipc_forwarding_message_filter.h" 22 #include "ipc/ipc_forwarding_message_filter.h"
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 225
225 void BrowserGpuChannelHostFactory::Terminate() { 226 void BrowserGpuChannelHostFactory::Terminate() {
226 DCHECK(instance_); 227 DCHECK(instance_);
227 delete instance_; 228 delete instance_;
228 instance_ = NULL; 229 instance_ = NULL;
229 } 230 }
230 231
231 BrowserGpuChannelHostFactory::BrowserGpuChannelHostFactory() 232 BrowserGpuChannelHostFactory::BrowserGpuChannelHostFactory()
232 : gpu_client_id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()), 233 : gpu_client_id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()),
233 shutdown_event_(new base::WaitableEvent(true, false)), 234 shutdown_event_(new base::WaitableEvent(true, false)),
234 gpu_host_id_(0), 235 gpu_memory_buffer_factory_host_(new GpuMemoryBufferFactoryHostImpl),
235 next_create_gpu_memory_buffer_request_id_(0) { 236 gpu_host_id_(0) {
236 } 237 }
237 238
238 BrowserGpuChannelHostFactory::~BrowserGpuChannelHostFactory() { 239 BrowserGpuChannelHostFactory::~BrowserGpuChannelHostFactory() {
239 DCHECK(IsMainThread()); 240 DCHECK(IsMainThread());
240 if (pending_request_.get()) 241 if (pending_request_.get())
241 pending_request_->Cancel(); 242 pending_request_->Cancel();
242 for (size_t n = 0; n < established_callbacks_.size(); n++) 243 for (size_t n = 0; n < established_callbacks_.size(); n++)
243 established_callbacks_[n].Run(); 244 established_callbacks_[n].Run();
244 shutdown_event_->Signal(); 245 shutdown_event_->Signal();
245 } 246 }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 if (pending_request_->channel_handle().name.empty()) { 364 if (pending_request_->channel_handle().name.empty()) {
364 DCHECK(!gpu_channel_.get()); 365 DCHECK(!gpu_channel_.get());
365 } else { 366 } else {
366 GetContentClient()->SetGpuInfo(pending_request_->gpu_info()); 367 GetContentClient()->SetGpuInfo(pending_request_->gpu_info());
367 gpu_channel_ = GpuChannelHost::Create(this, 368 gpu_channel_ = GpuChannelHost::Create(this,
368 pending_request_->gpu_info(), 369 pending_request_->gpu_info(),
369 pending_request_->channel_handle(), 370 pending_request_->channel_handle(),
370 shutdown_event_.get()); 371 shutdown_event_.get());
371 } 372 }
372 gpu_host_id_ = pending_request_->gpu_host_id(); 373 gpu_host_id_ = pending_request_->gpu_host_id();
374 gpu_memory_buffer_factory_host_->set_gpu_host_id(gpu_host_id_);
373 pending_request_ = NULL; 375 pending_request_ = NULL;
374 376
375 for (size_t n = 0; n < established_callbacks_.size(); n++) 377 for (size_t n = 0; n < established_callbacks_.size(); n++)
376 established_callbacks_[n].Run(); 378 established_callbacks_[n].Run();
377 379
378 established_callbacks_.clear(); 380 established_callbacks_.clear();
379 } 381 }
380 382
381 scoped_ptr<gfx::GpuMemoryBuffer> 383 scoped_ptr<gfx::GpuMemoryBuffer>
382 BrowserGpuChannelHostFactory::AllocateGpuMemoryBuffer(size_t width, 384 BrowserGpuChannelHostFactory::AllocateGpuMemoryBuffer(size_t width,
(...skipping 19 matching lines...) Expand all
402 void BrowserGpuChannelHostFactory::DeleteGpuMemoryBuffer( 404 void BrowserGpuChannelHostFactory::DeleteGpuMemoryBuffer(
403 scoped_ptr<gfx::GpuMemoryBuffer> buffer) { 405 scoped_ptr<gfx::GpuMemoryBuffer> buffer) {
404 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO)); 406 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::IO));
405 407
406 GetIOLoopProxy()->PostTask( 408 GetIOLoopProxy()->PostTask(
407 FROM_HERE, 409 FROM_HERE,
408 base::Bind(&BrowserGpuChannelHostFactory::DeleteGpuMemoryBufferOnIO, 410 base::Bind(&BrowserGpuChannelHostFactory::DeleteGpuMemoryBufferOnIO,
409 base::Passed(&buffer))); 411 base::Passed(&buffer)));
410 } 412 }
411 413
412 void BrowserGpuChannelHostFactory::CreateGpuMemoryBuffer(
413 const gfx::GpuMemoryBufferHandle& handle,
414 const gfx::Size& size,
415 unsigned internalformat,
416 unsigned usage,
417 const CreateGpuMemoryBufferCallback& callback) {
418 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
419
420 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_);
421 if (!host) {
422 callback.Run(gfx::GpuMemoryBufferHandle());
423 return;
424 }
425
426 uint32 request_id = next_create_gpu_memory_buffer_request_id_++;
427 create_gpu_memory_buffer_requests_[request_id] = callback;
428
429 host->CreateGpuMemoryBuffer(
430 handle,
431 size,
432 internalformat,
433 usage,
434 base::Bind(&BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated,
435 base::Unretained(this),
436 request_id));
437 }
438
439 void BrowserGpuChannelHostFactory::DestroyGpuMemoryBuffer(
440 const gfx::GpuMemoryBufferHandle& handle,
441 int32 sync_point) {
442 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
443
444 GpuProcessHost* host = GpuProcessHost::FromID(gpu_host_id_);
445 if (!host)
446 return;
447
448 host->DestroyGpuMemoryBuffer(handle, sync_point);
449 }
450
451 // static 414 // static
452 void BrowserGpuChannelHostFactory::AddFilterOnIO( 415 void BrowserGpuChannelHostFactory::AddFilterOnIO(
453 int host_id, 416 int host_id,
454 scoped_refptr<IPC::MessageFilter> filter) { 417 scoped_refptr<IPC::MessageFilter> filter) {
455 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 418 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
456 419
457 GpuProcessHost* host = GpuProcessHost::FromID(host_id); 420 GpuProcessHost* host = GpuProcessHost::FromID(host_id);
458 if (host) 421 if (host)
459 host->AddFilter(filter.get()); 422 host->AddFilter(filter.get());
460 } 423 }
(...skipping 24 matching lines...) Expand all
485 // static 448 // static
486 void BrowserGpuChannelHostFactory::AllocateGpuMemoryBufferOnIO( 449 void BrowserGpuChannelHostFactory::AllocateGpuMemoryBufferOnIO(
487 AllocateGpuMemoryBufferRequest* request) { 450 AllocateGpuMemoryBufferRequest* request) {
488 if (!GpuMemoryBufferImpl::IsFormatValid(request->internalformat) || 451 if (!GpuMemoryBufferImpl::IsFormatValid(request->internalformat) ||
489 !GpuMemoryBufferImpl::IsUsageValid(request->usage)) { 452 !GpuMemoryBufferImpl::IsUsageValid(request->usage)) {
490 request->result = scoped_ptr<gfx::GpuMemoryBuffer>(); 453 request->result = scoped_ptr<gfx::GpuMemoryBuffer>();
491 request->event.Signal(); 454 request->event.Signal();
492 return; 455 return;
493 } 456 }
494 457
495 request->result = GpuMemoryBufferImpl::Create( 458 GpuMemoryBufferImpl::Create(
496 gfx::Size(request->width, request->height), 459 gfx::Size(request->width, request->height),
497 request->internalformat, 460 request->internalformat,
498 request->usage).PassAs<gfx::GpuMemoryBuffer>(); 461 request->usage,
499 request->event.Signal(); 462 base::Bind(&BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated,
463 base::Unretained(request)));
500 } 464 }
501 465
502 // static 466 // static
503 void BrowserGpuChannelHostFactory::DeleteGpuMemoryBufferOnIO( 467 void BrowserGpuChannelHostFactory::DeleteGpuMemoryBufferOnIO(
504 scoped_ptr<gfx::GpuMemoryBuffer> buffer) { 468 scoped_ptr<gfx::GpuMemoryBuffer> buffer) {
505 } 469 }
506 470
471 // static
507 void BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated( 472 void BrowserGpuChannelHostFactory::OnGpuMemoryBufferCreated(
508 uint32 request_id, 473 AllocateGpuMemoryBufferRequest* request,
509 const gfx::GpuMemoryBufferHandle& handle) { 474 scoped_ptr<GpuMemoryBufferImpl> buffer) {
510 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 475 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
511 476
512 CreateGpuMemoryBufferCallbackMap::iterator iter = 477 request->result = buffer.PassAs<gfx::GpuMemoryBuffer>();
513 create_gpu_memory_buffer_requests_.find(request_id); 478 request->event.Signal();
514 DCHECK(iter != create_gpu_memory_buffer_requests_.end());
515 iter->second.Run(handle);
516 create_gpu_memory_buffer_requests_.erase(iter);
517 } 479 }
518 480
519 } // namespace content 481 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/gpu/browser_gpu_channel_host_factory.h ('k') | content/browser/gpu/gpu_memory_buffer_factory_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698