blob: 6bc5a7233ef50aca31892ebd6a5631a601b8d2e6 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_BEGIN_FRAME_PROVIDER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_BEGIN_FRAME_PROVIDER_H_
#include <string>
#include "base/notreached.h"
#include "base/task/single_thread_task_runner.h"
#include "mojo/public/cpp/bindings/pending_receiver.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-blink.h"
#include "third_party/blink/public/mojom/frame_sinks/embedded_frame_sink.mojom-blink.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
#include "third_party/blink/renderer/platform/platform_export.h"
namespace blink {
struct BeginFrameProviderParams;
class PLATFORM_EXPORT BeginFrameProviderClient : public GarbageCollectedMixin {
public:
virtual void BeginFrame(const viz::BeginFrameArgs&) = 0;
virtual scoped_refptr<base::SingleThreadTaskRunner>
GetCompositorTaskRunner() = 0;
virtual ~BeginFrameProviderClient() = default;
};
class PLATFORM_EXPORT BeginFrameProvider
: public GarbageCollected<BeginFrameProvider>,
public viz::mojom::blink::CompositorFrameSinkClient,
public mojom::blink::EmbeddedFrameSinkClient {
public:
BeginFrameProvider(
const BeginFrameProviderParams& begin_frame_provider_params,
BeginFrameProviderClient* client,
ContextLifecycleNotifier* context);
void CreateCompositorFrameSinkIfNeeded();
void RequestBeginFrame();
void FinishBeginFrame(const viz::BeginFrameArgs&);
// viz::mojom::blink::CompositorFrameSinkClient implementation.
void DidReceiveCompositorFrameAck(
WTF::Vector<viz::ReturnedResource> resources) final {
NOTIMPLEMENTED();
}
void OnBeginFrame(const viz::BeginFrameArgs&,
const WTF::HashMap<uint32_t, viz::FrameTimingDetails>&,
bool frame_ack,
WTF::Vector<viz::ReturnedResource> resources) final;
void OnBeginFramePausedChanged(bool paused) final {}
void ReclaimResources(WTF::Vector<viz::ReturnedResource> resources) final {
NOTIMPLEMENTED();
}
void OnCompositorFrameTransitionDirectiveProcessed(
uint32_t sequence_id) final {
NOTIMPLEMENTED();
}
void OnSurfaceEvicted(const viz::LocalSurfaceId& local_surface_id) final {
NOTIMPLEMENTED();
}
// viz::mojom::blink::EmbeddedFrameSinkClient implementation.
void BindSurfaceEmbedder(
mojo::PendingReceiver<mojom::blink::SurfaceEmbedder> receiver) override {
NOTIMPLEMENTED();
}
void ResetCompositorFrameSink();
bool IsValidFrameProvider();
void Trace(Visitor*) const;
~BeginFrameProvider() override = default;
private:
void OnMojoConnectionError(uint32_t custom_reason,
const std::string& description);
bool needs_begin_frame_;
bool requested_needs_begin_frame_;
HeapMojoReceiver<viz::mojom::blink::CompositorFrameSinkClient,
BeginFrameProvider>
cfs_receiver_;
HeapMojoReceiver<mojom::blink::EmbeddedFrameSinkClient, BeginFrameProvider>
efs_receiver_;
viz::FrameSinkId frame_sink_id_;
viz::FrameSinkId parent_frame_sink_id_;
HeapMojoRemote<viz::mojom::blink::CompositorFrameSink> compositor_frame_sink_;
Member<BeginFrameProviderClient> begin_frame_client_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_BEGIN_FRAME_PROVIDER_H_