From f23869b3635cdbe19d82033e0adcc277c48f963b Mon Sep 17 00:00:00 2001 From: s00454986 Date: Tue, 10 Oct 2023 06:12:08 +0000 Subject: [PATCH] descript:send externalbeginframe when scrollupdate Signed-off-by: s00454986 Change-Id: I78488e67d7a2668fd417d2551814c14092ec746a --- cc/input/compositor_input_interfaces.h | 4 ++++ cc/input/input_handler.h | 3 +++ cc/input/threaded_input_handler.cc | 9 +++++++++ cc/input/threaded_input_handler.h | 4 ++++ cc/scheduler/scheduler.cc | 6 ++++++ cc/scheduler/scheduler.h | 4 +++- cc/trees/layer_tree_host_impl.cc | 8 ++++++++ cc/trees/layer_tree_host_impl.h | 4 ++++ cc/trees/proxy_impl.cc | 7 +++++++ cc/trees/proxy_impl.h | 3 +++ components/viz/common/frame_sinks/begin_frame_args.h | 4 ++++ .../viz/common/frame_sinks/begin_frame_source.h | 4 ++++ components/viz/host/host_frame_sink_manager.cc | 4 ++++ components/viz/host/host_frame_sink_manager.h | 4 ++++ .../frame_sinks/external_begin_frame_source_ohos.cc | 12 ++++++++++++ .../frame_sinks/external_begin_frame_source_ohos.h | 2 ++ .../service/frame_sinks/frame_sink_manager_impl.cc | 6 ++++++ .../service/frame_sinks/frame_sink_manager_impl.h | 3 +++ .../frame_sinks/root_compositor_frame_sink_impl.cc | 4 ++++ .../frame_sinks/root_compositor_frame_sink_impl.h | 2 ++ .../compositor/viz_process_transport_factory.cc | 6 ++++++ .../compositor/viz_process_transport_factory.h | 3 +++ .../browser/renderer_host/render_widget_host_impl.cc | 9 +++++++++ .../browser/renderer_host/render_widget_host_impl.h | 4 ++++ .../renderer_host/render_widget_host_view_base.h | 3 +++ .../mojom/compositing/frame_sink_manager.mojom | 3 +++ .../cpp/compositing/begin_frame_args_mojom_traits.cc | 3 +++ .../cpp/compositing/begin_frame_args_mojom_traits.h | 5 +++++ .../public/mojom/compositing/begin_frame_args.mojom | 2 ++ ui/compositor/compositor.cc | 6 ++++++ ui/compositor/compositor.h | 8 +++++++- 31 files changed, 147 insertions(+), 2 deletions(-) diff --git a/cc/input/compositor_input_interfaces.h b/cc/input/compositor_input_interfaces.h index dcbd420b2c..30d0d9e4a8 100644 --- a/cc/input/compositor_input_interfaces.h +++ b/cc/input/compositor_input_interfaces.h @@ -83,6 +83,10 @@ class InputDelegateForCompositor { // the touchmoves. In that case, we latch and have a CurrentlyScrollingNode() // but will never receive a ScrollUpdate. virtual ActivelyScrollingType GetActivelyScrollingType() const = 0; + +#if BUILDFLAG(IS_OHOS) + virtual void HandleScrollUpdateForInternalBeginFrame(const viz::BeginFrameArgs& args) {}; +#endif }; // This is the interface that's exposed by the LayerTreeHostImpl to the input diff --git a/cc/input/input_handler.h b/cc/input/input_handler.h index a242013bb0..65b94f8b37 100644 --- a/cc/input/input_handler.h +++ b/cc/input/input_handler.h @@ -116,6 +116,9 @@ class CC_EXPORT InputHandlerClient { float max_page_scale_factor) = 0; virtual void DeliverInputForBeginFrame(const viz::BeginFrameArgs& args) = 0; virtual void DeliverInputForHighLatencyMode() = 0; +#if BUILDFLAG(IS_OHOS) + virtual void WillHandleScrollUpdateForInternalBeginFrame(const viz::BeginFrameArgs& args) {}; +#endif protected: InputHandlerClient() = default; diff --git a/cc/input/threaded_input_handler.cc b/cc/input/threaded_input_handler.cc index fc0b6c4f2e..2c68e89ef4 100644 --- a/cc/input/threaded_input_handler.cc +++ b/cc/input/threaded_input_handler.cc @@ -1192,6 +1192,15 @@ ActivelyScrollingType ThreadedInputHandler::GetActivelyScrollingType() const { return ActivelyScrollingType::kPrecise; } +#if BUILDFLAG(IS_OHOS) +void ThreadedInputHandler::HandleScrollUpdateForInternalBeginFrame(const viz::BeginFrameArgs& args) { + TRACE_EVENT0("cc", "ThreadedInputHandler::HandleScrollUpdateForInternalBeginFrame"); + input_handler_client_->WillHandleScrollUpdateForInternalBeginFrame(args); + scrollbar_controller_->WillBeginImplFrame(); + input_handler_client_->DeliverInputForBeginFrame(args); +}; +#endif + ScrollNode* ThreadedInputHandler::CurrentlyScrollingNode() { return GetScrollTree().CurrentlyScrollingNode(); } diff --git a/cc/input/threaded_input_handler.h b/cc/input/threaded_input_handler.h index ff554e8562..8951433fe3 100644 --- a/cc/input/threaded_input_handler.h +++ b/cc/input/threaded_input_handler.h @@ -125,6 +125,10 @@ class CC_EXPORT ThreadedInputHandler : public InputHandler, bool IsCurrentlyScrolling() const override; ActivelyScrollingType GetActivelyScrollingType() const override; +#if BUILDFLAG(IS_OHOS) + void HandleScrollUpdateForInternalBeginFrame(const viz::BeginFrameArgs& args) override; +#endif + // =========== Public Interface bool CanConsumeDelta(const ScrollState& scroll_state, diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc index 09f27ac9a8..519e8cf379 100644 --- a/cc/scheduler/scheduler.cc +++ b/cc/scheduler/scheduler.cc @@ -365,6 +365,12 @@ void Scheduler::OnBeginFrameSourcePausedChanged(bool paused) { // a BeginRetroFrame. bool Scheduler::OnBeginFrameDerivedImpl(const viz::BeginFrameArgs& args) { TRACE_EVENT1("cc,benchmark", "Scheduler::BeginFrame", "args", args.AsValue()); +#if BUILDFLAG(IS_OHOS) + if (args.internal_frame) { + TRACE_EVENT0("cc,benchmark", "Scheduler::internal_frame::scrollupdate"); + client_->HandleScrollUpdateForInternalBeginFrame(args); + } +#endif // If the begin frame interval is different than last frame and bigger than // zero then let |client_| know about the new interval for animations. In diff --git a/cc/scheduler/scheduler.h b/cc/scheduler/scheduler.h index 7e2b30fae2..828ec20b8a 100644 --- a/cc/scheduler/scheduler.h +++ b/cc/scheduler/scheduler.h @@ -89,7 +89,9 @@ class SchedulerClient { // Functions used for reporting animation targeting UMA, crbug.com/758439. virtual bool HasInvalidationAnimation() const = 0; - +#if BUILDFLAG(IS_OHOS) + virtual void HandleScrollUpdateForInternalBeginFrame(const viz::BeginFrameArgs& args) {}; +#endif protected: virtual ~SchedulerClient() {} }; diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index afd8f34fae..253eb2f5d8 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc @@ -3058,6 +3058,14 @@ bool LayerTreeHostImpl::WillBeginImplFrame(const viz::BeginFrameArgs& args) { return true; } +#if BUILDFLAG(IS_OHOS) +void LayerTreeHostImpl::HandleScrollUpdateForInternalBeginFrame(const viz::BeginFrameArgs& args) { + if (input_delegate_) { + input_delegate_->HandleScrollUpdateForInternalBeginFrame(args); + } +} +#endif + void LayerTreeHostImpl::DidFinishImplFrame(const viz::BeginFrameArgs& args) { frame_trackers_.NotifyFrameEnd(current_begin_frame_tracker_.Current(), args); impl_thread_phase_ = ImplThreadPhase::IDLE; diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h index 600a82a751..8ab90246e3 100644 --- a/cc/trees/layer_tree_host_impl.h +++ b/cc/trees/layer_tree_host_impl.h @@ -658,6 +658,10 @@ class CC_EXPORT LayerTreeHostImpl : public TileManagerClient, virtual void CreatePendingTree(); virtual void ActivateSyncTree(); +#if BUILDFLAG(IS_OHOS) + virtual void HandleScrollUpdateForInternalBeginFrame(const viz::BeginFrameArgs& args); +#endif + // Shortcuts to layers/nodes on the active tree. ScrollNode* InnerViewportScrollNode() const; ScrollNode* OuterViewportScrollNode() const; diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc index 5c28272a45..3df40e6d2f 100644 --- a/cc/trees/proxy_impl.cc +++ b/cc/trees/proxy_impl.cc @@ -432,6 +432,13 @@ bool ProxyImpl::HasInvalidationAnimation() const { return host_impl_->mutator_host()->HasInvalidationAnimation(); } +#if BUILDFLAG(IS_OHOS) +void ProxyImpl::HandleScrollUpdateForInternalBeginFrame(const viz::BeginFrameArgs& args) { + DCHECK(IsImplThread()); + host_impl_->HandleScrollUpdateForInternalBeginFrame(args); +} +#endif + bool ProxyImpl::IsInsideDraw() { return inside_draw_; } diff --git a/cc/trees/proxy_impl.h b/cc/trees/proxy_impl.h index ee4096b406..cf4c28bee9 100644 --- a/cc/trees/proxy_impl.h +++ b/cc/trees/proxy_impl.h @@ -157,6 +157,9 @@ class CC_EXPORT ProxyImpl : public LayerTreeHostImplClient, base::TimeTicks time) override; void FrameIntervalUpdated(base::TimeDelta interval) override {} bool HasInvalidationAnimation() const override; +#if BUILDFLAG(IS_OHOS) + void HandleScrollUpdateForInternalBeginFrame(const viz::BeginFrameArgs& args) override; +#endif DrawResult DrawInternal(bool forced_draw); diff --git a/components/viz/common/frame_sinks/begin_frame_args.h b/components/viz/common/frame_sinks/begin_frame_args.h index 3242ec4d6a..764e87cf83 100644 --- a/components/viz/common/frame_sinks/begin_frame_args.h +++ b/components/viz/common/frame_sinks/begin_frame_args.h @@ -189,6 +189,10 @@ struct VIZ_COMMON_EXPORT BeginFrameArgs { // sent. uint64_t frames_throttled_since_last = 0; +#if BUILDFLAG(IS_OHOS) + bool internal_frame = false; +#endif + private: BeginFrameArgs(uint64_t source_id, uint64_t sequence_number, diff --git a/components/viz/common/frame_sinks/begin_frame_source.h b/components/viz/common/frame_sinks/begin_frame_source.h index 481339af7a..78134051d5 100644 --- a/components/viz/common/frame_sinks/begin_frame_source.h +++ b/components/viz/common/frame_sinks/begin_frame_source.h @@ -241,6 +241,10 @@ class VIZ_COMMON_EXPORT BeginFrameSource { DynamicBeginFrameDeadlineOffsetSource* dynamic_begin_frame_deadline_offset_source); +#if BUILDFLAG(IS_OHOS) + virtual void SendInternalBeginFrame() {}; +#endif + protected: // Returns whether begin-frames to clients should be withheld (because the gpu // is still busy, for example). If this returns true, then OnGpuNoLongerBusy() diff --git a/components/viz/host/host_frame_sink_manager.cc b/components/viz/host/host_frame_sink_manager.cc index 88e4438d2a..d3303281d8 100644 --- a/components/viz/host/host_frame_sink_manager.cc +++ b/components/viz/host/host_frame_sink_manager.cc @@ -390,6 +390,10 @@ void HostFrameSinkManager::OnVsync(uint32_t client_id, uint32_t sink_id) { data.client->OnVsync(); } } + +void HostFrameSinkManager::SendInternalBeginFrame(const FrameSinkId& id) { + frame_sink_manager_->SendInternalBeginFrame(id); +} #endif uint32_t HostFrameSinkManager::CacheBackBufferForRootSink( diff --git a/components/viz/host/host_frame_sink_manager.h b/components/viz/host/host_frame_sink_manager.h index fc13740e75..68b2c5c4bc 100644 --- a/components/viz/host/host_frame_sink_manager.h +++ b/components/viz/host/host_frame_sink_manager.h @@ -221,6 +221,10 @@ class VIZ_HOST_EXPORT HostFrameSinkManager return debug_renderer_settings_; } +#if BUILDFLAG(IS_OHOS) + void SendInternalBeginFrame(const FrameSinkId& id); +#endif + private: friend class HostFrameSinkManagerTest; friend class HostFrameSinkManagerTestApi; diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_ohos.cc b/components/viz/service/frame_sinks/external_begin_frame_source_ohos.cc index 5279cd02c8..b3d1222b5e 100644 --- a/components/viz/service/frame_sinks/external_begin_frame_source_ohos.cc +++ b/components/viz/service/frame_sinks/external_begin_frame_source_ohos.cc @@ -44,6 +44,17 @@ ExternalBeginFrameSourceOHOS::ExternalBeginFrameSourceOHOS( base::ThreadTaskRunnerHandle::Get(), weak_factory_.GetWeakPtr()); } +void ExternalBeginFrameSourceOHOS::SendInternalBeginFrame() { + TRACE_EVENT0("viz", "ExternalBeginFrameSourceOHOS::SendInternalBeginFrame"); + base::TimeDelta vsync_period(base::Nanoseconds(vsync_period_)); + base::TimeTicks frame_time = base::TimeTicks::Now(); + auto begin_frame_args = begin_frame_args_generator_.GenerateBeginFrameArgs( + source_id(), frame_time, last_dead_line_, vsync_period); + + begin_frame_args.internal_frame = true; + OnBeginFrame(begin_frame_args); +} + ExternalBeginFrameSourceOHOS::~ExternalBeginFrameSourceOHOS() { LOG(INFO) << "ExternalBeginFrameSourceOHOS destructor!!!"; SetEnabled(false); @@ -89,6 +100,7 @@ void ExternalBeginFrameSourceOHOS::OnVSyncImpl(int64_t timestamp, base::TimeDelta vsync_period(base::Nanoseconds(vsync_period_)); base::TimeTicks frame_time = base::TimeTicks() + base::Nanoseconds(timestamp); base::TimeTicks deadline = frame_time + vsync_period; + last_dead_line_ = deadline; TRACE_EVENT2("viz", "ExternalBeginFrameSourceOHOS::OnVSyncImpl", "frame_time", frame_time, "deadline", deadline); auto begin_frame_args = begin_frame_args_generator_.GenerateBeginFrameArgs( diff --git a/components/viz/service/frame_sinks/external_begin_frame_source_ohos.h b/components/viz/service/frame_sinks/external_begin_frame_source_ohos.h index 704beef9ef..4c176ab868 100644 --- a/components/viz/service/frame_sinks/external_begin_frame_source_ohos.h +++ b/components/viz/service/frame_sinks/external_begin_frame_source_ohos.h @@ -29,6 +29,7 @@ class VIZ_SERVICE_EXPORT ExternalBeginFrameSourceOHOS void SetDynamicBeginFrameDeadlineOffsetSource( DynamicBeginFrameDeadlineOffsetSource* dynamic_begin_frame_deadline_offset_source) override; + void SendInternalBeginFrame() override; static void OnVSync(int64_t timestamp, void* data); class VSyncUserData; @@ -56,6 +57,7 @@ class VIZ_SERVICE_EXPORT ExternalBeginFrameSourceOHOS int64_t vsync_period_ = 16666666; int64_t pre_vsync_period_ = 0; int64_t last_vsync_period_ = 0; + base::TimeTicks last_dead_line_ = base::TimeTicks(); base::WeakPtrFactory weak_factory_{this}; }; } // namespace viz diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc index cc3eb20211..01a26e4cd3 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc @@ -709,6 +709,12 @@ void FrameSinkManagerImpl::Throttle(const std::vector& ids, UpdateThrottling(); } +#if BUILDFLAG(IS_OHOS) +void FrameSinkManagerImpl::SendInternalBeginFrame(const FrameSinkId& id) { + root_sink_map_[id]->SendInternalBeginFrame(); +} +#endif + void FrameSinkManagerImpl::UpdateThrottling() { // Clear previous throttling effect on all frame sinks. for (auto& support_map_item : support_map_) { diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.h b/components/viz/service/frame_sinks/frame_sink_manager_impl.h index 5d93588fa1..dcd8f4676b 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h @@ -150,6 +150,9 @@ class VIZ_SERVICE_EXPORT FrameSinkManagerImpl const DebugRendererSettings& debug_settings) override; void Throttle(const std::vector& ids, base::TimeDelta interval) override; +#if BUILDFLAG(IS_OHOS) + void SendInternalBeginFrame(const FrameSinkId& id) override; +#endif void DestroyFrameSinkBundle(const FrameSinkBundleId& id); diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc index 4f1edab87f..40c53dee64 100644 --- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc +++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc @@ -566,6 +566,10 @@ void RootCompositorFrameSinkImpl::SetCurrentFrameSinkId( const FrameSinkId& frame_sink_id) { external_begin_frame_source_->SetCurrentFrameSinkId(frame_sink_id); }; + +void RootCompositorFrameSinkImpl::SendInternalBeginFrame() { + external_begin_frame_source_->SendInternalBeginFrame(); +} #endif void RootCompositorFrameSinkImpl::SetWideColorEnabled(bool enabled) { diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h index 82c027f3b3..78f6b1fac7 100644 --- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h +++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h @@ -126,6 +126,8 @@ class VIZ_SERVICE_EXPORT RootCompositorFrameSinkImpl int32_t process_id, bool is_created) override {}; void SetCurrentFrameSinkId(const FrameSinkId& frame_sink_id) override; + + void SendInternalBeginFrame(); #endif base::ScopedClosureRunner GetCacheBackBufferCb(); diff --git a/content/browser/compositor/viz_process_transport_factory.cc b/content/browser/compositor/viz_process_transport_factory.cc index 7cae640bea..117dd0b77b 100644 --- a/content/browser/compositor/viz_process_transport_factory.cc +++ b/content/browser/compositor/viz_process_transport_factory.cc @@ -180,6 +180,12 @@ void VizProcessTransportFactory::ConnectHostFrameSinkManager() { } } +#if BUILDFLAG(IS_OHOS) +void VizProcessTransportFactory::SendInternalBeginFrame(const viz::FrameSinkId& id) { + GetHostFrameSinkManager()->SendInternalBeginFrame(id); +} +#endif + void VizProcessTransportFactory::CreateLayerTreeFrameSink( base::WeakPtr compositor) { #if BUILDFLAG(IS_WIN) diff --git a/content/browser/compositor/viz_process_transport_factory.h b/content/browser/compositor/viz_process_transport_factory.h index 4473da8089..19f137c139 100644 --- a/content/browser/compositor/viz_process_transport_factory.h +++ b/content/browser/compositor/viz_process_transport_factory.h @@ -71,6 +71,9 @@ class VizProcessTransportFactory : public ui::ContextFactory, override; scoped_refptr SharedMainThreadRasterContextProvider() override; +#if BUILDFLAG(IS_OHOS) + void SendInternalBeginFrame(const viz::FrameSinkId& id) override; +#endif void RemoveCompositor(ui::Compositor* compositor) override; gpu::GpuMemoryBufferManager* GetGpuMemoryBufferManager() override; diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index d2c6d4c57a..5fdb76e68e 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -1688,6 +1688,15 @@ void RenderWidgetHostImpl::ForwardGestureEventWithLatencyInfo( DispatchInputEventWithLatencyInfo(gesture_event, &gesture_with_latency.latency); input_router_->SendGestureEvent(gesture_with_latency); +#if BUILDFLAG(IS_OHOS) + if (send_internal_begin_frame && gesture_event.GetType() == blink::WebInputEvent::Type::kGestureScrollUpdate) { + TRACE_EVENT0("input", "RenderWidgetHostImpl::SendInternalBeginFrame"); + send_internal_begin_frame = false; + view_->SendInternalBeginFrame(); + } else if (gesture_event.GetType() == blink::WebInputEvent::Type::kGestureScrollEnd) { + send_internal_begin_frame = true; + } +#endif } void RenderWidgetHostImpl::ForwardTouchEventWithLatencyInfo( diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index fc72ea7bb0..0e42aef094 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h @@ -1128,6 +1128,10 @@ class CONTENT_EXPORT RenderWidgetHostImpl raw_ptr frame_tree_; +#if BUILDFLAG(IS_OHOS) + bool send_internal_begin_frame = true; +#endif + // RenderWidgetHost are either: // - Owned by RenderViewHostImpl. // - Owned by RenderFrameHost, for local root iframes. diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index bf50bce147..96259ecab8 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h @@ -86,6 +86,9 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView { virtual void OnTooltipTextUpdated(const std::u16string& tooltip_text) = 0; }; +#if BUILDFLAG(IS_OHOS) + virtual void SendInternalBeginFrame() {}; +#endif // This function takes a (possibly invalid) pointer to // RenderWidgetHostViewBase, and returns -1 if was never valid, 0 if there was // once a valid object with that pointer that is now deallocated, and +1 if diff --git a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom index 9059970d64..3a764ca953 100644 --- a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom +++ b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom @@ -164,6 +164,9 @@ interface FrameSinkManager { // This allows dynamic manipulation of the viz debug options stored in // |debug_settings| (show_overdraw_feedback, etc.). UpdateDebugRendererSettings(DebugRendererSettings debug_settings); + + [EnableIf=is_ohos] + SendInternalBeginFrame(FrameSinkId frame_sink_id); }; // The FrameSinkManagerClient interface is implemented by the Display diff --git a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc index 6d58185e25..b50e1f08f2 100644 --- a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc +++ b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc @@ -59,6 +59,9 @@ bool StructTraits:: out->trace_id = data.trace_id(); out->on_critical_path = data.on_critical_path(); out->animate_only = data.animate_only(); +#if BUILDFLAG(IS_OHOS) + out->internal_frame = data.internal_frame(); +#endif return true; } diff --git a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h index bcc990f1d8..02799d35de 100644 --- a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h +++ b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h @@ -62,6 +62,11 @@ struct StructTraits { static bool animate_only(const viz::BeginFrameArgs& args) { return args.animate_only; } +#if BUILDFLAG(IS_OHOS) + static bool internal_frame(const viz::BeginFrameArgs& args) { + return args.internal_frame; + } +#endif static bool Read(viz::mojom::BeginFrameArgsDataView data, viz::BeginFrameArgs* out); diff --git a/services/viz/public/mojom/compositing/begin_frame_args.mojom b/services/viz/public/mojom/compositing/begin_frame_args.mojom index 25bbd23047..cacb248c0d 100644 --- a/services/viz/public/mojom/compositing/begin_frame_args.mojom +++ b/services/viz/public/mojom/compositing/begin_frame_args.mojom @@ -24,6 +24,8 @@ struct BeginFrameArgs { BeginFrameArgsType type; bool on_critical_path; bool animate_only; + [EnableIf=is_ohos] + bool internal_frame; }; // See components/viz/common/frame_sinks/begin_frame_args.h. diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index c7d3109afe..23a88eca40 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc @@ -667,6 +667,12 @@ void Compositor::IssueExternalBeginFrame( args, force, std::move(callback)); } +#if BUILDFLAG(IS_OHOS) +void Compositor::SendInternalBeginFrame() { + context_factory_->SendInternalBeginFrame(frame_sink_id()); +} +#endif + ThroughputTracker Compositor::RequestNewThroughputTracker() { return ThroughputTracker(next_throughput_tracker_id_++, weak_ptr_factory_.GetWeakPtr()); diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index 8730045ddd..d02cb84bbb 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h @@ -137,6 +137,10 @@ class COMPOSITOR_EXPORT ContextFactory { // Gets the frame sink manager host instance. virtual viz::HostFrameSinkManager* GetHostFrameSinkManager() = 0; + +#if BUILDFLAG(IS_OHOS) + virtual void SendInternalBeginFrame(const viz::FrameSinkId& id) {}; +#endif }; class COMPOSITOR_EXPORT CompositorDelegate { @@ -335,7 +339,9 @@ class COMPOSITOR_EXPORT Compositor : public base::PowerSuspendObserver, const viz::BeginFrameArgs& args, bool force, base::OnceCallback callback); - +#if BUILDFLAG(IS_OHOS) + void SendInternalBeginFrame(); +#endif // Creates a ThroughputTracker for tracking this Compositor. ThroughputTracker RequestNewThroughputTracker(); -- Gitee