blob: 0be4528ccea930c0d45799414cd03eaa7ca8e21f [file] [log] [blame]
// Copyright 2012 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_COMMON_QUADS_COMPOSITOR_FRAME_METADATA_H_
#define COMPONENTS_VIZ_COMMON_QUADS_COMPOSITOR_FRAME_METADATA_H_
#include <stdint.h>
#include <limits>
#include <memory>
#include <optional>
#include <vector>
#include "base/time/time.h"
#include "build/build_config.h"
#include "components/viz/common/frame_sinks/begin_frame_args.h"
#include "components/viz/common/quads/compositor_frame_transition_directive.h"
#include "components/viz/common/quads/frame_deadline.h"
#include "components/viz/common/quads/frame_interval_inputs.h"
#include "components/viz/common/quads/offset_tag.h"
#include "components/viz/common/quads/trees_in_viz_timing.h"
#include "components/viz/common/surfaces/region_capture_bounds.h"
#include "components/viz/common/surfaces/surface_id.h"
#include "components/viz/common/surfaces/surface_range.h"
#include "components/viz/common/viz_common_export.h"
#include "third_party/blink/public/common/tokens/tokens.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/delegated_ink_metadata.h"
#include "ui/gfx/display_color_spaces.h"
#include "ui/gfx/geometry/size_f.h"
#include "ui/gfx/geometry/vector2d_f.h"
#include "ui/gfx/overlay_transform.h"
#include "ui/latency/latency_info.h"
#if BUILDFLAG(IS_ANDROID)
#include "components/viz/common/quads/selection.h"
#include "ui/gfx/selection_bound.h"
#endif // BUILDFLAG(IS_ANDROID)
namespace base::trace_event {
class TracedValue;
} // namespace base::trace_event
namespace viz {
// A frame token value of 0 indicates an invalid token.
inline constexpr uint32_t kInvalidFrameToken = 0;
// A frame token value of `kLocalFrameToken` indicates a local frame token. A
// local frame token is used inside viz when it creates its own CompositorFrame
// for a surface.
inline constexpr uint32_t kLocalFrameToken =
std::numeric_limits<uint32_t>::max();
// Compares two frame tokens, handling cases where the token wraps around the
// 32-bit max value.
inline bool FrameTokenGT(uint32_t token1, uint32_t token2) {
// There will be underflow in the subtraction if token1 was created
// after token2.
return (token2 - token1) > 0x80000000u;
}
class VIZ_COMMON_EXPORT FrameTokenGenerator {
public:
inline uint32_t operator++() {
++frame_token_;
if (frame_token_ == kLocalFrameToken) {
++frame_token_;
}
if (frame_token_ == kInvalidFrameToken) {
++frame_token_;
}
return frame_token_;
}
inline uint32_t operator*() const { return frame_token_; }
private:
uint32_t frame_token_ = kInvalidFrameToken;
};
// NOTE: Remember to update the private copy constructor if the new field added
// needs to be copied (via `Clone()`)!
class VIZ_COMMON_EXPORT CompositorFrameMetadata {
public:
CompositorFrameMetadata();
CompositorFrameMetadata(CompositorFrameMetadata&& other);
~CompositorFrameMetadata();
CompositorFrameMetadata& operator=(CompositorFrameMetadata&& other);
CompositorFrameMetadata Clone() const;
void AsValueInto(base::trace_event::TracedValue* value) const;
// The device scale factor used to generate this compositor frame. Must be
// greater than zero.
float device_scale_factor = 0.f;
// Scroll offset and scale of the root layer. This can be used for tasks
// like positioning windowed plugins.
gfx::PointF root_scroll_offset;
float page_scale_factor = 0.f;
gfx::SizeF scrollable_viewport_size;
// The size of the viewport for the visible region in DIP.
gfx::Size visible_viewport_size;
gfx::ContentColorUsage content_color_usage = gfx::ContentColorUsage::kSRGB;
bool may_contain_video = false;
bool may_throttle_if_undrawn_frames = true;
// True if this compositor frame is related to an animated or precise scroll.
// This includes during the touch interaction just prior to the initiation of
// gesture scroll events.
bool is_handling_interaction = false;
// True if this compositor frame contains animations.
bool is_handling_animation = false;
// This color is usually obtained from the background color of the <body>
// element. It can be used for filling in gutter areas around the frame when
// it's too small to fill the box the parent reserved for it.
SkColor4f root_background_color = SkColors::kWhite;
std::vector<ui::LatencyInfo> latency_info;
// This is the set of surfaces that the client wants to keep alive. It is
// guaranteed that the last activated surface in every SurfaceRange will be
// kept alive as long as the surface containing this CompositorFrame is alive.
// Note: Not every surface in this list might have a corresponding
// SurfaceDrawQuad, as this list also includes occluded and clipped surfaces
// and surfaces that may be accessed by this CompositorFrame in the future.
// However, every SurfaceDrawQuad MUST have a corresponding entry in this
// list.
std::vector<SurfaceRange> referenced_surfaces;
// This is the set of dependent SurfaceIds that should be active in the
// display compositor before this CompositorFrame can be activated.
// Note: |activation_dependencies| MUST be a subset of |referenced_surfaces|.
// TODO(crbug.com/41445303): Rather than having a separate list for activation
// dependencies, each member of referenced_surfaces can have a boolean flag
// that determines whether activation of this particular SurfaceId blocks the
// activation of the CompositorFrame.
std::vector<SurfaceId> activation_dependencies;
// This specifies a deadline for this CompositorFrame to synchronize with its
// activation dependencies. Once this deadline passes, this CompositorFrame
// should be forcibly activated. This deadline may be lower-bounded by the
// default synchronization deadline specified by the system.
FrameDeadline deadline;
// BeginFrameAck for the BeginFrame that this CompositorFrame answers.
BeginFrameAck begin_frame_ack;
// An identifier for the frame. This is used to identify the frame for
// presentation-feedback, or when the frame-token is sent to the embedder.
// For comparing |frame_token| from different frames, use |FrameTokenGT()|
// instead of directly comparing them, since the tokens wrap around back to 1
// after the 32-bit max value.
// TODO(crbug.com/41393200): A custom type would be better to avoid incorrect
// comparisons.
uint32_t frame_token = kInvalidFrameToken;
// Once the display compositor processes a frame with
// |send_frame_token_to_embedder| flag turned on, the |frame_token| for the
// frame is sent to embedder of the frame. This is helpful when the embedder
// wants to do something after a particular frame is processed.
bool send_frame_token_to_embedder = false;
// These limits can be used together with the scroll/scale fields above to
// determine if scrolling/scaling in a particular direction is possible.
float min_page_scale_factor = 0.f;
// The visible height of the top-controls. If the value is not set, then the
// visible height should be the same as in the latest submitted frame with a
// value set.
std::optional<float> top_controls_visible_height;
// Display transform hint when the frame is generated. Note this is only
// applicable to frames of the root surface.
gfx::OverlayTransform display_transform_hint = gfx::OVERLAY_TRANSFORM_NONE;
// Please refer RenderFrameMetadata::is_mobile_optimized for detailed comment.
bool is_mobile_optimized = false;
// Contains the metadata required for drawing a delegated ink trail onto the
// end of a rendered ink stroke. This should only be present when two
// conditions are met:
// 1. The JS API |updateInkTrailStartPoint| is used - This gathers the
// metadata and puts it onto a compositor frame to be sent to viz.
// 2. This frame will not be submitted to the root surface - The browser UI
// does not use this, and the frame must be contained within a
// SurfaceDrawQuad.
// This metadata will be copied when an aggregated frame is made, and will be
// used until this Compositor Frame Metadata is replaced.
std::unique_ptr<gfx::DelegatedInkMetadata> delegated_ink_metadata;
// This represents a list of directives to execute in order to support the
// view transitions.
std::vector<CompositorFrameTransitionDirective> transition_directives;
// A map of region capture crop ids associated with this frame to the
// gfx::Rect of the region that they represent.
RegionCaptureBounds capture_bounds;
// Indicates if this frame references shared element resources that need to
// be replaced with ResourceIds in the Viz process.
bool has_shared_element_resources = false;
// When set, the compositor frame submission also informs viz to issue a
// screenshot against the previous surface.
std::optional<blink::SameDocNavigationScreenshotDestinationToken>
screenshot_destination;
// When set, this frame contains software resources. See
// TransferableResource::is_software for details.
bool is_software = false;
// List of tags that will be added on quads in this CompositorFrame.
// Note: The `SurfaceRange`s used in these definitions MUST be a subset of
// `referenced_surfaces`.
// TODO(crbug.com/41445303): Rather than having a separate list of
// OffsetTagDefinitions, each member of referenced_surfaces can have a set of
// OffsetTagDefinitions.
std::vector<OffsetTagDefinition> offset_tag_definitions;
// List of values for tags that apply to tagged quads in an embedding
// CompositorFrame.
std::vector<OffsetTagValue> offset_tag_values;
// Information used to compute overall ideal frame interval.
FrameIntervalInputs frame_interval_inputs;
// Timestamps for TreesInViz metric reporting.
TreesInVizTiming trees_in_viz_timing_details;
private:
CompositorFrameMetadata(const CompositorFrameMetadata& other);
CompositorFrameMetadata operator=(const CompositorFrameMetadata&) = delete;
};
} // namespace viz
#endif // COMPONENTS_VIZ_COMMON_QUADS_COMPOSITOR_FRAME_METADATA_H_