#ifndef CC_TREES_LAYER_TREE_FRAME_SINK_H_
#define CC_TREES_LAYER_TREE_FRAME_SINK_H_
#include <deque>
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/memory/read_only_shared_memory_region.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_checker.h"
#include "cc/cc_export.h"
#include "cc/scheduler/scheduler.h"
#include "cc/trees/raster_context_provider_wrapper.h"
#include "components/viz/client/shared_bitmap_reporter.h"
#include "components/viz/common/gpu/context_lost_observer.h"
#include "components/viz/common/gpu/context_provider.h"
#include "components/viz/common/gpu/raster_context_provider.h"
#include "components/viz/common/resources/returned_resource.h"
#include "ui/gfx/color_space.h"
namespace gpu {
class GpuMemoryBufferManager;
}
namespace viz {
class CompositorFrame;
class LocalSurfaceId;
struct BeginFrameAck;
}
namespace cc {
class LayerTreeFrameSinkClient;
class CC_EXPORT LayerTreeFrameSink : public viz::SharedBitmapReporter,
public viz::ContextLostObserver {
public:
LayerTreeFrameSink(
scoped_refptr<viz::ContextProvider> context_provider,
scoped_refptr<RasterContextProviderWrapper>
worker_context_provider_wrapper,
scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner,
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager);
LayerTreeFrameSink(const LayerTreeFrameSink&) = delete;
~LayerTreeFrameSink() override;
LayerTreeFrameSink& operator=(const LayerTreeFrameSink&) = delete;
base::WeakPtr<LayerTreeFrameSink> GetWeakPtr();
virtual bool BindToClient(LayerTreeFrameSinkClient* client);
virtual void DetachFromClient();
bool HasClient() { return !!client_; }
void set_source_frame_number(int64_t frame_number) {
source_frame_number_ = frame_number;
}
viz::ContextProvider* context_provider() const {
return context_provider_.get();
}
RasterContextProviderWrapper* worker_context_provider_wrapper() const {
return worker_context_provider_wrapper_.get();
}
viz::RasterContextProvider* worker_context_provider() const {
return worker_context_provider_wrapper_
? worker_context_provider_wrapper_->GetContext().get()
: nullptr;
}
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager() const {
return gpu_memory_buffer_manager_;
}
virtual void SetLocalSurfaceId(const viz::LocalSurfaceId& local_surface_id) {}
virtual void Invalidate(bool needs_draw) {}
virtual void SubmitCompositorFrame(viz::CompositorFrame frame,
bool hit_test_data_changed) = 0;
virtual void DidNotProduceFrame(const viz::BeginFrameAck& ack,
FrameSkippedReason reason) = 0;
void DidAllocateSharedBitmap(base::ReadOnlySharedMemoryRegion region,
const viz::SharedBitmapId& id) override = 0;
void DidDeleteSharedBitmap(const viz::SharedBitmapId& id) override = 0;
#if BUILDFLAG(IS_OHOS)
virtual void TriggerVsyncImplTask() = 0;
virtual void SetHandledTouchEvent(bool handledTouchEvent) = 0;
#endif
protected:
class ContextLostForwarder;
void OnContextLost() override;
raw_ptr<LayerTreeFrameSinkClient> client_ = nullptr;
scoped_refptr<viz::ContextProvider> context_provider_;
scoped_refptr<RasterContextProviderWrapper> worker_context_provider_wrapper_;
scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
raw_ptr<gpu::GpuMemoryBufferManager> gpu_memory_buffer_manager_;
std::unique_ptr<ContextLostForwarder> worker_context_lost_forwarder_;
int64_t source_frame_number_;
private:
THREAD_CHECKER(thread_checker_);
base::WeakPtrFactory<LayerTreeFrameSink> weak_ptr_factory_{this};
};
}
#endif