123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- // Copyright 2017 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef COMPONENTS_VIZ_TEST_COMPOSITOR_FRAME_HELPERS_H_
- #define COMPONENTS_VIZ_TEST_COMPOSITOR_FRAME_HELPERS_H_
- #include <memory>
- #include <vector>
- #include "base/memory/weak_ptr.h"
- #include "components/viz/common/quads/compositor_frame.h"
- #include "components/viz/common/quads/compositor_render_pass.h"
- #include "components/viz/common/quads/frame_deadline.h"
- #include "components/viz/common/resources/transferable_resource.h"
- #include "components/viz/common/surfaces/surface_id.h"
- #include "components/viz/service/display/aggregated_frame.h"
- #include "third_party/abseil-cpp/absl/types/optional.h"
- #include "third_party/skia/include/core/SkBlendMode.h"
- #include "ui/latency/latency_info.h"
- namespace viz {
- class CopyOutputRequest;
- // Note that QuadParam structs should not have a user defined constructor to
- // allow the use designated initializers.
- struct SolidColorQuadParms {
- bool force_anti_aliasing_off = false;
- };
- struct SurfaceQuadParams {
- SkColor4f default_background_color = SkColors::kWhite;
- bool stretch_content_to_fill_bounds = false;
- bool is_reflection = false;
- bool allow_merge = true;
- };
- struct RenderPassQuadParams {
- bool needs_blending = true;
- bool force_anti_aliasing_off = false;
- bool intersects_damage_under = true;
- };
- struct TextureQuadParams {
- bool needs_blending = false;
- bool premultiplied_alpha = false;
- SkColor4f background_color = SkColors::kGreen;
- float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
- bool flipped = false;
- bool nearest_neighbor = false;
- bool secure_output_only = false;
- };
- // Helper to build a CompositorRenderPass and add quads to it. By default the
- // CompositorRenderPass will have full damage. Functionality is broken down into
- // methods to modify render pass attributes, methods to add new quads and
- // methods to modify SharedQuadState for the last quad added.
- class RenderPassBuilder {
- public:
- RenderPassBuilder(CompositorRenderPassId id, const gfx::Size& output_size);
- RenderPassBuilder(CompositorRenderPassId id, const gfx::Rect& output_rect);
- // Constructors for use with CompositorFrameBuilder when the specific render
- // pass id doesn't matter. CompositorFrameBuilder will auto assign valid ids.
- explicit RenderPassBuilder(const gfx::Size& output_size);
- explicit RenderPassBuilder(const gfx::Rect& output_rect);
- RenderPassBuilder(const RenderPassBuilder& other) = delete;
- RenderPassBuilder& operator=(const RenderPassBuilder& other) = delete;
- ~RenderPassBuilder();
- // Checks basic validity, like the render pass hasn't already been built and
- // there is at least one quad.
- bool IsValid() const;
- // Returns the CompositorRenderPass and leaves |this| in an invalid state.
- std::unique_ptr<CompositorRenderPass> Build();
- // Methods to modify the CompositorRenderPass start here.
- RenderPassBuilder& SetDamageRect(const gfx::Rect& damage_rect);
- RenderPassBuilder& SetCacheRenderPass(bool val);
- RenderPassBuilder& SetHasDamageFromContributingContent(bool val);
- RenderPassBuilder& AddFilter(const cc::FilterOperation& filter);
- RenderPassBuilder& AddBackdropFilter(const cc::FilterOperation& filter);
- // Creates a new stub CopyOutputRequest and adds it to the render pass. If
- // |request_out| is not null the pointer will set to the newly created
- // request.
- //
- // Note that |request_out| is a WeakPtr because the CopyOutputRequest lifetime
- // is difficult to reason about as ownership can be transferred in many
- // places.
- RenderPassBuilder& AddStubCopyOutputRequest(
- base::WeakPtr<CopyOutputRequest>* request_out = nullptr);
- // Methods to add DrawQuads start here. The methods are structured so that the
- // most important attributes on the quad are function parameters. Less
- // important attributes are stored in an optional struct parameter. The
- // optional params struct is POD so that designated initializers can be used
- // to construct a new object with specified parameters overridden.
- RenderPassBuilder& AddSolidColorQuad(const gfx::Rect& rect,
- SkColor4f color,
- SolidColorQuadParms params = {});
- RenderPassBuilder& AddSolidColorQuad(const gfx::Rect& rect,
- const gfx::Rect& visible_rect,
- SkColor4f color,
- SolidColorQuadParms params = {});
- RenderPassBuilder& AddSurfaceQuad(const gfx::Rect& rect,
- const SurfaceRange& surface_range,
- const SurfaceQuadParams& params = {});
- RenderPassBuilder& AddSurfaceQuad(const gfx::Rect& rect,
- const gfx::Rect& visible_rect,
- const SurfaceRange& surface_range,
- const SurfaceQuadParams& params = {});
- RenderPassBuilder& AddRenderPassQuad(const gfx::Rect& rect,
- CompositorRenderPassId id,
- const RenderPassQuadParams& params = {});
- RenderPassBuilder& AddRenderPassQuad(const gfx::Rect& rect,
- const gfx::Rect& visible_rect,
- CompositorRenderPassId id,
- const RenderPassQuadParams& params = {});
- RenderPassBuilder& AddTextureQuad(const gfx::Rect& rect,
- ResourceId resource_id,
- const TextureQuadParams& params = {});
- RenderPassBuilder& AddTextureQuad(const gfx::Rect& rect,
- const gfx::Rect& visible_rect,
- ResourceId resource_id,
- const TextureQuadParams& params = {});
- // Methods to modify the last DrawQuad's SharedQuadState start here. Note that
- // at least one quad must have been added to the render pass before calling
- // these.
- // Sets SharedQuadState::quad_to_target_transform for the last quad.
- RenderPassBuilder& SetQuadToTargetTransform(const gfx::Transform& transform);
- // Sets SharedQuadState::quad_to_target_transform for the last quad with a
- // transform that has the specified translation components.
- RenderPassBuilder& SetQuadToTargetTranslation(int translate_x,
- int translate_y);
- // Sets the SharedQuadState::opacity for the last quad.
- RenderPassBuilder& SetQuadOpacity(float opacity);
- // Sets SharedQuadState::clip_rect for the last quad.
- RenderPassBuilder& SetQuadClipRect(absl::optional<gfx::Rect> clip_rect);
- // Sets the damage_rect for the last quad. This is only valid to call if the
- // last quad has a `damage_rect` member.
- RenderPassBuilder& SetQuadDamageRect(const gfx::Rect& damage_rect);
- // Sets SharedQuadState::blend_mode for the last quad.
- RenderPassBuilder& SetBlendMode(SkBlendMode blend_mode);
- // Sets SharedQuadState::mask_filter_info and
- // SharedQuadState::is_fast_rounded_corner for the last quad.
- RenderPassBuilder& SetMaskFilter(const gfx::MaskFilterInfo& mask_filter_info,
- bool is_fast_rounded_corner);
- private:
- // Appends and returns a new SharedQuadState for quad.
- SharedQuadState* AppendDefaultSharedQuadState(const gfx::Rect rect,
- const gfx::Rect visible_rect);
- SharedQuadState* GetLastQuadSharedQuadState();
- std::unique_ptr<CompositorRenderPass> pass_;
- };
- // A builder class for constructing CompositorFrames in tests. The initial
- // CompositorFrame will have a valid BeginFrameAck and device_scale_factor of 1.
- // At least one RenderPass must be added for the CompositorFrame to be valid.
- class CompositorFrameBuilder {
- public:
- CompositorFrameBuilder();
- CompositorFrameBuilder(const CompositorFrameBuilder&) = delete;
- CompositorFrameBuilder& operator=(const CompositorFrameBuilder&) = delete;
- ~CompositorFrameBuilder();
- // Builds the CompositorFrame and leaves |this| in an invalid state. This can
- // only be called once.
- CompositorFrame Build();
- // Adds a render pass with 20x20 output_rect and empty damage_rect.
- CompositorFrameBuilder& AddDefaultRenderPass();
- // Adds a render pass with specified |output_rect| and |damage_rect|.
- CompositorFrameBuilder& AddRenderPass(const gfx::Rect& output_rect,
- const gfx::Rect& damage_rect);
- // Add a new render pass. If the render pass has an invalid id then a new id
- // will be assigned.
- //
- // This also populates CompositorFrameMetadata::referenced_surfaces if the
- // render pass contains any SurfaceDrawQuads.
- CompositorFrameBuilder& AddRenderPass(
- std::unique_ptr<CompositorRenderPass> render_pass);
- CompositorFrameBuilder& AddRenderPass(RenderPassBuilder& builder);
- // Sets list of render passes. The list of render passes must be empty when
- // this is called.
- CompositorFrameBuilder& SetRenderPassList(
- CompositorRenderPassList render_pass_list);
- CompositorFrameBuilder& AddTransferableResource(
- TransferableResource resource);
- // Sets list of transferable resources. The list of transferable resources
- // must be empty when this is called.
- CompositorFrameBuilder& SetTransferableResources(
- std::vector<TransferableResource> resource_list);
- // Populate valid looking TransferableResources based on DrawQuad ResourceIds.
- // The list of transferable resources must be empty when this is called.
- CompositorFrameBuilder& PopulateResources();
- // Sets the BeginFrameAck. This replaces the default BeginFrameAck.
- CompositorFrameBuilder& SetBeginFrameAck(const BeginFrameAck& ack);
- CompositorFrameBuilder& SetDeviceScaleFactor(float device_scale_factor);
- CompositorFrameBuilder& AddLatencyInfo(ui::LatencyInfo latency_info);
- CompositorFrameBuilder& AddLatencyInfos(
- std::vector<ui::LatencyInfo> latency_info);
- CompositorFrameBuilder& SetReferencedSurfaces(
- std::vector<SurfaceRange> referenced_surfaces);
- CompositorFrameBuilder& SetActivationDependencies(
- std::vector<SurfaceId> activation_dependencies);
- CompositorFrameBuilder& SetDeadline(const FrameDeadline& deadline);
- CompositorFrameBuilder& SetSendFrameTokenToEmbedder(bool send);
- CompositorFrameBuilder& AddDelegatedInkMetadata(
- const gfx::DelegatedInkMetadata& metadata);
- private:
- CompositorFrame MakeInitCompositorFrame() const;
- absl::optional<CompositorFrame> frame_;
- CompositorRenderPassId::Generator render_pass_id_generator_;
- };
- // Duplicates a list of render passes by calling DeepCopy() on each.
- CompositorRenderPassList CopyRenderPasses(
- const CompositorRenderPassList& render_pass_list);
- // Creates a CompositorFrame that has a render pass with 20x20 output_rect and
- // empty damage_rect. This CompositorFrame is valid and can be sent over IPC.
- CompositorFrame MakeDefaultCompositorFrame();
- // Creates a CompositorFrame with provided render pass.
- CompositorFrame MakeCompositorFrame(
- std::unique_ptr<CompositorRenderPass> render_pass);
- // Creates a CompositorFrame with provided list of render passes.
- CompositorFrame MakeCompositorFrame(CompositorRenderPassList render_pass_list);
- // Makes an aggregated frame out of the default compositor frame.
- AggregatedFrame MakeDefaultAggregatedFrame(size_t num_render_passes = 1);
- // Creates a CompositorFrame that will be valid once its render_pass_list is
- // initialized.
- CompositorFrame MakeEmptyCompositorFrame();
- // Populate valid looking TransferableResources for `frame` based on DrawQuad
- // ResourceIds.
- void PopulateTransferableResources(CompositorFrame& frame);
- } // namespace viz
- #endif // COMPONENTS_VIZ_TEST_COMPOSITOR_FRAME_HELPERS_H_
|