blob: dde8bfcbfeeb6a02c2726601acc4678eb22b3ce7 [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 "base/memory/raw_ptr.h"
#include "base/types/expected.h"
#include "cc/animation/animation_host.h"
#include "cc/trees/layer_tree_frame_sink.h"
#include "cc/trees/layer_tree_host_impl.h"
#include "mojo/public/cpp/bindings/associated_receiver.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "services/viz/public/mojom/compositing/layer_context.mojom.h"
namespace cc {
class RenderingStatsInstrumentation;
} // 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 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);
~LayerContextImpl() override;
void BeginFrame(const BeginFrameArgs& args);
private:
// 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(cc::RedrawReason reason) override;
void SetNeedsOneBeginImplFrameOnImplThread() override;
void SetNeedsUpdateDisplayTreeOnImplThread() override;
void SetNeedsPrepareTilesOnImplThread() override;
void SetNeedsCommitOnImplThread() 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,
cc::RedrawReason reason) override;
void NotifyImageDecodeRequestFinished(int request_id,
bool decode_succeeded) override;
void NotifyTransitionRequestFinished(uint32_t sequence_id) 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 NotifyThroughputTrackerResults(
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;
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 DidAllocateSharedBitmap(base::ReadOnlySharedMemoryRegion region,
const SharedBitmapId& id) override;
void DidDeleteSharedBitmap(const SharedBitmapId& id) override;
// mojom::LayerContext:
void SetVisible(bool visible) override;
void UpdateDisplayTree(mojom::LayerTreeUpdatePtr update) override;
base::expected<void, std::string> DoUpdateDisplayTree(
mojom::LayerTreeUpdatePtr update);
const raw_ptr<CompositorFrameSinkSupport> compositor_sink_;
const std::unique_ptr<cc::AnimationHost> animation_host_{
cc::AnimationHost::CreateMainInstance()};
mojo::AssociatedReceiver<mojom::LayerContext> receiver_;
mojo::AssociatedRemote<mojom::LayerContextClient> client_;
const std::unique_ptr<cc::TaskRunnerProvider> task_runner_provider_;
const std::unique_ptr<cc::RenderingStatsInstrumentation> rendering_stats_;
const std::unique_ptr<cc::LayerTreeHostImpl> host_impl_;
raw_ptr<cc::LayerTreeFrameSinkClient> frame_sink_client_ = nullptr;
};
} // namespace viz
#endif // COMPONENTS_VIZ_SERVICE_LAYERS_LAYER_CONTEXT_IMPL_H_