compositor_frame_helpers.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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. #ifndef COMPONENTS_VIZ_TEST_COMPOSITOR_FRAME_HELPERS_H_
  5. #define COMPONENTS_VIZ_TEST_COMPOSITOR_FRAME_HELPERS_H_
  6. #include <memory>
  7. #include <vector>
  8. #include "base/memory/weak_ptr.h"
  9. #include "components/viz/common/quads/compositor_frame.h"
  10. #include "components/viz/common/quads/compositor_render_pass.h"
  11. #include "components/viz/common/quads/frame_deadline.h"
  12. #include "components/viz/common/resources/transferable_resource.h"
  13. #include "components/viz/common/surfaces/surface_id.h"
  14. #include "components/viz/service/display/aggregated_frame.h"
  15. #include "third_party/abseil-cpp/absl/types/optional.h"
  16. #include "third_party/skia/include/core/SkBlendMode.h"
  17. #include "ui/latency/latency_info.h"
  18. namespace viz {
  19. class CopyOutputRequest;
  20. // Note that QuadParam structs should not have a user defined constructor to
  21. // allow the use designated initializers.
  22. struct SolidColorQuadParms {
  23. bool force_anti_aliasing_off = false;
  24. };
  25. struct SurfaceQuadParams {
  26. SkColor4f default_background_color = SkColors::kWhite;
  27. bool stretch_content_to_fill_bounds = false;
  28. bool is_reflection = false;
  29. bool allow_merge = true;
  30. };
  31. struct RenderPassQuadParams {
  32. bool needs_blending = true;
  33. bool force_anti_aliasing_off = false;
  34. bool intersects_damage_under = true;
  35. };
  36. struct TextureQuadParams {
  37. bool needs_blending = false;
  38. bool premultiplied_alpha = false;
  39. SkColor4f background_color = SkColors::kGreen;
  40. float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
  41. bool flipped = false;
  42. bool nearest_neighbor = false;
  43. bool secure_output_only = false;
  44. };
  45. // Helper to build a CompositorRenderPass and add quads to it. By default the
  46. // CompositorRenderPass will have full damage. Functionality is broken down into
  47. // methods to modify render pass attributes, methods to add new quads and
  48. // methods to modify SharedQuadState for the last quad added.
  49. class RenderPassBuilder {
  50. public:
  51. RenderPassBuilder(CompositorRenderPassId id, const gfx::Size& output_size);
  52. RenderPassBuilder(CompositorRenderPassId id, const gfx::Rect& output_rect);
  53. // Constructors for use with CompositorFrameBuilder when the specific render
  54. // pass id doesn't matter. CompositorFrameBuilder will auto assign valid ids.
  55. explicit RenderPassBuilder(const gfx::Size& output_size);
  56. explicit RenderPassBuilder(const gfx::Rect& output_rect);
  57. RenderPassBuilder(const RenderPassBuilder& other) = delete;
  58. RenderPassBuilder& operator=(const RenderPassBuilder& other) = delete;
  59. ~RenderPassBuilder();
  60. // Checks basic validity, like the render pass hasn't already been built and
  61. // there is at least one quad.
  62. bool IsValid() const;
  63. // Returns the CompositorRenderPass and leaves |this| in an invalid state.
  64. std::unique_ptr<CompositorRenderPass> Build();
  65. // Methods to modify the CompositorRenderPass start here.
  66. RenderPassBuilder& SetDamageRect(const gfx::Rect& damage_rect);
  67. RenderPassBuilder& SetCacheRenderPass(bool val);
  68. RenderPassBuilder& SetHasDamageFromContributingContent(bool val);
  69. RenderPassBuilder& AddFilter(const cc::FilterOperation& filter);
  70. RenderPassBuilder& AddBackdropFilter(const cc::FilterOperation& filter);
  71. // Creates a new stub CopyOutputRequest and adds it to the render pass. If
  72. // |request_out| is not null the pointer will set to the newly created
  73. // request.
  74. //
  75. // Note that |request_out| is a WeakPtr because the CopyOutputRequest lifetime
  76. // is difficult to reason about as ownership can be transferred in many
  77. // places.
  78. RenderPassBuilder& AddStubCopyOutputRequest(
  79. base::WeakPtr<CopyOutputRequest>* request_out = nullptr);
  80. // Methods to add DrawQuads start here. The methods are structured so that the
  81. // most important attributes on the quad are function parameters. Less
  82. // important attributes are stored in an optional struct parameter. The
  83. // optional params struct is POD so that designated initializers can be used
  84. // to construct a new object with specified parameters overridden.
  85. RenderPassBuilder& AddSolidColorQuad(const gfx::Rect& rect,
  86. SkColor4f color,
  87. SolidColorQuadParms params = {});
  88. RenderPassBuilder& AddSolidColorQuad(const gfx::Rect& rect,
  89. const gfx::Rect& visible_rect,
  90. SkColor4f color,
  91. SolidColorQuadParms params = {});
  92. RenderPassBuilder& AddSurfaceQuad(const gfx::Rect& rect,
  93. const SurfaceRange& surface_range,
  94. const SurfaceQuadParams& params = {});
  95. RenderPassBuilder& AddSurfaceQuad(const gfx::Rect& rect,
  96. const gfx::Rect& visible_rect,
  97. const SurfaceRange& surface_range,
  98. const SurfaceQuadParams& params = {});
  99. RenderPassBuilder& AddRenderPassQuad(const gfx::Rect& rect,
  100. CompositorRenderPassId id,
  101. const RenderPassQuadParams& params = {});
  102. RenderPassBuilder& AddRenderPassQuad(const gfx::Rect& rect,
  103. const gfx::Rect& visible_rect,
  104. CompositorRenderPassId id,
  105. const RenderPassQuadParams& params = {});
  106. RenderPassBuilder& AddTextureQuad(const gfx::Rect& rect,
  107. ResourceId resource_id,
  108. const TextureQuadParams& params = {});
  109. RenderPassBuilder& AddTextureQuad(const gfx::Rect& rect,
  110. const gfx::Rect& visible_rect,
  111. ResourceId resource_id,
  112. const TextureQuadParams& params = {});
  113. // Methods to modify the last DrawQuad's SharedQuadState start here. Note that
  114. // at least one quad must have been added to the render pass before calling
  115. // these.
  116. // Sets SharedQuadState::quad_to_target_transform for the last quad.
  117. RenderPassBuilder& SetQuadToTargetTransform(const gfx::Transform& transform);
  118. // Sets SharedQuadState::quad_to_target_transform for the last quad with a
  119. // transform that has the specified translation components.
  120. RenderPassBuilder& SetQuadToTargetTranslation(int translate_x,
  121. int translate_y);
  122. // Sets the SharedQuadState::opacity for the last quad.
  123. RenderPassBuilder& SetQuadOpacity(float opacity);
  124. // Sets SharedQuadState::clip_rect for the last quad.
  125. RenderPassBuilder& SetQuadClipRect(absl::optional<gfx::Rect> clip_rect);
  126. // Sets the damage_rect for the last quad. This is only valid to call if the
  127. // last quad has a `damage_rect` member.
  128. RenderPassBuilder& SetQuadDamageRect(const gfx::Rect& damage_rect);
  129. // Sets SharedQuadState::blend_mode for the last quad.
  130. RenderPassBuilder& SetBlendMode(SkBlendMode blend_mode);
  131. // Sets SharedQuadState::mask_filter_info and
  132. // SharedQuadState::is_fast_rounded_corner for the last quad.
  133. RenderPassBuilder& SetMaskFilter(const gfx::MaskFilterInfo& mask_filter_info,
  134. bool is_fast_rounded_corner);
  135. private:
  136. // Appends and returns a new SharedQuadState for quad.
  137. SharedQuadState* AppendDefaultSharedQuadState(const gfx::Rect rect,
  138. const gfx::Rect visible_rect);
  139. SharedQuadState* GetLastQuadSharedQuadState();
  140. std::unique_ptr<CompositorRenderPass> pass_;
  141. };
  142. // A builder class for constructing CompositorFrames in tests. The initial
  143. // CompositorFrame will have a valid BeginFrameAck and device_scale_factor of 1.
  144. // At least one RenderPass must be added for the CompositorFrame to be valid.
  145. class CompositorFrameBuilder {
  146. public:
  147. CompositorFrameBuilder();
  148. CompositorFrameBuilder(const CompositorFrameBuilder&) = delete;
  149. CompositorFrameBuilder& operator=(const CompositorFrameBuilder&) = delete;
  150. ~CompositorFrameBuilder();
  151. // Builds the CompositorFrame and leaves |this| in an invalid state. This can
  152. // only be called once.
  153. CompositorFrame Build();
  154. // Adds a render pass with 20x20 output_rect and empty damage_rect.
  155. CompositorFrameBuilder& AddDefaultRenderPass();
  156. // Adds a render pass with specified |output_rect| and |damage_rect|.
  157. CompositorFrameBuilder& AddRenderPass(const gfx::Rect& output_rect,
  158. const gfx::Rect& damage_rect);
  159. // Add a new render pass. If the render pass has an invalid id then a new id
  160. // will be assigned.
  161. //
  162. // This also populates CompositorFrameMetadata::referenced_surfaces if the
  163. // render pass contains any SurfaceDrawQuads.
  164. CompositorFrameBuilder& AddRenderPass(
  165. std::unique_ptr<CompositorRenderPass> render_pass);
  166. CompositorFrameBuilder& AddRenderPass(RenderPassBuilder& builder);
  167. // Sets list of render passes. The list of render passes must be empty when
  168. // this is called.
  169. CompositorFrameBuilder& SetRenderPassList(
  170. CompositorRenderPassList render_pass_list);
  171. CompositorFrameBuilder& AddTransferableResource(
  172. TransferableResource resource);
  173. // Sets list of transferable resources. The list of transferable resources
  174. // must be empty when this is called.
  175. CompositorFrameBuilder& SetTransferableResources(
  176. std::vector<TransferableResource> resource_list);
  177. // Populate valid looking TransferableResources based on DrawQuad ResourceIds.
  178. // The list of transferable resources must be empty when this is called.
  179. CompositorFrameBuilder& PopulateResources();
  180. // Sets the BeginFrameAck. This replaces the default BeginFrameAck.
  181. CompositorFrameBuilder& SetBeginFrameAck(const BeginFrameAck& ack);
  182. CompositorFrameBuilder& SetDeviceScaleFactor(float device_scale_factor);
  183. CompositorFrameBuilder& AddLatencyInfo(ui::LatencyInfo latency_info);
  184. CompositorFrameBuilder& AddLatencyInfos(
  185. std::vector<ui::LatencyInfo> latency_info);
  186. CompositorFrameBuilder& SetReferencedSurfaces(
  187. std::vector<SurfaceRange> referenced_surfaces);
  188. CompositorFrameBuilder& SetActivationDependencies(
  189. std::vector<SurfaceId> activation_dependencies);
  190. CompositorFrameBuilder& SetDeadline(const FrameDeadline& deadline);
  191. CompositorFrameBuilder& SetSendFrameTokenToEmbedder(bool send);
  192. CompositorFrameBuilder& AddDelegatedInkMetadata(
  193. const gfx::DelegatedInkMetadata& metadata);
  194. private:
  195. CompositorFrame MakeInitCompositorFrame() const;
  196. absl::optional<CompositorFrame> frame_;
  197. CompositorRenderPassId::Generator render_pass_id_generator_;
  198. };
  199. // Duplicates a list of render passes by calling DeepCopy() on each.
  200. CompositorRenderPassList CopyRenderPasses(
  201. const CompositorRenderPassList& render_pass_list);
  202. // Creates a CompositorFrame that has a render pass with 20x20 output_rect and
  203. // empty damage_rect. This CompositorFrame is valid and can be sent over IPC.
  204. CompositorFrame MakeDefaultCompositorFrame();
  205. // Creates a CompositorFrame with provided render pass.
  206. CompositorFrame MakeCompositorFrame(
  207. std::unique_ptr<CompositorRenderPass> render_pass);
  208. // Creates a CompositorFrame with provided list of render passes.
  209. CompositorFrame MakeCompositorFrame(CompositorRenderPassList render_pass_list);
  210. // Makes an aggregated frame out of the default compositor frame.
  211. AggregatedFrame MakeDefaultAggregatedFrame(size_t num_render_passes = 1);
  212. // Creates a CompositorFrame that will be valid once its render_pass_list is
  213. // initialized.
  214. CompositorFrame MakeEmptyCompositorFrame();
  215. // Populate valid looking TransferableResources for `frame` based on DrawQuad
  216. // ResourceIds.
  217. void PopulateTransferableResources(CompositorFrame& frame);
  218. } // namespace viz
  219. #endif // COMPONENTS_VIZ_TEST_COMPOSITOR_FRAME_HELPERS_H_