diff --git a/components/viz/common/frame_sinks/begin_frame_source.h b/components/viz/common/frame_sinks/begin_frame_source.h index 481339af7a809b264633468897768c72ff199ec0..53cb825b0dd1a1eb5af6221cba9ff5278af1c340 100644 --- a/components/viz/common/frame_sinks/begin_frame_source.h +++ b/components/viz/common/frame_sinks/begin_frame_source.h @@ -438,6 +438,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 SetIfLowerFrameRate(bool if_lower_frame_rate) {} #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 88e4438d2a718ba6cd9b5a67317f654d23577063..f34c8edb155522e4f4d7cad510d710ca494e0273 100644 --- a/components/viz/host/host_frame_sink_manager.cc +++ b/components/viz/host/host_frame_sink_manager.cc @@ -433,6 +433,12 @@ void HostFrameSinkManager::UpdateDebugRendererSettings( frame_sink_manager_->UpdateDebugRendererSettings(debug_settings); } +#if BUILDFLAG(IS_OHOS) +void HostFrameSinkManager::SetIfLowerFrameRate(bool if_lower_frame_rate, const FrameSinkId& frame_sink_id) { + frame_sink_manager_->SetIfLowerFrameRate(if_lower_frame_rate, frame_sink_id); +} +#endif + HostFrameSinkManager::FrameSinkData::FrameSinkData() = default; HostFrameSinkManager::FrameSinkData::FrameSinkData(FrameSinkData&& other) = diff --git a/components/viz/host/host_frame_sink_manager.h b/components/viz/host/host_frame_sink_manager.h index fc13740e752117ee15c8e2f9e24c028ae5723156..b96c145b26ceb8410d213b5bef46b65e4bea3d66 100644 --- a/components/viz/host/host_frame_sink_manager.h +++ b/components/viz/host/host_frame_sink_manager.h @@ -220,6 +220,9 @@ class VIZ_HOST_EXPORT HostFrameSinkManager const DebugRendererSettings& debug_renderer_settings() const { return debug_renderer_settings_; } +#if BUILDFLAG(IS_OHOS) + void SetIfLowerFrameRate(bool if_lower_frame_rate, const FrameSinkId& frame_sink_id); +#endif private: friend class HostFrameSinkManagerTest; 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 c5a4aa2131139098d8b16a241f715176b486d32a..29426b34d4d64c7cc8554f7efefd1ae06eb9ed90 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 @@ -14,6 +14,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: @@ -79,26 +80,40 @@ 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 (if_lower_frame_rate_) { + vsync_period_ = vsync_period_ * 2; } base::TimeDelta vsync_period(base::Nanoseconds(vsync_period_)); base::TimeTicks frame_time = base::TimeTicks() + base::Nanoseconds(timestamp); base::TimeTicks deadline = frame_time + vsync_period; 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 (if_lower_frame_rate_ && 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 e25ae5dad315b796e911deb48f454de2f7c80021..f000f5a21363581bc542d85c7d350cc5089b837c 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 @@ -39,6 +39,10 @@ class VIZ_SERVICE_EXPORT ExternalBeginFrameSourceOHOS frame_sink_id_ = frame_sink_id; }; + void SetIfLowerFrameRate(bool if_lower_frame_rate) override { + if_lower_frame_rate_ = if_lower_frame_rate; + } + private: // ExternalBeginFrameSourceClient implementation. void OnNeedsBeginFrames(bool needs_begin_frames) override; @@ -53,9 +57,10 @@ 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; + bool if_lower_frame_rate_ = 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 cc3eb202114aadff084a67276904cbb9a7a6db5d..a80e8bdaf5cf6a40225506a282cb0e28a658d2aa 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc @@ -736,6 +736,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::SetIfLowerFrameRate(bool if_lower_frame_rate, const FrameSinkId& frame_sink_id) { + auto it = root_sink_map_.find(frame_sink_id); + if (it == root_sink_map_.end()) { + return; + } + it->second->SetIfLowerFrameRate(if_lower_frame_rate); +} #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 5d93588fa1eaceaa10f2e7bf2d11eabdf9c36445..6fdace80639f949a83f603ae2d168647fd24bb8f 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h @@ -254,6 +254,7 @@ class VIZ_SERVICE_EXPORT FrameSinkManagerImpl #if BUILDFLAG(IS_OHOS) void OnVsync(const FrameSinkId& frame_sink_id); + void SetIfLowerFrameRate(bool if_lower_frame_rate, 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 4f1edab87fc86f8597e2139e0116fe6a9e9236e6..98f3abe77f2a7ce46e8c4977d905cb7e13b8c493 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::SetIfLowerFrameRate(bool if_lower_frame_rate) { + external_begin_frame_source_->SetIfLowerFrameRate(if_lower_frame_rate); +} #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..38f16a0246397f8259f0d82775162b437a84eae0 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,7 @@ class VIZ_SERVICE_EXPORT RootCompositorFrameSinkImpl int32_t process_id, bool is_created) override {}; void SetCurrentFrameSinkId(const FrameSinkId& frame_sink_id) override; + void SetIfLowerFrameRate(bool if_lower_frame_rate); #endif base::ScopedClosureRunner GetCacheBackBufferCb(); diff --git a/ohos_nweb/include/nweb.h b/ohos_nweb/include/nweb.h index 7ab882ed1c742296239c1ced4f18d5843adcda01..4997332fefd6b7bcc558f8187335c59619da851d 100644 --- a/ohos_nweb/include/nweb.h +++ b/ohos_nweb/include/nweb.h @@ -765,6 +765,11 @@ class OHOS_NWEB_EXPORT NWeb : public std::enable_shared_from_this { * Set the token. */ virtual void SetToken(void* token) = 0; + + /** + * Set if lower the frame rate. + */ + virtual void SetIfLowerFrameRate(bool if_lower_frame_rate) 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 68e4b7cc8a3e4caffe7a732b41f6c4bcc39006d0..5bf2fc178b430a2934e2b19e094289f05ff9f8fb 100644 --- a/ohos_nweb/src/cef_delegate/nweb_delegate.cc +++ b/ohos_nweb/src/cef_delegate/nweb_delegate.cc @@ -993,6 +993,15 @@ void NWebDelegate::OnUnoccluded() { occluded_ = false; } +void NWebDelegate::SetIfLowerFrameRate(bool if_lower_frame_rate) { + LOG(DEBUG) << "NWebDelegate::SetIfLowerFrameRate, nweb_id = " << nweb_id_; + if (!GetBrowser().get()) { + return; + } + + GetBrowser()->GetHost()->SetIfLowerFrameRate(if_lower_frame_rate); +} + 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 1379e13a1a4876db58dd5504d7ccc93a585f0734..99293dc62d0f7d5014866bea4103b662a511f2b9 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 SetIfLowerFrameRate(bool if_lower_frame_rate) 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 2aa886813408adfd2a69ce39342ab8e603c2b7fb..cec2c82f2cf10921498e58efb7f0f37f7aed1cff 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 SetIfLowerFrameRate(bool if_lower_frame_rate) = 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 c949a9add537b672321df572a239d81cbf8842f4..3683591df3214600b4326ed11be904880db4c65f 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::SetIfLowerFrameRate(bool if_lower_frame_rate) const { + if (nweb_delegate_ == nullptr) { + LOG(ERROR) << "nweb_delegate_ is nullptr."; + return; + } + nweb_delegate_->SetIfLowerFrameRate(if_lower_frame_rate); +} + 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 dc25d182bd5b741ebc42da7e63e52544275611cf..4b2c6038df2019f76c43ddc2c43379b2005f749f 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 SetIfLowerFrameRate(bool if_lower_frame_rate) 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 9059970d640ff19af1115c9706c057f8eb176c44..a52239fa9aec22d4efbf2129e6a6c90b82b817da 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); + + // Set if lower frame rate. + SetIfLowerFrameRate(bool if_lower_frame_rate, 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 c7d3109afea45f4ff189dcd94d096a86e3a4eb52..f06fae0bc40fcbfb685ca12a1528e5c2f5801814 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc @@ -915,6 +915,10 @@ void Compositor::SetCurrentFrameSinkId(const viz::FrameSinkId& id) { LOG(ERROR) << "Compositor::SetCurrentDisplay display_private error"; } } + +void Compositor::SetIfLowerFrameRate(bool if_lower_frame_rate) { + context_factory_->GetHostFrameSinkManager()->SetIfLowerFrameRate(if_lower_frame_rate, frame_sink_id()); +} #endif } // namespace ui diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index 8730045ddd5c40927f9135932ff41825756e34d9..3dac2eed90205120bc379239295433ddc24eb17e 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h @@ -444,6 +444,7 @@ class COMPOSITOR_EXPORT Compositor : public base::PowerSuspendObserver, #if BUILDFLAG(IS_OHOS) void SetCurrentFrameSinkId(const viz::FrameSinkId& id); + void SetIfLowerFrameRate(bool if_lower_frame_rate); #endif private: