blob: 94b7f378cc07bc69dcb268acfc4012a1a02d1897 [file] [log] [blame]
// Copyright 2020 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_TRANSITION_DIRECTIVE_H_
#define COMPONENTS_VIZ_COMMON_QUADS_COMPOSITOR_FRAME_TRANSITION_DIRECTIVE_H_
#include <string>
#include <vector>
#include "base/time/time.h"
#include "components/viz/common/quads/compositor_render_pass.h"
#include "components/viz/common/view_transition_element_resource_id.h"
#include "components/viz/common/viz_common_export.h"
#include "ui/gfx/display_color_spaces.h"
namespace viz {
// This is a transition directive that can be associated with a compositor
// frame. The intent is to be able to animate a compositor frame into the right
// place instead of simply drawing the final result at the final destination.
// This is used by a JavaScript-exposed view transitions API. See
// third_party/blink/renderer/core/view_transition/README.md for more
// information.
class VIZ_COMMON_EXPORT CompositorFrameTransitionDirective {
public:
// What is the directive?
// - Save means that the currently submitted frame will be used in the future
// as the source frame of the animation. The animation could be driven by
// the renderer or Viz process. This directive must be followed by the
// Animate or AnimateRenderer directive.
//
// - AnimateRenderer means that content in the current and subsequent frames
// will use cached resources from the frame with the Save directive.
// Ownership of the cached resources is passed to the renderer process. This
// directive must be followed by Release to delete the cached resources.
//
// - Release means that cached textures in the Viz process can be deleted.
// This is used in the mode where the renderer is driving this animation.
enum class Type { kSave, kAnimateRenderer, kRelease };
struct VIZ_COMMON_EXPORT SharedElement {
SharedElement();
~SharedElement();
SharedElement(const SharedElement&);
SharedElement& operator=(const SharedElement&);
SharedElement(SharedElement&&);
SharedElement& operator=(SharedElement&&);
friend bool operator==(const SharedElement&,
const SharedElement&) = default;
// The render pass corresponding to a DOM element. The id is scoped to the
// same frame that the directive corresponds to.
CompositorRenderPassId render_pass_id;
// An identifier to tag the cached texture for this shared element in the
// Viz process.
ViewTransitionElementResourceId view_transition_element_resource_id;
};
// This is public only for mojo deserialization.
CompositorFrameTransitionDirective();
static CompositorFrameTransitionDirective CreateSave(
const blink::ViewTransitionToken& transition_token,
bool maybe_cross_frame_sink,
uint32_t sequence_id,
std::vector<SharedElement> shared_elements,
const gfx::DisplayColorSpaces& display_color_spaces);
static CompositorFrameTransitionDirective CreateAnimate(
const blink::ViewTransitionToken& transition_token,
bool maybe_cross_frame_sink,
uint32_t sequence_id);
static CompositorFrameTransitionDirective CreateRelease(
const blink::ViewTransitionToken& transition_token,
bool maybe_cross_frame_sink,
uint32_t sequence_id);
CompositorFrameTransitionDirective(const CompositorFrameTransitionDirective&);
~CompositorFrameTransitionDirective();
CompositorFrameTransitionDirective& operator=(
const CompositorFrameTransitionDirective&);
// A monotonically increasing sequence_id for a given communication channel
// (i.e. surface). This is used to distinguish new directives from directives
// that have already been processed.
uint32_t sequence_id() const { return sequence_id_; }
// The type of this directive.
Type type() const { return type_; }
blink::ViewTransitionToken transition_token() const {
return transition_token_;
}
// Shared elements.
const std::vector<SharedElement>& shared_elements() const {
return shared_elements_;
}
bool maybe_cross_frame_sink() const { return maybe_cross_frame_sink_; }
const gfx::DisplayColorSpaces& display_color_spaces() const {
return display_color_spaces_;
}
private:
CompositorFrameTransitionDirective(
const blink::ViewTransitionToken& transition_token,
bool maybe_cross_frame_sink,
uint32_t sequence_id,
Type type,
std::vector<SharedElement> shared_elements = {},
const gfx::DisplayColorSpaces& display_color_spaces = {});
blink::ViewTransitionToken transition_token_;
bool maybe_cross_frame_sink_ = false;
uint32_t sequence_id_ = 0;
Type type_ = Type::kSave;
std::vector<SharedElement> shared_elements_;
gfx::DisplayColorSpaces display_color_spaces_;
};
} // namespace viz
#endif // COMPONENTS_VIZ_COMMON_QUADS_COMPOSITOR_FRAME_TRANSITION_DIRECTIVE_H_