blob: b38703490f9ab8e987a12c9fb99eaa62c837dc52 [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 COMPONENTS_VIZ_SERVICE_LAYERS_LAYER_CONTEXT_IMPL_H_
#define COMPONENTS_VIZ_SERVICE_LAYERS_LAYER_CONTEXT_IMPL_H_
#include <memory>
#include <string>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "base/types/expected.h"
#include "cc/animation/animation_host.h"
#include "cc/layers/tile_display_layer_impl.h"
#include "cc/trees/layer_tree_frame_sink.h"
#include "cc/trees/layer_tree_host_impl_client.h"
#include "components/viz/common/resources/returned_resource.h"
#include "components/viz/common/resources/transferable_resource.h"
#include "components/viz/service/viz_service_export.h"
#include "mojo/public/cpp/bindings/associated_receiver.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "services/viz/public/mojom/compositing/compositor_frame_sink.mojom.h"
#include "services/viz/public/mojom/compositing/layer_context.mojom.h"
namespace cc {
class LayerTreeHostImpl;
class RenderingStatsInstrumentation;
class TaskRunnerProvider;
} // namespace cc
namespace viz {
struct BeginFrameArgs;
class CompositorFrameSinkSupport;
// Implements the Viz LayerContext API backed by a LayerTreeHostImpl. This
// provides the service backend for a client-side VizLayerContext.
class VIZ_SERVICE_EXPORT LayerContextImpl : public cc::LayerTreeHostImplClient,
public cc::LayerTreeFrameSink,
public mojom::LayerContext {
public:
// Constructs a new LayerContextImpl which submits frames to the local
// `compositor_sink` with client connection details given by `context`.
LayerContextImpl(CompositorFrameSinkSupport* compositor_sink,
mojom::PendingLayerContext& context,
mojom::LayerContextSettingsPtr settings);
// Static factory method for testing purposes. The created object's lifetime
// is not managed by this function.
static std::unique_ptr<LayerContextImpl> CreateForTesting(
CompositorFrameSinkSupport* compositor_sink,
mojom::LayerContextSettingsPtr settings);
~LayerContextImpl() override;
void BeginFrame(const BeginFrameArgs& args);
base::expected<void, std::string> DoUpdateDisplayTree(
mojom::LayerTreeUpdatePtr update);
base::expected<void, std::string> DoUpdateDisplayTiling(
mojom::TilingPtr tiling,
bool update_damage);
void DoDraw(const BeginFrameArgs& begin_frame_args,
base::TimeTicks start_update_display_tree);
// Receive exported resources returned from the frame sink.
void ReceiveReturnsFromParent(std::vector<ReturnedResource> resources);
cc::LayerTreeHostImpl* host_impl() const { return host_impl_.get(); }
private:
// Private constructor that all other constructors/factory methods delegate
// to.
LayerContextImpl(
CompositorFrameSinkSupport* compositor_sink,
mojom::LayerContextSettingsPtr settings,
mojo::PendingAssociatedReceiver<mojom::LayerContext> receiver_pipe,
mojo::PendingAssociatedRemote<mojom::LayerContextClient> client_pipe);
// cc::LayerTreeHostImplClient:
void DidLoseLayerTreeFrameSinkOnImplThread() override;
void SetBeginFrameSource(BeginFrameSource* source) override;
void DidReceiveCompositorFrameAckOnImplThread() override;
void OnCanDrawStateChanged(bool can_draw) override;
void NotifyReadyToActivate() override;
bool IsReadyToActivate() override;
void NotifyReadyToDraw() override;
void SetNeedsRedrawOnImplThread() override;
void SetNeedsOneBeginImplFrameOnImplThread() override;
void SetNeedsPrepareTilesOnImplThread() override;
void SetNeedsCommitOnImplThread(bool urgent) override;
void SetVideoNeedsBeginFrames(bool needs_begin_frames) override;
void SetDeferBeginMainFrameFromImpl(bool defer_begin_main_frame) override;
bool IsInsideDraw() override;
void RenewTreePriority() override;
void PostDelayedAnimationTaskOnImplThread(base::OnceClosure task,
base::TimeDelta delay) override;
void DidActivateSyncTree() override;
void DidPrepareTiles() override;
void DidCompletePageScaleAnimationOnImplThread() override;
void OnDrawForLayerTreeFrameSink(bool resourceless_software_draw,
bool skip_draw) override;
void SetNeedsImplSideInvalidation(
bool needs_first_draw_on_activation) override;
void NotifyImageDecodeRequestFinished(int request_id,
bool speculative,
bool decode_succeeded) override;
void NotifyTransitionRequestFinished(
uint32_t sequence_id,
const ViewTransitionElementResourceRects&) override;
void DidPresentCompositorFrameOnImplThread(
uint32_t frame_token,
cc::PresentationTimeCallbackBuffer::PendingCallbacks callbacks,
const FrameTimingDetails& details) override;
void NotifyAnimationWorkletStateChange(
cc::AnimationWorkletMutationState state,
cc::ElementListType element_list_type) override;
void NotifyPaintWorkletStateChange(
cc::Scheduler::PaintWorkletState state) override;
void NotifyCompositorMetricsTrackerResults(
cc::CustomTrackerResults results) override;
bool IsInSynchronousComposite() const override;
void FrameSinksToThrottleUpdated(
const base::flat_set<FrameSinkId>& ids) override;
void ClearHistory() override;
void SetHasActiveThreadedScroll(bool is_scrolling) override;
void SetWaitingForScrollEvent(bool waiting_for_scroll_event) override;
void ReturnResource(ReturnedResource returned_resource) override;
size_t CommitDurationSampleCountForTesting() const override;
void DidObserveFirstScrollDelay(
int source_frame_number,
base::TimeDelta first_scroll_delay,
base::TimeTicks first_scroll_timestamp) override;
// cc::LayerTreeFrameSink:
bool BindToClient(cc::LayerTreeFrameSinkClient* client) override;
void DetachFromClient() override;
void SetLocalSurfaceId(const LocalSurfaceId& local_surface_id) override;
void SubmitCompositorFrame(CompositorFrame frame,
bool hit_test_data_changed) override;
void DidNotProduceFrame(const BeginFrameAck& ack,
cc::FrameSkippedReason reason) override;
void NotifyNewLocalSurfaceIdExpectedWhilePaused() override;
// mojom::LayerContext:
void SetVisible(bool visible) override;
void UpdateDisplayTree(mojom::LayerTreeUpdatePtr update) override;
void UpdateDisplayTiling(mojom::TilingPtr tiling,
bool update_damage) override;
// Return any resources pending in |resources_to_return_| to the LayerContext
// client, via the frame sink.
void DoReturnResources();
void HandleBadMojoMessage(const std::string& function,
const std::string& error);
void DoDrawInternal(const BeginFrameArgs& begin_frame_args,
base::TimeTicks start_update_display_tree);
void SendTilingsCleanupNotificationToClient();
const raw_ptr<CompositorFrameSinkSupport> compositor_sink_;
const std::unique_ptr<cc::AnimationHost> animation_host_{
cc::AnimationHost::CreateMainInstance()};
std::unique_ptr<mojo::AssociatedReceiver<mojom::LayerContext>> receiver_;
std::unique_ptr<mojo::AssociatedRemote<mojom::LayerContextClient>> client_;
const std::unique_ptr<cc::TaskRunnerProvider> task_runner_provider_;
const std::unique_ptr<cc::RenderingStatsInstrumentation> rendering_stats_;
std::vector<ReturnedResource> resources_to_return_;
raw_ptr<cc::LayerTreeFrameSinkClient> frame_sink_client_ = nullptr;
const std::unique_ptr<cc::LayerTreeHostImpl> host_impl_;
// Must be the last member to ensure this is destroyed first in the
// destruction order and invalidates all weak pointers.
base::WeakPtrFactory<LayerContextImpl> weak_factory_{this};
};
} // namespace viz
#endif // COMPONENTS_VIZ_SERVICE_LAYERS_LAYER_CONTEXT_IMPL_H_