1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef UI_COMPOSITOR_TEST_DIRECT_LAYER_TREE_FRAME_SINK_H_ 6 #define UI_COMPOSITOR_TEST_DIRECT_LAYER_TREE_FRAME_SINK_H_ 7 8 #include "base/memory/read_only_shared_memory_region.h" 9 #include "base/single_thread_task_runner.h" 10 #include "base/threading/thread_checker.h" 11 #include "cc/trees/layer_tree_frame_sink.h" 12 #include "components/viz/common/frame_sinks/begin_frame_source.h" 13 #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h" 14 #include "components/viz/service/display/display_client.h" 15 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h" 16 #include "services/viz/public/mojom/compositing/compositor_frame_sink.mojom.h" 17 18 namespace viz { 19 class Display; 20 class FrameSinkManagerImpl; 21 } // namespace viz 22 23 namespace ui { 24 25 // This class submits compositor frames to an in-process Display, with the 26 // client's frame being the root surface of the Display. 27 class DirectLayerTreeFrameSink : public cc::LayerTreeFrameSink, 28 public viz::mojom::CompositorFrameSinkClient, 29 public viz::ExternalBeginFrameSourceClient, 30 public viz::DisplayClient { 31 public: 32 // |frame_sink_manager| and |display| must outlive this class. 33 DirectLayerTreeFrameSink( 34 const viz::FrameSinkId& frame_sink_id, 35 viz::FrameSinkManagerImpl* frame_sink_manager, 36 viz::Display* display, 37 scoped_refptr<viz::ContextProvider> context_provider, 38 scoped_refptr<viz::RasterContextProvider> worker_context_provider, 39 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, 40 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager); 41 42 DirectLayerTreeFrameSink(const DirectLayerTreeFrameSink& other) = delete; 43 DirectLayerTreeFrameSink& operator=(const DirectLayerTreeFrameSink& other) = 44 delete; 45 46 ~DirectLayerTreeFrameSink() override; 47 48 // cc::LayerTreeFrameSink implementation. 49 bool BindToClient(cc::LayerTreeFrameSinkClient* client) override; 50 void DetachFromClient() override; 51 void SubmitCompositorFrame(viz::CompositorFrame frame, 52 bool hit_test_data_changed, 53 bool show_hit_test_borders) override; 54 void DidNotProduceFrame(const viz::BeginFrameAck& ack) override; 55 void DidAllocateSharedBitmap(base::ReadOnlySharedMemoryRegion region, 56 const viz::SharedBitmapId& id) override; 57 void DidDeleteSharedBitmap(const viz::SharedBitmapId& id) override; 58 59 // viz::DisplayClient implementation. 60 void DisplayOutputSurfaceLost() override; 61 void DisplayWillDrawAndSwap( 62 bool will_draw_and_swap, 63 viz::AggregatedRenderPassList* render_passes) override; DisplayDidDrawAndSwap()64 void DisplayDidDrawAndSwap() override {} DisplayDidReceiveCALayerParams(const gfx::CALayerParams & ca_layer_params)65 void DisplayDidReceiveCALayerParams( 66 const gfx::CALayerParams& ca_layer_params) override {} DisplayDidCompleteSwapWithSize(const gfx::Size & pixel_size)67 void DisplayDidCompleteSwapWithSize(const gfx::Size& pixel_size) override {} SetWideColorEnabled(bool enabled)68 void SetWideColorEnabled(bool enabled) override {} SetPreferredFrameInterval(base::TimeDelta interval)69 void SetPreferredFrameInterval(base::TimeDelta interval) override {} 70 base::TimeDelta GetPreferredFrameIntervalForFrameSinkId( 71 const viz::FrameSinkId& id, 72 viz::mojom::CompositorFrameSinkType* type) override; 73 74 private: 75 // viz::mojom::CompositorFrameSinkClient implementation: 76 void DidReceiveCompositorFrameAck( 77 const std::vector<viz::ReturnedResource>& resources) override; 78 void OnBeginFrame(const viz::BeginFrameArgs& args, 79 const viz::FrameTimingDetailsMap& timing_details) override; 80 void ReclaimResources( 81 const std::vector<viz::ReturnedResource>& resources) override; 82 void OnBeginFramePausedChanged(bool paused) override; 83 84 // viz::ExternalBeginFrameSourceClient implementation: 85 void OnNeedsBeginFrames(bool needs_begin_frames) override; 86 87 void DidReceiveCompositorFrameAckInternal( 88 const std::vector<viz::ReturnedResource>& resources); 89 90 // This class is only meant to be used on a single thread. 91 THREAD_CHECKER(thread_checker_); 92 93 std::unique_ptr<viz::CompositorFrameSinkSupport> support_; 94 95 bool needs_begin_frames_ = false; 96 const viz::FrameSinkId frame_sink_id_; 97 viz::FrameSinkManagerImpl* frame_sink_manager_; 98 viz::ParentLocalSurfaceIdAllocator parent_local_surface_id_allocator_; 99 viz::Display* display_; 100 gfx::Size last_swap_frame_size_; 101 float device_scale_factor_ = 1.f; 102 bool is_lost_ = false; 103 std::unique_ptr<viz::ExternalBeginFrameSource> begin_frame_source_; 104 105 viz::HitTestRegionList last_hit_test_data_; 106 107 base::WeakPtrFactory<DirectLayerTreeFrameSink> weak_factory_{this}; 108 }; 109 110 } // namespace ui 111 112 #endif // UI_COMPOSITOR_TEST_DIRECT_LAYER_TREE_FRAME_SINK_H_ 113