1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/viz/service/display/display_compositor_memory_and_task_controller.h"
6 
7 #include <utility>
8 
9 #include "base/bind.h"
10 #include "base/synchronization/waitable_event.h"
11 #include "components/viz/service/display_embedder/skia_output_surface_dependency.h"
12 #include "gpu/ipc/scheduler_sequence.h"
13 #include "gpu/ipc/shared_image_interface_in_process.h"
14 
15 namespace viz {
16 
17 DisplayCompositorMemoryAndTaskController::
DisplayCompositorMemoryAndTaskController(std::unique_ptr<SkiaOutputSurfaceDependency> skia_dependency)18     DisplayCompositorMemoryAndTaskController(
19         std::unique_ptr<SkiaOutputSurfaceDependency> skia_dependency)
20     : skia_dependency_(std::move(skia_dependency)),
21       gpu_task_scheduler_(std::make_unique<gpu::GpuTaskSchedulerHelper>(
22           skia_dependency_->CreateSequence())) {
23   DCHECK(gpu_task_scheduler_);
24   base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
25                             base::WaitableEvent::InitialState::NOT_SIGNALED);
26   auto callback = base::BindOnce(
27       &DisplayCompositorMemoryAndTaskController::InitializeOnGpuSkia,
28       base::Unretained(this), skia_dependency_.get(), &event);
29   gpu_task_scheduler_->ScheduleGpuTask(std::move(callback), {});
30   event.Wait();
31 
32   shared_image_interface_ =
33       std::make_unique<gpu::SharedImageInterfaceInProcess>(
34           gpu_task_scheduler_->GetTaskSequence(), controller_on_gpu_.get(),
35           nullptr /* command_buffer_helper*/);
36 }
37 
38 DisplayCompositorMemoryAndTaskController::
DisplayCompositorMemoryAndTaskController(gpu::CommandBufferTaskExecutor * task_executor,gpu::ImageFactory * image_factory)39     DisplayCompositorMemoryAndTaskController(
40         gpu::CommandBufferTaskExecutor* task_executor,
41         gpu::ImageFactory* image_factory)
42     : gpu_task_scheduler_(
43           std::make_unique<gpu::GpuTaskSchedulerHelper>(task_executor)) {
44   DCHECK(gpu_task_scheduler_);
45   base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
46                             base::WaitableEvent::InitialState::NOT_SIGNALED);
47   auto callback = base::BindOnce(
48       &DisplayCompositorMemoryAndTaskController::InitializeOnGpuGL,
49       base::Unretained(this), task_executor, image_factory, &event);
50   gpu_task_scheduler_->GetTaskSequence()->ScheduleTask(std::move(callback), {});
51   event.Wait();
52 
53   // TODO(weiliangc): Move VizProcessContextProvider initialization here to take
54   // ownership of the shared image interface.
55 }
56 
57 DisplayCompositorMemoryAndTaskController::
~DisplayCompositorMemoryAndTaskController()58     ~DisplayCompositorMemoryAndTaskController() {
59   gpu::ScopedAllowScheduleGpuTask allow_schedule_gpu_task;
60   // Make sure to destroy the SharedImageInterfaceInProcess before getting rid
61   // of data structures on the gpu thread.
62   shared_image_interface_.reset();
63 
64   // If we have a |gpu_task_scheduler_|, we must have started initializing
65   // a |controller_on_gpu_| on the |gpu_task_scheduler_|.
66   base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
67                             base::WaitableEvent::InitialState::NOT_SIGNALED);
68   auto callback =
69       base::BindOnce(&DisplayCompositorMemoryAndTaskController::DestroyOnGpu,
70                      base::Unretained(this), &event);
71   gpu_task_scheduler_->GetTaskSequence()->ScheduleTask(std::move(callback), {});
72   event.Wait();
73 }
74 
InitializeOnGpuSkia(SkiaOutputSurfaceDependency * skia_dependency,base::WaitableEvent * event)75 void DisplayCompositorMemoryAndTaskController::InitializeOnGpuSkia(
76     SkiaOutputSurfaceDependency* skia_dependency,
77     base::WaitableEvent* event) {
78   DCHECK(event);
79   controller_on_gpu_ =
80       std::make_unique<gpu::DisplayCompositorMemoryAndTaskControllerOnGpu>(
81           skia_dependency->GetSharedContextState(),
82           skia_dependency->GetMailboxManager(),
83           skia_dependency->GetGpuImageFactory(),
84           skia_dependency->GetSharedImageManager(),
85           skia_dependency->GetSyncPointManager(),
86           skia_dependency->GetGpuPreferences(),
87           skia_dependency->GetGpuDriverBugWorkarounds(),
88           skia_dependency->GetGpuFeatureInfo());
89   event->Signal();
90 }
91 
InitializeOnGpuGL(gpu::CommandBufferTaskExecutor * task_executor,gpu::ImageFactory * image_factory,base::WaitableEvent * event)92 void DisplayCompositorMemoryAndTaskController::InitializeOnGpuGL(
93     gpu::CommandBufferTaskExecutor* task_executor,
94     gpu::ImageFactory* image_factory,
95     base::WaitableEvent* event) {
96   DCHECK(event);
97   controller_on_gpu_ =
98       std::make_unique<gpu::DisplayCompositorMemoryAndTaskControllerOnGpu>(
99           task_executor, image_factory);
100   event->Signal();
101 }
102 
DestroyOnGpu(base::WaitableEvent * event)103 void DisplayCompositorMemoryAndTaskController::DestroyOnGpu(
104     base::WaitableEvent* event) {
105   DCHECK(event);
106   controller_on_gpu_.reset();
107   event->Signal();
108 }
109 
110 gpu::SharedImageInterface*
shared_image_interface()111 DisplayCompositorMemoryAndTaskController::shared_image_interface() {
112   return shared_image_interface_.get();
113 }
114 }  // namespace viz
115