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

Side by Side Diff: content/browser/compositor/gpu_process_transport_factory.cc

Issue 2286273003: Make cc::Display not own its BeginFrameSource (Closed)
Patch Set: Created 4 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 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/compositor/gpu_process_transport_factory.h" 5 #include "content/browser/compositor/gpu_process_transport_factory.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 } 158 }
159 #endif 159 #endif
160 160
161 } // namespace 161 } // namespace
162 162
163 namespace content { 163 namespace content {
164 164
165 struct GpuProcessTransportFactory::PerCompositorData { 165 struct GpuProcessTransportFactory::PerCompositorData {
166 gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; 166 gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle;
167 BrowserCompositorOutputSurface* display_output_surface = nullptr; 167 BrowserCompositorOutputSurface* display_output_surface = nullptr;
168 cc::SyntheticBeginFrameSource* begin_frame_source = nullptr; 168 std::unique_ptr<cc::SyntheticBeginFrameSource> begin_frame_source;
169 ReflectorImpl* reflector = nullptr; 169 ReflectorImpl* reflector = nullptr;
170 std::unique_ptr<cc::Display> display; 170 std::unique_ptr<cc::Display> display;
171 bool output_is_secure = false; 171 bool output_is_secure = false;
172 gfx::ColorSpace color_space; 172 gfx::ColorSpace color_space;
173 }; 173 };
174 174
175 GpuProcessTransportFactory::GpuProcessTransportFactory() 175 GpuProcessTransportFactory::GpuProcessTransportFactory()
176 : next_surface_client_id_(1u), 176 : next_surface_client_id_(1u),
177 task_graph_runner_(new cc::SingleThreadTaskGraphRunner), 177 task_graph_runner_(new cc::SingleThreadTaskGraphRunner),
178 callback_factory_(this) { 178 callback_factory_(this) {
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 gpu::GpuChannelEstablishedCallback callback( 432 gpu::GpuChannelEstablishedCallback callback(
433 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel, 433 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel,
434 callback_factory_.GetWeakPtr(), compositor, 434 callback_factory_.GetWeakPtr(), compositor,
435 create_gpu_output_surface, num_attempts + 1)); 435 create_gpu_output_surface, num_attempts + 1));
436 DCHECK(gpu_channel_factory_); 436 DCHECK(gpu_channel_factory_);
437 gpu_channel_factory_->EstablishGpuChannel(callback); 437 gpu_channel_factory_->EstablishGpuChannel(callback);
438 return; 438 return;
439 } 439 }
440 } 440 }
441 441
442 std::unique_ptr<cc::SyntheticBeginFrameSource> begin_frame_source;
443 if (!compositor->GetRendererSettings().disable_display_vsync) { 442 if (!compositor->GetRendererSettings().disable_display_vsync) {
444 begin_frame_source.reset(new cc::DelayBasedBeginFrameSource( 443 data->begin_frame_source.reset(new cc::DelayBasedBeginFrameSource(
danakj 2016/08/30 01:10:56 I don't think you should put this into |data| unti
445 base::MakeUnique<cc::DelayBasedTimeSource>( 444 base::MakeUnique<cc::DelayBasedTimeSource>(
446 compositor->task_runner().get()))); 445 compositor->task_runner().get())));
447 } else { 446 } else {
448 begin_frame_source.reset(new cc::BackToBackBeginFrameSource( 447 data->begin_frame_source.reset(new cc::BackToBackBeginFrameSource(
449 base::MakeUnique<cc::DelayBasedTimeSource>( 448 base::MakeUnique<cc::DelayBasedTimeSource>(
450 compositor->task_runner().get()))); 449 compositor->task_runner().get())));
451 } 450 }
452 451
453 std::unique_ptr<BrowserCompositorOutputSurface> display_output_surface; 452 std::unique_ptr<BrowserCompositorOutputSurface> display_output_surface;
454 #if defined(ENABLE_VULKAN) 453 #if defined(ENABLE_VULKAN)
455 std::unique_ptr<VulkanBrowserCompositorOutputSurface> vulkan_surface; 454 std::unique_ptr<VulkanBrowserCompositorOutputSurface> vulkan_surface;
456 if (vulkan_context_provider) { 455 if (vulkan_context_provider) {
457 vulkan_surface.reset(new VulkanBrowserCompositorOutputSurface( 456 vulkan_surface.reset(new VulkanBrowserCompositorOutputSurface(
458 vulkan_context_provider, compositor->vsync_manager(), 457 vulkan_context_provider, compositor->vsync_manager(),
459 compositor->task_runner().get())); 458 compositor->task_runner().get()));
460 if (!vulkan_surface->Initialize(compositor.get()->widget())) { 459 if (!vulkan_surface->Initialize(compositor.get()->widget())) {
461 vulkan_surface->Destroy(); 460 vulkan_surface->Destroy();
462 vulkan_surface.reset(); 461 vulkan_surface.reset();
463 } else { 462 } else {
464 display_output_surface = std::move(vulkan_surface); 463 display_output_surface = std::move(vulkan_surface);
465 } 464 }
466 } 465 }
467 #endif 466 #endif
468 467
469 if (!display_output_surface) { 468 if (!display_output_surface) {
470 if (!create_gpu_output_surface) { 469 if (!create_gpu_output_surface) {
471 display_output_surface = 470 display_output_surface =
472 base::WrapUnique(new SoftwareBrowserCompositorOutputSurface( 471 base::WrapUnique(new SoftwareBrowserCompositorOutputSurface(
473 CreateSoftwareOutputDevice(compositor.get()), 472 CreateSoftwareOutputDevice(compositor.get()),
474 compositor->vsync_manager(), begin_frame_source.get())); 473 compositor->vsync_manager(), data->begin_frame_source.get()));
475 } else { 474 } else {
476 DCHECK(context_provider); 475 DCHECK(context_provider);
477 const auto& capabilities = context_provider->ContextCapabilities(); 476 const auto& capabilities = context_provider->ContextCapabilities();
478 if (data->surface_handle == gpu::kNullSurfaceHandle) { 477 if (data->surface_handle == gpu::kNullSurfaceHandle) {
479 display_output_surface = 478 display_output_surface =
480 base::WrapUnique(new OffscreenBrowserCompositorOutputSurface( 479 base::WrapUnique(new OffscreenBrowserCompositorOutputSurface(
481 context_provider, compositor->vsync_manager(), 480 context_provider, compositor->vsync_manager(),
482 begin_frame_source.get(), 481 data->begin_frame_source.get(),
483 std::unique_ptr<display_compositor:: 482 std::unique_ptr<display_compositor::
484 CompositorOverlayCandidateValidator>())); 483 CompositorOverlayCandidateValidator>()));
485 } else if (capabilities.surfaceless) { 484 } else if (capabilities.surfaceless) {
486 #if defined(OS_MACOSX) 485 #if defined(OS_MACOSX)
487 display_output_surface = base::WrapUnique(new GpuOutputSurfaceMac( 486 display_output_surface = base::WrapUnique(new GpuOutputSurfaceMac(
488 context_provider, data->surface_handle, compositor->vsync_manager(), 487 context_provider, data->surface_handle, compositor->vsync_manager(),
489 begin_frame_source.get(), 488 data->begin_frame_source.get(),
490 CreateOverlayCandidateValidator(compositor->widget()), 489 CreateOverlayCandidateValidator(compositor->widget()),
491 GetGpuMemoryBufferManager())); 490 GetGpuMemoryBufferManager()));
492 #else 491 #else
493 display_output_surface = 492 display_output_surface =
494 base::WrapUnique(new GpuSurfacelessBrowserCompositorOutputSurface( 493 base::WrapUnique(new GpuSurfacelessBrowserCompositorOutputSurface(
495 context_provider, data->surface_handle, 494 context_provider, data->surface_handle,
496 compositor->vsync_manager(), begin_frame_source.get(), 495 compositor->vsync_manager(), data->begin_frame_source.get(),
497 CreateOverlayCandidateValidator(compositor->widget()), 496 CreateOverlayCandidateValidator(compositor->widget()),
498 GL_TEXTURE_2D, GL_RGB, ui::DisplaySnapshot::PrimaryFormat(), 497 GL_TEXTURE_2D, GL_RGB, ui::DisplaySnapshot::PrimaryFormat(),
499 GetGpuMemoryBufferManager())); 498 GetGpuMemoryBufferManager()));
500 #endif 499 #endif
501 } else { 500 } else {
502 std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator> 501 std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
503 validator; 502 validator;
504 const bool use_mus = IsUsingMus(); 503 const bool use_mus = IsUsingMus();
505 #if !defined(OS_MACOSX) 504 #if !defined(OS_MACOSX)
506 // Overlays are only supported on surfaceless output surfaces on Mac. 505 // Overlays are only supported on surfaceless output surfaces on Mac.
507 if (!use_mus) 506 if (!use_mus)
508 validator = CreateOverlayCandidateValidator(compositor->widget()); 507 validator = CreateOverlayCandidateValidator(compositor->widget());
509 #endif 508 #endif
510 if (!use_mus) { 509 if (!use_mus) {
511 display_output_surface = 510 display_output_surface =
512 base::WrapUnique(new GpuBrowserCompositorOutputSurface( 511 base::WrapUnique(new GpuBrowserCompositorOutputSurface(
513 context_provider, compositor->vsync_manager(), 512 context_provider, compositor->vsync_manager(),
514 begin_frame_source.get(), std::move(validator))); 513 data->begin_frame_source.get(), std::move(validator)));
515 } else { 514 } else {
516 #if defined(USE_AURA) 515 #if defined(USE_AURA)
517 display_output_surface = 516 display_output_surface =
518 base::WrapUnique(new MusBrowserCompositorOutputSurface( 517 base::WrapUnique(new MusBrowserCompositorOutputSurface(
519 compositor->window(), context_provider, 518 compositor->window(), context_provider,
520 compositor->vsync_manager(), begin_frame_source.get(), 519 compositor->vsync_manager(), data->begin_frame_source.get(),
521 std::move(validator))); 520 std::move(validator)));
522 #else 521 #else
523 NOTREACHED(); 522 NOTREACHED();
524 #endif 523 #endif
525 } 524 }
526 } 525 }
527 } 526 }
528 } 527 }
529 528
530 data->display_output_surface = display_output_surface.get(); 529 data->display_output_surface = display_output_surface.get();
531 data->begin_frame_source = begin_frame_source.get();
532 if (data->reflector) 530 if (data->reflector)
533 data->reflector->OnSourceSurfaceReady(data->display_output_surface); 531 data->reflector->OnSourceSurfaceReady(data->display_output_surface);
534 532
535 #if defined(OS_WIN) 533 #if defined(OS_WIN)
536 gfx::RenderingWindowManager::GetInstance()->DoSetParentOnChild( 534 gfx::RenderingWindowManager::GetInstance()->DoSetParentOnChild(
537 compositor->widget()); 535 compositor->widget());
538 #endif 536 #endif
539 537
540 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( 538 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler(
541 begin_frame_source.get(), compositor->task_runner().get(), 539 data->begin_frame_source.get(), compositor->task_runner().get(),
542 display_output_surface->capabilities().max_frames_pending)); 540 display_output_surface->capabilities().max_frames_pending));
543 541
544 // The Display owns and uses the |display_output_surface| created above. 542 // The Display owns and uses the |display_output_surface| created above.
545 data->display = base::MakeUnique<cc::Display>( 543 data->display = base::MakeUnique<cc::Display>(
danakj 2016/08/30 01:10:56 So just insert it into |data| after this, with a c
546 HostSharedBitmapManager::current(), 544 HostSharedBitmapManager::current(), GetGpuMemoryBufferManager(),
547 GetGpuMemoryBufferManager(), 545 compositor->GetRendererSettings(), data->begin_frame_source.get(),
548 compositor->GetRendererSettings(), std::move(begin_frame_source),
549 std::move(display_output_surface), std::move(scheduler), 546 std::move(display_output_surface), std::move(scheduler),
550 base::MakeUnique<cc::TextureMailboxDeleter>( 547 base::MakeUnique<cc::TextureMailboxDeleter>(
551 compositor->task_runner().get())); 548 compositor->task_runner().get()));
552 549
553 // The |delegated_output_surface| is given back to the compositor, it 550 // The |delegated_output_surface| is given back to the compositor, it
554 // delegates to the Display as its root surface. Importantly, it shares the 551 // delegates to the Display as its root surface. Importantly, it shares the
555 // same ContextProvider as the Display's output surface. 552 // same ContextProvider as the Display's output surface.
556 std::unique_ptr<cc::SurfaceDisplayOutputSurface> delegated_output_surface( 553 std::unique_ptr<cc::SurfaceDisplayOutputSurface> delegated_output_surface(
557 vulkan_context_provider 554 vulkan_context_provider
558 ? new cc::SurfaceDisplayOutputSurface( 555 ? new cc::SurfaceDisplayOutputSurface(
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 shared_vulkan_context_provider_ = 871 shared_vulkan_context_provider_ =
875 cc::VulkanInProcessContextProvider::Create(); 872 cc::VulkanInProcessContextProvider::Create();
876 } 873 }
877 874
878 shared_vulkan_context_provider_initialized_ = true; 875 shared_vulkan_context_provider_initialized_ = true;
879 } 876 }
880 return shared_vulkan_context_provider_; 877 return shared_vulkan_context_provider_;
881 } 878 }
882 879
883 } // namespace content 880 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698