From 2fc97cc455117162ee0f1991a059e341fce5dd42 Mon Sep 17 00:00:00 2001 From: some-one-mmx Date: Thu, 21 Sep 2023 12:05:17 +0000 Subject: [PATCH] add lower frame rate api Signed-off-by: some-one-mmx Change-Id: I51d770facb9288eb281024070664d6e7e311f67d Signed-off-by: some-one-mmx --- .../common/frame_sinks/begin_frame_source.h | 1 + .../viz/host/host_frame_sink_manager.cc | 4 ++ components/viz/host/host_frame_sink_manager.h | 1 + .../external_begin_frame_source_ohos.cc | 43 +++++++++++++------ .../external_begin_frame_source_ohos.h | 7 ++- .../frame_sinks/frame_sink_manager_impl.cc | 8 ++++ .../frame_sinks/frame_sink_manager_impl.h | 1 + .../root_compositor_frame_sink_impl.cc | 4 ++ .../root_compositor_frame_sink_impl.h | 1 + ohos_nweb/include/nweb.h | 5 +++ ohos_nweb/src/cef_delegate/nweb_delegate.cc | 9 ++++ ohos_nweb/src/cef_delegate/nweb_delegate.h | 1 + ohos_nweb/src/nweb_delegate_interface.h | 1 + ohos_nweb/src/nweb_impl.cc | 8 ++++ ohos_nweb/src/nweb_impl.h | 1 + .../compositing/frame_sink_manager.mojom | 4 ++ ui/compositor/compositor.cc | 4 ++ ui/compositor/compositor.h | 1 + 18 files changed, 89 insertions(+), 15 deletions(-) diff --git a/components/viz/common/frame_sinks/begin_frame_source.h b/components/viz/common/frame_sinks/begin_frame_source.h index 78134051d5..8657ad4316 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 d3303281d8..b9523d0a39 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 68b2c5c4bc..a44c9f30dc 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 76c20ea462..902d619dc6 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 4c176ab868..a2ab90af76 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 01a26e4cd3..139096edb3 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 dcd8f4676b..ae35a47e66 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 40c53dee64..07216fda4f 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 78f6b1fac7..7582aee7d3 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 759f0bc7c4..83a11aade2 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 791d7732d5..0c0bbce229 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 3654646d94..5346e2ea80 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 4110a169e1..f77ac2981e 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 be0561b434..8b7e84d644 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 c67c69e2a0..f370a4c1aa 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 3a764ca953..7e98c7c0a5 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 23a88eca40..c87b266b45 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 d02cb84bbb..7be363efb0 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: -- Gitee