diff --git a/cc/input/compositor_input_interfaces.h b/cc/input/compositor_input_interfaces.h index dcbd420b2cccfeac58fd829342d0b13ce8d488cc..30d0d9e4a8eccf99d9e10918d56268be90dea635 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 a242013bb07ae6711b82bbc8a2d697822e65d127..65b94f8b379913f878cdd0dca582e6893aa78a67 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 fc0b6c4f2ee4af6f6af8600e4fa71bd91c4a3baf..2c68e89ef4d0eb32942b3c3d9f5683bfa99b8cba 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 ff554e8562b5618b35bb77ce3808cedecbd9049f..8951433fe31069e07770df69cd84478fcd4fabe7 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 09f27ac9a8110ca27add4ccbba18568ac21ae132..519e8cf379be70357b89ca381dfe06e900e55692 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 7e2b30fae25f22424906d267fe2deebccfd1fa15..828ec20b8a86fe0dbc370254612c704d8e6acbf3 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 afd8f34faef96252c282daa517b1245b60274366..253eb2f5d8ae2af56d477097ccdba87784a3c73e 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 600a82a7510d39cdb79b9152e0b473e470397a5e..8ab90246e34e8ffa3aaa41287058e5fe497db98c 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 5c28272a455748c3eee3ab7d2c50ceb091a03421..3df40e6d2f6a6faeddefd1099b60e3391d6d46eb 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 ee4096b406be4a7f9d7700c2fa644c4c33290c80..cf4c28bee920c226164cd00c8804172ac0d79f00 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 3242ec4d6a984ff62733be150312ed19045f1c25..764e87cf83cc886b2badef39a5bfa2f6ba23f9ea 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 481339af7a809b264633468897768c72ff199ec0..78134051d50a2332047966b19eb9526399586812 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 88e4438d2a718ba6cd9b5a67317f654d23577063..d3303281d8e907f9e58385e5ad60575c6e55201e 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 fc13740e752117ee15c8e2f9e24c028ae5723156..68b2c5c4bc2b0a2b6fc50043a36d58469f1a4a8d 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 5279cd02c8ae7f561319dce351ed4f96eea16ec8..b3d1222b5e157a41a3b58383a1921f5cebce1f51 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 704beef9efa9c5b2aa85d5c1131d1e535ca57682..4c176ab868f5d50844c6a95d527862b4434bbab9 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 cc3eb202114aadff084a67276904cbb9a7a6db5d..01a26e4cd3a60b10fdfbdf60e45e2659cbd5ac3e 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 5d93588fa1eaceaa10f2e7bf2d11eabdf9c36445..dcd8f4676bf5494934e63d1337d1da514c714870 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 4f1edab87fc86f8597e2139e0116fe6a9e9236e6..40c53dee643f97b415177c46247247ce61c42ec7 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 82c027f3b33a27c9a8ae55602f90bedd65e88f06..78f6b1fac7901b1dcc2394e992f69f20113ac9fc 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 7cae640beaed2cf867536639c2ba214d2a03d41a..117dd0b77bf5f48783ab35bb02e0f8d212f435e0 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 4473da808978854e24bc3f83770d1372a2ee7a31..19f137c139a224a8a55f36cd461a8878b8ce484a 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 d2c6d4c57a6266ca8abea0cd0c8e577520106f59..5fdb76e68e9c42cdab5f3b841a0581e9fb63395b 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 fc72ea7bb0d7be672b7f69b2a45b52f69116e3c6..0e42aef0941c9b71a0b2239ca396f4d6ca25a03b 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 bf50bce1478811c6fb1c30f4d4b3877e60eb0387..96259ecab8f1e48e200ca92e71f84b386b1656c4 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 9059970d640ff19af1115c9706c057f8eb176c44..3a764ca9536771e6e757733c4f2c6db331cd1192 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 6d58185e25baf58f91d8acf8b671d0a21dbf20a3..b50e1f08f2c97f995fe192065f144537ca60ec76 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 bcc990f1d839b0110c4e2ad77e3c591b1f0cd1af..02799d35de2775f4b9e479c85c7853f2069935df 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 25bbd2304743d62c31f6648c9f40647eb0017f96..cacb248c0de18fc0f428fba576ef495ac37b2071 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 c7d3109afea45f4ff189dcd94d096a86e3a4eb52..23a88eca4066cd49d7a9e03f7d733b8f24a00a37 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 8730045ddd5c40927f9135932ff41825756e34d9..d02cb84bbbea1a0666a4bacd4ec09e3680af1791 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();