blob: 2375c032fb95c50fd03ca95bd09ed4db228ec712 [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// 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& AddSharedElementQuad(
const gfx::Rect& rect,
const ViewTransitionElementResourceId& id);
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_