blob: abc55a9384e314c296a5e10b2b0181f8c2f8f259 [file]
// Copyright 2026 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_COMPOSITOR_LAYER_SURFACE_H_
#define UI_COMPOSITOR_LAYER_SURFACE_H_
#include <memory>
#include "base/memory/scoped_refptr.h"
#include "cc/layers/deadline_policy.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/compositor/compositor_export.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_type.h"
#include "ui/gfx/geometry/size.h"
namespace cc {
class SurfaceLayer;
} // namespace cc
namespace viz {
class SurfaceId;
} // namespace viz
namespace ui {
// A layer that embeds and displays a viz::SurfaceId (e.g. from another
// process or display compositor), backed by a cc::SurfaceLayer.
class COMPOSITOR_EXPORT LayerSurface : public Layer {
public:
static constexpr LayerType kType = LAYER_SURFACE;
LayerSurface();
LayerSurface(const LayerSurface&) = delete;
LayerSurface& operator=(const LayerSurface&) = delete;
~LayerSurface() override;
// Layer:
std::unique_ptr<Layer> Clone() const override;
bool ShouldSchedulePaint() const override;
// Sets the background color used as a fallback when the surface content
// is unavailable (e.g. before the initial frame is produced, during surface
// eviction, or if unresolved in Viz), or as a gutter color if the content
// does not cover the layer's entire bounds (during fast-resizing).
void SetFallbackBackgroundColor(SkColor4f color);
SkColor4f GetFallbackBackgroundColor() const;
// Begins showing content from a surface with a particular ID.
// TODO(crbug.com/40285157): With surface sync, size shouldn't rely on
// `frame_size_in_dip` anymore, so this method can be deleted, and
// surface_size uses `bounds_` instead.
void SetShowSurface(const viz::SurfaceId& surface_id,
const gfx::Size& frame_size_in_dip,
const cc::DeadlinePolicy& deadline_policy,
bool stretch_content_to_fill_bounds);
// Updates the surface to a particular ID without changing size.
void SetShowSurface(const viz::SurfaceId& surface_id,
const cc::DeadlinePolicy& deadline_policy,
bool stretch_content_to_fill_bounds);
// Begins mirroring content from a reflected surface, e.g. a software mirrored
// display. |surface_id| should be the root surface for a display.
void SetShowReflectedSurface(const viz::SurfaceId& surface_id,
const gfx::Size& frame_size_in_pixels);
// In the event that the primary surface is not yet available in the
// display compositor, the fallback surface will be used.
void SetOldestAcceptableFallback(const viz::SurfaceId& surface_id);
// Returns the fallback SurfaceId set by SetOldestAcceptableFallback.
const viz::SurfaceId* GetOldestAcceptableFallback() const;
// If |surface_layer_| exists, return whether the contents should stretch to
// fill the bounds of |this|. Defaults to false.
bool StretchContentToFillBounds() const;
// If |surface_layer_| exists, update the size. The updated size is necessary
// for proper scaling if the embedder is resized and the |surface_layer_| is
// set to stretch to fill bounds.
void SetSurfaceSize(gfx::Size surface_size_in_dip);
// Returns the primary SurfaceId set by SetShowSurface.
const viz::SurfaceId* GetSurfaceId() const;
protected:
// Layer:
void RecomputeDrawsContentAndUVRect() override;
void Reset() override;
void OnPaintScheduled() override;
private:
gfx::Size frame_size_in_dip_;
scoped_refptr<cc::SurfaceLayer> surface_layer_;
};
} // namespace ui
#endif // UI_COMPOSITOR_LAYER_SURFACE_H_