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