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 #ifndef COMPONENTS_VIZ_TEST_COMPOSITOR_FRAME_HELPERS_H_
6 #define COMPONENTS_VIZ_TEST_COMPOSITOR_FRAME_HELPERS_H_
7 
8 #include <memory>
9 #include <vector>
10 
11 #include "base/optional.h"
12 #include "components/viz/common/quads/compositor_frame.h"
13 #include "components/viz/common/quads/compositor_render_pass.h"
14 #include "components/viz/common/quads/frame_deadline.h"
15 #include "components/viz/common/resources/transferable_resource.h"
16 #include "components/viz/common/surfaces/surface_id.h"
17 #include "components/viz/service/display/aggregated_frame.h"
18 #include "ui/latency/latency_info.h"
19 
20 namespace viz {
21 
22 // A builder class for constructing CompositorFrames in tests. The initial
23 // CompositorFrame will have a valid BeginFrameAck and device_scale_factor of 1.
24 // At least one RenderPass must be added for the CompositorFrame to be valid.
25 class CompositorFrameBuilder {
26  public:
27   CompositorFrameBuilder();
28   ~CompositorFrameBuilder();
29 
30   // Builds the CompositorFrame and leaves |this| in an invalid state. This can
31   // only be called once.
32   CompositorFrame Build();
33 
34   // Adds a render pass with 20x20 output_rect and empty damage_rect.
35   CompositorFrameBuilder& AddDefaultRenderPass();
36   // Adds a render pass with specified |output_rect| and |damage_rect|.
37   CompositorFrameBuilder& AddRenderPass(const gfx::Rect& output_rect,
38                                         const gfx::Rect& damage_rect);
39   CompositorFrameBuilder& AddRenderPass(
40       std::unique_ptr<CompositorRenderPass> render_pass);
41   // Sets list of render passes. The list of render passes must be empty when
42   // this is called.
43   CompositorFrameBuilder& SetRenderPassList(
44       CompositorRenderPassList render_pass_list);
45 
46   CompositorFrameBuilder& AddTransferableResource(
47       TransferableResource resource);
48   // Sets list of transferable resources. The list of transferable resources
49   // must be empty when this is called.
50   CompositorFrameBuilder& SetTransferableResources(
51       std::vector<TransferableResource> resource_list);
52 
53   // Sets the BeginFrameAck. This replaces the default BeginFrameAck.
54   CompositorFrameBuilder& SetBeginFrameAck(const BeginFrameAck& ack);
55   CompositorFrameBuilder& SetDeviceScaleFactor(float device_scale_factor);
56   CompositorFrameBuilder& AddLatencyInfo(ui::LatencyInfo latency_info);
57   CompositorFrameBuilder& AddLatencyInfos(
58       std::vector<ui::LatencyInfo> latency_info);
59   CompositorFrameBuilder& SetReferencedSurfaces(
60       std::vector<SurfaceRange> referenced_surfaces);
61   CompositorFrameBuilder& SetActivationDependencies(
62       std::vector<SurfaceId> activation_dependencies);
63   CompositorFrameBuilder& SetDeadline(const FrameDeadline& deadline);
64   CompositorFrameBuilder& SetSendFrameTokenToEmbedder(bool send);
65 
66  private:
67   CompositorFrame MakeInitCompositorFrame() const;
68 
69   base::Optional<CompositorFrame> frame_;
70   CompositorRenderPassId::Generator render_pass_id_generator_;
71 
72   DISALLOW_COPY_AND_ASSIGN(CompositorFrameBuilder);
73 };
74 
75 // Creates a CompositorFrame that has a render pass with 20x20 output_rect and
76 // empty damage_rect. This CompositorFrame is valid and can be sent over IPC.
77 CompositorFrame MakeDefaultCompositorFrame();
78 
79 // Makes an aggregated frame out of the default compositor frame.
80 AggregatedFrame MakeDefaultAggregatedFrame(size_t num_render_passes = 1);
81 
82 // Creates a CompositorFrame that will be valid once its render_pass_list is
83 // initialized.
84 CompositorFrame MakeEmptyCompositorFrame();
85 
86 }  // namespace viz
87 
88 #endif  // COMPONENTS_VIZ_TEST_COMPOSITOR_FRAME_HELPERS_H_
89