blob: 523d00471dab2089de128328da59be6304bb274d [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_GFX_OVERLAY_LAYER_ID_H_
#define UI_GFX_OVERLAY_LAYER_ID_H_
#include <stdint.h>
#include <array>
#include <compare>
#include <optional>
#include <string>
#include <utility>
#include <variant>
#include "base/component_export.h"
#include "base/types/id_type.h"
namespace viz {
class AggregatedRenderPass;
}
namespace gfx {
// An identifier for an overlay layer that is unique within a frame. Should be
// stable across frames if OS compositor subtree reuse is desired.
class COMPONENT_EXPORT(GFX) OverlayLayerId {
public:
using NamespaceId = std::pair<uint32_t, uint32_t>;
// Copy of AggregatedRenderPassId, since we cannot depend on viz from here.
using RenderPassId = base::IdTypeU64<viz::AggregatedRenderPass>;
// The default constructed instance represents the implicit root node of the
// OS compositor tree.
OverlayLayerId();
// `layer_namespace_id` must be non-zero.
OverlayLayerId(const NamespaceId& layer_namespace_id,
uint32_t layer_id,
uint32_t sqs_z_order = 0);
~OverlayLayerId();
// The set of named layers that Viz make create that do not (or cannot) map
// back to anything in any compositor frames.
enum class VizInternalId : uint32_t {
kOsCompositorRoot,
kDelegatedInkTrail,
kBackgroundColorLayer,
};
// Create a named `OverlayLayerId` that is namespaced for internal viz use.
static OverlayLayerId MakeVizInternal(VizInternalId layer_id);
// Create an `OverlayLayerId` that is namespaced for internal viz use and
// identifies a render pass ID.
static OverlayLayerId MakeVizInternalRenderPass(RenderPassId render_pass_id);
// Create an `OverlayLayerId` with a `layer_namespace_id` of {1,1}.
static OverlayLayerId MakeForTesting(uint32_t layer_id);
// We are currently using the `SharedQuadState` layer ID, which is unique if a
// layer only contains one quad. In the case a layer contains more than one
// quad, use this function to derive unique IDs for the children.
OverlayLayerId MakeForChildOfSharedQuadStateLayer(
uint32_t non_zero_z_order) const;
auto operator<=>(const OverlayLayerId&) const = default;
std::string ToString() const;
// TODO(crbug.com/324460866): remove when we remove partial delegation.
using SharedQuadStateLayerId = std::tuple<NamespaceId, uint32_t, uint32_t>;
std::optional<SharedQuadStateLayerId> shared_quad_state_layer_id() const;
private:
// Represents a layer ID that is constructed from a `cc::Layer` and the frame
// sink it came from.
struct RendererLayer {
// See `viz::SharedQuadState::layer_namespace_id`.
// A value of 0 is reserved for Viz use.
NamespaceId layer_namespace_id;
// See `viz::SharedQuadState::layer_id`.
uint32_t layer_id = 0;
// An identifier to disambiguate multiple `SharedQuadState` produced by the
// same `cc::Layer`.
uint32_t sqs_z_order = 0;
auto operator<=>(const RendererLayer&) const = default;
};
// Note we store the `RenderPassId` as a byte array to not force `impl_` (and
// its discriminant) to be aligned to 8 bytes.
std::variant<VizInternalId,
std::array<uint8_t, sizeof(RenderPassId)>,
RendererLayer>
impl_;
// This is a hack while we need to derive a stable layer ID statelessly in
// viz. This is non-zero and used for child layers when a cc layer has more
// than one quad under it. When this is zero this ID refers to the container
// node that represents the cc layer itself.
uint32_t z_order_ = 0;
};
} // namespace gfx
#endif // UI_GFX_OVERLAY_LAYER_ID_H_