1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
// Copyright 2015 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_FRAME_SINKS_COMPOSITOR_FRAME_SINK_IMPL_H_
#define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_COMPOSITOR_FRAME_SINK_IMPL_H_
#include <memory>
#include <optional>
#include <variant>
#include <vector>
#include "base/memory/read_only_shared_memory_region.h"
#include "build/build_config.h"
#include "components/viz/common/surfaces/frame_sink_bundle_id.h"
#include "components/viz/common/surfaces/frame_sink_id.h"
#include "components/viz/common/surfaces/local_surface_id.h"
#include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
#include "mojo/public/cpp/bindings/direct_receiver.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/viz/public/mojom/compositing/compositor_frame_sink.mojom.h"
namespace viz {
class FrameSinkManagerImpl;
// The viz portion of a non-root CompositorFrameSink. Holds the
// Binding/InterfacePtr for the mojom::CompositorFrameSink interface.
class CompositorFrameSinkImpl : public mojom::CompositorFrameSink {
public:
CompositorFrameSinkImpl(
FrameSinkManagerImpl* frame_sink_manager,
const FrameSinkId& frame_sink_id,
std::optional<FrameSinkBundleId> bundle_id,
mojo::PendingReceiver<mojom::CompositorFrameSink> receiver,
mojo::PendingRemote<mojom::CompositorFrameSinkClient> client);
CompositorFrameSinkImpl(const CompositorFrameSinkImpl&) = delete;
CompositorFrameSinkImpl& operator=(const CompositorFrameSinkImpl&) = delete;
~CompositorFrameSinkImpl() override;
// mojom::CompositorFrameSink:
void SetNeedsBeginFrame(bool needs_begin_frame) override;
void SetWantsAnimateOnlyBeginFrames() override;
void SetAutoNeedsBeginFrame() override;
void SubmitCompositorFrame(
const LocalSurfaceId& local_surface_id,
CompositorFrame frame,
std::optional<HitTestRegionList> hit_test_region_list,
uint64_t submit_time) override;
void SubmitCompositorFrameSync(
const LocalSurfaceId& local_surface_id,
CompositorFrame frame,
std::optional<HitTestRegionList> hit_test_region_list,
uint64_t submit_time,
SubmitCompositorFrameSyncCallback callback) override;
void DidNotProduceFrame(const BeginFrameAck& begin_frame_ack) override;
void NotifyNewLocalSurfaceIdExpectedWhilePaused() override;
void BindLayerContext(mojom::PendingLayerContextPtr context,
bool draw_mode_is_gpu) override;
#if BUILDFLAG(IS_ANDROID)
void SetThreads(const std::vector<Thread>& threads) override;
#endif
private:
void SubmitCompositorFrameInternal(
const LocalSurfaceId& local_surface_id,
CompositorFrame frame,
std::optional<HitTestRegionList> hit_test_region_list,
uint64_t submit_time,
mojom::CompositorFrameSink::SubmitCompositorFrameSyncCallback);
void OnClientConnectionLost();
mojo::Remote<mojom::CompositorFrameSinkClient> compositor_frame_sink_client_;
std::unique_ptr<mojom::CompositorFrameSinkClient> proxying_client_;
using Receiver = mojo::Receiver<mojom::CompositorFrameSink>;
using DirectReceiver = mojo::DirectReceiver<mojom::CompositorFrameSink>;
std::variant<Receiver, DirectReceiver> compositor_frame_sink_receiver_;
// Must be destroyed before |compositor_frame_sink_client_|. This must never
// change for the lifetime of CompositorFrameSinkImpl.
const std::unique_ptr<CompositorFrameSinkSupport> support_;
};
} // namespace viz
#endif // COMPONENTS_VIZ_SERVICE_FRAME_SINKS_COMPOSITOR_FRAME_SINK_IMPL_H_
|