diff --git a/components/viz/common/frame_sinks/begin_frame_source.h b/components/viz/common/frame_sinks/begin_frame_source.h index 78134051d50a2332047966b19eb9526399586812..8657ad4316cffe1f27461ad0abfaef43d7c0955f 100644 --- a/components/viz/common/frame_sinks/begin_frame_source.h +++ b/components/viz/common/frame_sinks/begin_frame_source.h @@ -442,6 +442,7 @@ class VIZ_COMMON_EXPORT ExternalBeginFrameSource : public BeginFrameSource { #if BUILDFLAG(IS_OHOS) // Set Current display client Frame sink ID. virtual void SetCurrentFrameSinkId(const FrameSinkId& frame_sink_id) {} + virtual void SetEnableLowerFrameRate(bool enabled) {} #endif // Notifies the begin frame source of the desired frame interval for the diff --git a/components/viz/host/host_frame_sink_manager.cc b/components/viz/host/host_frame_sink_manager.cc index d3303281d8e907f9e58385e5ad60575c6e55201e..b9523d0a398296912493d213a9f77e8678ee4b4f 100644 --- a/components/viz/host/host_frame_sink_manager.cc +++ b/components/viz/host/host_frame_sink_manager.cc @@ -394,6 +394,10 @@ void HostFrameSinkManager::OnVsync(uint32_t client_id, uint32_t sink_id) { void HostFrameSinkManager::SendInternalBeginFrame(const FrameSinkId& id) { frame_sink_manager_->SendInternalBeginFrame(id); } + +void HostFrameSinkManager::SetEnableLowerFrameRate(bool enabled, const FrameSinkId& frame_sink_id) { + frame_sink_manager_->SetEnableLowerFrameRate(enabled, frame_sink_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 68b2c5c4bc2b0a2b6fc50043a36d58469f1a4a8d..a44c9f30dc8e0b97985c9e78e1938def8eacb9fa 100644 --- a/components/viz/host/host_frame_sink_manager.h +++ b/components/viz/host/host_frame_sink_manager.h @@ -223,6 +223,7 @@ class VIZ_HOST_EXPORT HostFrameSinkManager #if BUILDFLAG(IS_OHOS) void SendInternalBeginFrame(const FrameSinkId& id); + void SetEnableLowerFrameRate(bool enabled, const FrameSinkId& frame_sink_id); #endif private: 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 76c20ea4622fa702ad701003bea24bc5ebcdc132..902d619dc604c4771eecd12636154c701d20eeee 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 @@ -17,6 +17,7 @@ using namespace OHOS::NWeb; constexpr int64_t VSYNC_PERIOD_90HZ = 11111111; constexpr int64_t VSYNC_PERIOD_60HZ = 16666666; constexpr int64_t VSYNC_PERIOD_6090HZ_MID = 13000000; +bool g_skip_vsync = false; class ExternalBeginFrameSourceOHOS::VSyncUserData { public: @@ -93,12 +94,18 @@ void ExternalBeginFrameSourceOHOS::OnVSyncImpl(int64_t timestamp, VSyncUserData* user_data) { user_data_.reset(user_data); last_vsync_period_ = timestamp; - int64_t period = last_vsync_period_ - pre_vsync_period_; - pre_vsync_period_ = last_vsync_period_; - if (period > 0 && period < VSYNC_PERIOD_6090HZ_MID) { - vsync_period_ = VSYNC_PERIOD_90HZ; - } else { - vsync_period_ = VSYNC_PERIOD_60HZ; + vsync_period_ = vsync_adapter_.GetVSyncPeriod(); + if (vsync_period_ == 0) { + int64_t period = last_vsync_period_ - pre_vsync_period_; + pre_vsync_period_ = last_vsync_period_; + if (period > 0 && period < VSYNC_PERIOD_6090HZ_MID) { + vsync_period_ = VSYNC_PERIOD_90HZ; + } else { + vsync_period_ = VSYNC_PERIOD_60HZ; + } + } + if (lower_frame_rate_enabled_) { + vsync_period_ = vsync_period_ * 2; } #if BUILDFLAG(IS_OHOS) @@ -111,14 +118,22 @@ ReportLossFrame::GetInstance()->SetVsyncPeriod(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( - source_id(), frame_time, deadline, vsync_period); - OnBeginFrame(begin_frame_args); - - if (frame_sink_manager_) { - TRACE_EVENT0("viz", - "ExternalBeginFrameSourceOHOS::OnVSyncImpl::BackToMainThread"); - frame_sink_manager_->OnVsync(frame_sink_id_); + + if (lower_frame_rate_enabled_ && g_skip_vsync) { + TRACE_EVENT0("viz", "vsync skip"); + g_skip_vsync = false; + } else { + TRACE_EVENT0("viz", "vsync not skip"); + auto begin_frame_args = begin_frame_args_generator_.GenerateBeginFrameArgs( + source_id(), frame_time, deadline, vsync_period); + OnBeginFrame(begin_frame_args); + + if (frame_sink_manager_) { + TRACE_EVENT0("viz", + "ExternalBeginFrameSourceOHOS::OnVSyncImpl::BackToMainThread"); + frame_sink_manager_->OnVsync(frame_sink_id_); + } + g_skip_vsync = true; } if (!vsync_notification_enabled_ || user_data_ == nullptr) { 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 4c176ab868f5d50844c6a95d527862b4434bbab9..a2ab90af76932521737bec6805419d2996c653c7 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 @@ -40,6 +40,10 @@ class VIZ_SERVICE_EXPORT ExternalBeginFrameSourceOHOS frame_sink_id_ = frame_sink_id; }; + void SetEnableLowerFrameRate(bool enabled) override { + lower_frame_rate_enabled_ = enabled; + } + private: // ExternalBeginFrameSourceClient implementation. void OnNeedsBeginFrames(bool needs_begin_frames) override; @@ -54,10 +58,11 @@ class VIZ_SERVICE_EXPORT ExternalBeginFrameSourceOHOS FrameSinkId frame_sink_id_; const raw_ptr frame_sink_manager_; - int64_t vsync_period_ = 16666666; + int64_t vsync_period_ = 0; int64_t pre_vsync_period_ = 0; int64_t last_vsync_period_ = 0; base::TimeTicks last_dead_line_ = base::TimeTicks(); + bool lower_frame_rate_enabled_ = false; 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 01a26e4cd3a60b10fdfbdf60e45e2659cbd5ac3e..139096edb3320bd5165ee39dfcbaf9d54ed2a2aa 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc @@ -742,6 +742,14 @@ void FrameSinkManagerImpl::OnVsync(const FrameSinkId& frame_sink_id) { if (client_) client_->OnVsync(frame_sink_id.client_id(), frame_sink_id.sink_id()); } + +void FrameSinkManagerImpl::SetEnableLowerFrameRate(bool enabled, const FrameSinkId& frame_sink_id) { + auto it = root_sink_map_.find(frame_sink_id); + if (it == root_sink_map_.end()) { + return; + } + it->second->SetEnableLowerFrameRate(enabled); +} #endif } // namespace viz 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 dcd8f4676bf5494934e63d1337d1da514c714870..ae35a47e66140f62b922ef1cef6322e5b2606766 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h @@ -257,6 +257,7 @@ class VIZ_SERVICE_EXPORT FrameSinkManagerImpl #if BUILDFLAG(IS_OHOS) void OnVsync(const FrameSinkId& frame_sink_id); + void SetEnableLowerFrameRate(bool enabled, const FrameSinkId& frame_sink_id) override; #endif private: 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 40c53dee643f97b415177c46247247ce61c42ec7..07216fda4f18954280afbe17de22a797653d634d 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 @@ -570,6 +570,10 @@ void RootCompositorFrameSinkImpl::SetCurrentFrameSinkId( void RootCompositorFrameSinkImpl::SendInternalBeginFrame() { external_begin_frame_source_->SendInternalBeginFrame(); } + +void RootCompositorFrameSinkImpl::SetEnableLowerFrameRate(bool enabled) { + external_begin_frame_source_->SetEnableLowerFrameRate(enabled); +} #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 78f6b1fac7901b1dcc2394e992f69f20113ac9fc..7582aee7d399bd693a4a6923fa4ef74925511c8b 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 @@ -128,6 +128,7 @@ class VIZ_SERVICE_EXPORT RootCompositorFrameSinkImpl void SetCurrentFrameSinkId(const FrameSinkId& frame_sink_id) override; void SendInternalBeginFrame(); + void SetEnableLowerFrameRate(bool enabled); #endif base::ScopedClosureRunner GetCacheBackBufferCb(); diff --git a/ohos_nweb/include/nweb.h b/ohos_nweb/include/nweb.h index 759f0bc7c4f6b1ee21fe33e927f14ca864531b35..83a11aade2277ce2c77d6e305bbf9da682e74e52 100644 --- a/ohos_nweb/include/nweb.h +++ b/ohos_nweb/include/nweb.h @@ -777,6 +777,11 @@ class OHOS_NWEB_EXPORT NWeb : public std::enable_shared_from_this { * Set the nested scroll mode. */ virtual void SetNestedScrollMode(const NestedScrollMode& nestedScrollMode) = 0; + + /** + * Set enable lower the frame rate. + */ + virtual void SetEnableLowerFrameRate(bool enabled) const = 0; }; } // namespace OHOS::NWeb diff --git a/ohos_nweb/src/cef_delegate/nweb_delegate.cc b/ohos_nweb/src/cef_delegate/nweb_delegate.cc index 791d7732d5f2a2d8804f68275bb491cb88c64291..0c0bbce229d70110f5518d89b9e4c8bbe9e8cfc8 100644 --- a/ohos_nweb/src/cef_delegate/nweb_delegate.cc +++ b/ohos_nweb/src/cef_delegate/nweb_delegate.cc @@ -1014,6 +1014,15 @@ void NWebDelegate::OnUnoccluded() { occluded_ = false; } +void NWebDelegate::SetEnableLowerFrameRate(bool enabled) { + LOG(DEBUG) << "NWebDelegate::SetEnableLowerFrameRate, nweb_id = " << nweb_id_; + if (!GetBrowser().get()) { + return; + } + + GetBrowser()->GetHost()->SetEnableLowerFrameRate(enabled); +} + void NWebDelegate::OnContextInitializeComplete(const std::string& url, void* window) { // Create browser after context initialzed complete. diff --git a/ohos_nweb/src/cef_delegate/nweb_delegate.h b/ohos_nweb/src/cef_delegate/nweb_delegate.h index 3654646d94297cf7671e244cb32b246715b669e1..5346e2ea808eb96d8cc88568e23f9b0dad9bb7f6 100644 --- a/ohos_nweb/src/cef_delegate/nweb_delegate.h +++ b/ohos_nweb/src/cef_delegate/nweb_delegate.h @@ -119,6 +119,7 @@ class NWebDelegate : public NWebDelegateInterface, public virtual CefRefCount { void OnContinue() override; void OnOccluded() override; void OnUnoccluded() override; + void SetEnableLowerFrameRate(bool enabled) override; std::shared_ptr GetPreference() const override; std::string Title() override; void CreateWebMessagePorts(std::vector& ports) override; diff --git a/ohos_nweb/src/nweb_delegate_interface.h b/ohos_nweb/src/nweb_delegate_interface.h index 4110a169e1d854d6ccb7ff2a723b102ec615a02b..f77ac2981e18315156e308b39c451a2f21988910 100644 --- a/ohos_nweb/src/nweb_delegate_interface.h +++ b/ohos_nweb/src/nweb_delegate_interface.h @@ -135,6 +135,7 @@ class NWebDelegateInterface virtual void OnContinue() = 0; virtual void OnOccluded() = 0; virtual void OnUnoccluded() = 0; + virtual void SetEnableLowerFrameRate(bool enabled) = 0; virtual std::shared_ptr GetPreference() const = 0; virtual std::string Title() = 0; virtual void CreateWebMessagePorts(std::vector& ports) = 0; diff --git a/ohos_nweb/src/nweb_impl.cc b/ohos_nweb/src/nweb_impl.cc index be0561b434d8cce655ebeb4f6e853b15091f13f0..8b7e84d6446ff4f8a59d80a09d32f2f8e7ee71b0 100644 --- a/ohos_nweb/src/nweb_impl.cc +++ b/ohos_nweb/src/nweb_impl.cc @@ -666,6 +666,14 @@ void NWebImpl::OnUnoccluded() const { nweb_delegate_->OnUnoccluded(); } +void NWebImpl::SetEnableLowerFrameRate(bool enabled) const { + if (nweb_delegate_ == nullptr) { + LOG(ERROR) << "nweb_delegate_ is nullptr."; + return; + } + nweb_delegate_->SetEnableLowerFrameRate(enabled); +} + void NWebImpl::StopCameraSession() const { OhosAdapterHelper::GetInstance().GetCameraManagerAdapter().SetForegroundFlag(false); } diff --git a/ohos_nweb/src/nweb_impl.h b/ohos_nweb/src/nweb_impl.h index c67c69e2a033ad012a7e1beff5cd453c2d68bf33..f370a4c1aa622cfccc6e5900f5b30559cea4bd68 100644 --- a/ohos_nweb/src/nweb_impl.h +++ b/ohos_nweb/src/nweb_impl.h @@ -84,6 +84,7 @@ class NWebImpl : public NWeb { void OnContinue() const override; void OnOccluded() const override; void OnUnoccluded() const override; + void SetEnableLowerFrameRate(bool enabled) const override; const std::shared_ptr GetPreference() const override; void PutDownloadCallback( std::shared_ptr downloadListener) override; diff --git a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom index 3a764ca9536771e6e757733c4f2c6db331cd1192..7e98c7c0a56e0d38f8d9394f46642567a65d0506 100644 --- a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom +++ b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom @@ -167,6 +167,10 @@ interface FrameSinkManager { [EnableIf=is_ohos] SendInternalBeginFrame(FrameSinkId frame_sink_id); + + // Set if lower frame rate. + [EnableIf=is_ohos] + SetEnableLowerFrameRate(bool enabled, FrameSinkId frame_sink_id); }; // The FrameSinkManagerClient interface is implemented by the Display diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index 23a88eca4066cd49d7a9e03f7d733b8f24a00a37..c87b266b455cf800521c58fe645dff4a9d03a308 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc @@ -921,6 +921,10 @@ void Compositor::SetCurrentFrameSinkId(const viz::FrameSinkId& id) { LOG(ERROR) << "Compositor::SetCurrentDisplay display_private error"; } } + +void Compositor::SetEnableLowerFrameRate(bool enabled) { + context_factory_->GetHostFrameSinkManager()->SetEnableLowerFrameRate(enabled, frame_sink_id()); +} #endif } // namespace ui diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index d02cb84bbbea1a0666a4bacd4ec09e3680af1791..7be363efb060dc5a1591a8b583d2bb36c03ef32a 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h @@ -450,6 +450,7 @@ class COMPOSITOR_EXPORT Compositor : public base::PowerSuspendObserver, #if BUILDFLAG(IS_OHOS) void SetCurrentFrameSinkId(const viz::FrameSinkId& id); + void SetEnableLowerFrameRate(bool enabled); #endif private: