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