1 // Copyright 2017 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/test/compositor_frame_helpers.h"
6
7 #include <memory>
8 #include <utility>
9
10 namespace viz {
11 namespace {
12
13 constexpr gfx::Rect kDefaultOutputRect(20, 20);
14 constexpr gfx::Rect kDefaultDamageRect(0, 0);
15
16 } // namespace
17
CompositorFrameBuilder()18 CompositorFrameBuilder::CompositorFrameBuilder() {
19 frame_ = MakeInitCompositorFrame();
20 }
21
22 CompositorFrameBuilder::~CompositorFrameBuilder() = default;
23
Build()24 CompositorFrame CompositorFrameBuilder::Build() {
25 CompositorFrame temp_frame(std::move(frame_.value()));
26 frame_ = MakeInitCompositorFrame();
27 return temp_frame;
28 }
29
AddDefaultRenderPass()30 CompositorFrameBuilder& CompositorFrameBuilder::AddDefaultRenderPass() {
31 return AddRenderPass(kDefaultOutputRect, kDefaultDamageRect);
32 }
33
AddRenderPass(const gfx::Rect & output_rect,const gfx::Rect & damage_rect)34 CompositorFrameBuilder& CompositorFrameBuilder::AddRenderPass(
35 const gfx::Rect& output_rect,
36 const gfx::Rect& damage_rect) {
37 auto pass = CompositorRenderPass::Create();
38 pass->SetNew(render_pass_id_generator_.GenerateNextId(), output_rect,
39 damage_rect, gfx::Transform());
40 frame_->render_pass_list.push_back(std::move(pass));
41 return *this;
42 }
43
AddRenderPass(std::unique_ptr<CompositorRenderPass> render_pass)44 CompositorFrameBuilder& CompositorFrameBuilder::AddRenderPass(
45 std::unique_ptr<CompositorRenderPass> render_pass) {
46 // Give the render pass a unique id if one hasn't been assigned.
47 if (render_pass->id.is_null())
48 render_pass->id = render_pass_id_generator_.GenerateNextId();
49 frame_->render_pass_list.push_back(std::move(render_pass));
50 return *this;
51 }
52
SetRenderPassList(CompositorRenderPassList render_pass_list)53 CompositorFrameBuilder& CompositorFrameBuilder::SetRenderPassList(
54 CompositorRenderPassList render_pass_list) {
55 DCHECK(frame_->render_pass_list.empty());
56 frame_->render_pass_list = std::move(render_pass_list);
57 return *this;
58 }
59
AddTransferableResource(TransferableResource resource)60 CompositorFrameBuilder& CompositorFrameBuilder::AddTransferableResource(
61 TransferableResource resource) {
62 frame_->resource_list.push_back(std::move(resource));
63 return *this;
64 }
65
SetTransferableResources(std::vector<TransferableResource> resource_list)66 CompositorFrameBuilder& CompositorFrameBuilder::SetTransferableResources(
67 std::vector<TransferableResource> resource_list) {
68 DCHECK(frame_->resource_list.empty());
69 frame_->resource_list = std::move(resource_list);
70 return *this;
71 }
72
SetBeginFrameAck(const BeginFrameAck & ack)73 CompositorFrameBuilder& CompositorFrameBuilder::SetBeginFrameAck(
74 const BeginFrameAck& ack) {
75 frame_->metadata.begin_frame_ack = ack;
76 return *this;
77 }
78
SetDeviceScaleFactor(float device_scale_factor)79 CompositorFrameBuilder& CompositorFrameBuilder::SetDeviceScaleFactor(
80 float device_scale_factor) {
81 frame_->metadata.device_scale_factor = device_scale_factor;
82 return *this;
83 }
84
AddLatencyInfo(ui::LatencyInfo latency_info)85 CompositorFrameBuilder& CompositorFrameBuilder::AddLatencyInfo(
86 ui::LatencyInfo latency_info) {
87 frame_->metadata.latency_info.push_back(std::move(latency_info));
88 return *this;
89 }
90
AddLatencyInfos(std::vector<ui::LatencyInfo> latency_info)91 CompositorFrameBuilder& CompositorFrameBuilder::AddLatencyInfos(
92 std::vector<ui::LatencyInfo> latency_info) {
93 if (frame_->metadata.latency_info.empty()) {
94 frame_->metadata.latency_info.swap(latency_info);
95 } else {
96 for (auto& latency : latency_info) {
97 frame_->metadata.latency_info.push_back(std::move(latency));
98 }
99 }
100 return *this;
101 }
102
SetActivationDependencies(std::vector<SurfaceId> activation_dependencies)103 CompositorFrameBuilder& CompositorFrameBuilder::SetActivationDependencies(
104 std::vector<SurfaceId> activation_dependencies) {
105 frame_->metadata.activation_dependencies = std::move(activation_dependencies);
106 return *this;
107 }
108
SetDeadline(const FrameDeadline & deadline)109 CompositorFrameBuilder& CompositorFrameBuilder::SetDeadline(
110 const FrameDeadline& deadline) {
111 frame_->metadata.deadline = deadline;
112 return *this;
113 }
114
SetReferencedSurfaces(std::vector<SurfaceRange> referenced_surfaces)115 CompositorFrameBuilder& CompositorFrameBuilder::SetReferencedSurfaces(
116 std::vector<SurfaceRange> referenced_surfaces) {
117 frame_->metadata.referenced_surfaces = std::move(referenced_surfaces);
118 return *this;
119 }
120
SetSendFrameTokenToEmbedder(bool send)121 CompositorFrameBuilder& CompositorFrameBuilder::SetSendFrameTokenToEmbedder(
122 bool send) {
123 DCHECK(frame_->metadata.frame_token);
124 frame_->metadata.send_frame_token_to_embedder = send;
125 return *this;
126 }
127
MakeInitCompositorFrame() const128 CompositorFrame CompositorFrameBuilder::MakeInitCompositorFrame() const {
129 static FrameTokenGenerator next_token;
130 CompositorFrame frame;
131 frame.metadata.begin_frame_ack = BeginFrameAck::CreateManualAckWithDamage();
132 frame.metadata.device_scale_factor = 1.f;
133 frame.metadata.frame_token = ++next_token;
134 return frame;
135 }
136
MakeDefaultCompositorFrame()137 CompositorFrame MakeDefaultCompositorFrame() {
138 return CompositorFrameBuilder().AddDefaultRenderPass().Build();
139 }
140
MakeDefaultAggregatedFrame(size_t num_render_passes)141 AggregatedFrame MakeDefaultAggregatedFrame(size_t num_render_passes) {
142 static AggregatedRenderPassId::Generator id_generator;
143 AggregatedFrame frame;
144 for (size_t i = 0; i < num_render_passes; ++i) {
145 frame.render_pass_list.push_back(std::make_unique<AggregatedRenderPass>());
146 frame.render_pass_list.back()->SetNew(id_generator.GenerateNextId(),
147 kDefaultOutputRect,
148 kDefaultDamageRect, gfx::Transform());
149 }
150 return frame;
151 }
152
MakeEmptyCompositorFrame()153 CompositorFrame MakeEmptyCompositorFrame() {
154 return CompositorFrameBuilder().Build();
155 }
156
157 } // namespace viz
158