[go: nahoru, domu]

blob: 58e40a6ab2a2534c75d44ae2025b62fd5ef2226d [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_SLIM_LAYER_TREE_IMPL_H_
#define CC_SLIM_LAYER_TREE_IMPL_H_
#include <cstdint>
#include <memory>
#include <utility>
#include <vector>
#include "base/component_export.h"
#include "base/containers/flat_set.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "cc/resources/ui_resource_manager.h"
#include "cc/slim/frame_sink_impl_client.h"
#include "cc/slim/layer_tree.h"
#include "components/viz/common/frame_sinks/copy_output_request.h"
#include "components/viz/common/surfaces/local_surface_id.h"
#include "components/viz/common/surfaces/surface_range.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/overlay_transform.h"
#include "ui/gfx/presentation_feedback.h"
namespace cc {
class UIResourceManager;
} // namespace cc
namespace viz {
class CompositorRenderPass;
} // namespace viz
namespace cc::slim {
class FrameSinkImpl;
class TestLayerTreeImpl;
// Slim implementation of LayerTree.
class COMPONENT_EXPORT(CC_SLIM) LayerTreeImpl : public LayerTree,
public FrameSinkImplClient {
public:
~LayerTreeImpl() override;
// LayerTree.
cc::UIResourceManager* GetUIResourceManager() override;
void SetViewportRectAndScale(
const gfx::Rect& device_viewport_rect,
float device_scale_factor,
const viz::LocalSurfaceId& local_surface_id) override;
void set_background_color(SkColor4f color) override;
void SetVisible(bool visible) override;
bool IsVisible() const override;
void RequestPresentationTimeForNextFrame(
PresentationCallback callback) override;
void RequestSuccessfulPresentationTimeForNextFrame(
SuccessfulCallback callback) override;
void set_display_transform_hint(gfx::OverlayTransform hint) override;
void RequestCopyOfOutput(
std::unique_ptr<viz::CopyOutputRequest> request) override;
base::OnceClosure DeferBeginFrame() override;
void UpdateTopControlsVisibleHeight(float height) override;
void SetNeedsAnimate() override;
void SetNeedsRedraw() override;
const scoped_refptr<Layer>& root() const override;
void SetRoot(scoped_refptr<Layer> root) override;
void SetFrameSink(std::unique_ptr<FrameSink> sink) override;
void ReleaseLayerTreeFrameSink() override;
// FrameSinkImplClient.
bool BeginFrame(const viz::BeginFrameArgs& args,
viz::CompositorFrame& out_frame,
base::flat_set<viz::ResourceId>& out_resource_ids,
viz::HitTestRegionList& out_hit_test_region_list) override;
void DidReceiveCompositorFrameAck() override;
void DidSubmitCompositorFrame() override;
void DidPresentCompositorFrame(
uint32_t frame_token,
const viz::FrameTimingDetails& details) override;
void DidLoseLayerTreeFrameSink() override;
// Internal methods called by Layers.
void NotifyTreeChanged();
void NotifyPropertyChanged();
void AddSurfaceRange(const viz::SurfaceRange& range);
void RemoveSurfaceRange(const viz::SurfaceRange& range);
private:
friend class LayerTree;
friend class TestLayerTreeImpl;
explicit LayerTreeImpl(LayerTreeClient* client);
// Request a new frame sink from the client if a new frame sink is needed and
// there isn't already a pending request.
void MaybeRequestFrameSink();
// Matches `DeferBeginFrame` that reduces number of outstanding requests to
// defer (ie stop) BeginFrames to the client.
void ReleaseDeferBeginFrame();
void UpdateNeedsBeginFrame();
void SetClientNeedsOneBeginFrame();
// Call this whenever there are tree or layer changes that needs to be
// submitted in a CompositorFrame.
void SetNeedsDraw();
bool NeedsBeginFrames() const;
void GenerateCompositorFrame(
const viz::BeginFrameArgs& args,
viz::CompositorFrame& out_frame,
base::flat_set<viz::ResourceId>& out_resource_ids,
viz::HitTestRegionList& out_hit_test_region_list);
void Draw(Layer& layer,
viz::CompositorRenderPass& render_pass,
const gfx::Transform& transform_to_target,
const gfx::Rect* clip_from_parent);
const raw_ptr<LayerTreeClient> client_;
scoped_refptr<Layer> root_;
std::unique_ptr<FrameSinkImpl> frame_sink_;
cc::UIResourceManager ui_resource_manager_;
viz::LocalSurfaceId local_surface_id_;
bool frame_sink_request_pending_ = false;
// Indicates there is an `UpdateNeedsBeginFrame` call pending in the current
// task lower in the stack frame. This is to prevent unnecessary back and
// forth flips.
bool update_needs_begin_frame_pending_ = false;
// Set when client requests a begin frame viz `SetNeedsAnimate` or
// `SetNeedsRedraw`.
bool client_needs_one_begin_frame_ = false;
// Set to indicate there are layer or tree changes that's not yet submitted
// in a CompositorFrame.
bool needs_draw_ = false;
bool visible_ = false;
uint32_t num_defer_begin_frame_ = 0u;
gfx::Rect device_viewport_rect_;
float device_scale_factor_ = 1.0f;
SkColor4f background_color_ = SkColors::kWhite;
absl::optional<float> top_controls_visible_height_;
base::flat_set<viz::SurfaceRange> referenced_surfaces_;
viz::FrameTokenGenerator next_frame_token_;
gfx::OverlayTransform display_transform_hint_ = gfx::OVERLAY_TRANSFORM_NONE;
base::WeakPtrFactory<LayerTreeImpl> weak_factory_{this};
};
} // namespace cc::slim
#endif // CC_SLIM_LAYER_TREE_IMPL_H_