From 4579e721576a8582ab392d4e0563867464611894 Mon Sep 17 00:00:00 2001 From: xiaowei guan Date: Wed, 10 Nov 2021 00:18:04 +0800 Subject: [PATCH 1/2] Fix vsync issue After the engine is shutdown, OnVsync no longer be called. --- shell/platform/tizen/flutter_tizen_engine.cc | 3 +++ shell/platform/tizen/tizen_vsync_waiter.cc | 26 +++++++++++++++----- shell/platform/tizen/tizen_vsync_waiter.h | 5 ++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index b5abfa2bbef90..1d8d6de7bb92f 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -290,6 +290,9 @@ bool FlutterTizenEngine::StopEngine() { if (plugin_registrar_destruction_callback_) { plugin_registrar_destruction_callback_(plugin_registrar_.get()); } +#ifndef TIZEN_RENDERER_EVAS_GL + tizen_vsync_waiter_.reset(); +#endif FlutterEngineResult result = embedder_api_.Shutdown(engine_); engine_ = nullptr; return (result == kSuccess); diff --git a/shell/platform/tizen/tizen_vsync_waiter.cc b/shell/platform/tizen/tizen_vsync_waiter.cc index c4e2c406f539e..d190c8c4bbd50 100644 --- a/shell/platform/tizen/tizen_vsync_waiter.cc +++ b/shell/platform/tizen/tizen_vsync_waiter.cc @@ -27,6 +27,9 @@ TizenVsyncWaiter::TizenVsyncWaiter(FlutterTizenEngine* engine) } TizenVsyncWaiter::~TizenVsyncWaiter() { + if (tdmClient_) { + tdmClient_->OnEngineStop(); + } Send(kMessageQuit, 0); if (vblank_thread_) { ecore_thread_cancel(vblank_thread_); @@ -34,6 +37,10 @@ TizenVsyncWaiter::~TizenVsyncWaiter() { } } +void TizenVsyncWaiter::SetTdmClient(TdmClient* tdmClient) { + tdmClient_ = tdmClient; +} + void TizenVsyncWaiter::AsyncWaitForVsync(intptr_t baton) { Send(kMessageRequestVblank, baton); } @@ -62,6 +69,7 @@ void TizenVsyncWaiter::RequestVblankLoop(void* data, Ecore_Thread* thread) { TizenVsyncWaiter* tizen_vsync_waiter = reinterpret_cast(data); TdmClient tdm_client(tizen_vsync_waiter->engine_); + tizen_vsync_waiter->SetTdmClient(&tdm_client); if (!tdm_client.IsValid()) { FT_LOG(Error) << "Invalid tdm_client."; ecore_thread_cancel(thread); @@ -99,6 +107,7 @@ TdmClient::TdmClient(FlutterTizenEngine* engine) { if (!CreateTdm()) { FT_LOG(Error) << "CreateTdm() failed."; } + std::lock_guard lock(engine_mutex_); engine_ = engine; } @@ -106,6 +115,11 @@ TdmClient::~TdmClient() { DestroyTdm(); } +void TdmClient::OnEngineStop() { + std::lock_guard lock(engine_mutex_); + engine_ = nullptr; +} + void TdmClient::WaitVblank(intptr_t baton) { baton_ = baton; tdm_error error = tdm_client_vblank_wait(vblank_, 1, VblankCallback, this); @@ -164,12 +178,12 @@ void TdmClient::VblankCallback(tdm_client_vblank* vblank, void* user_data) { TdmClient* client = reinterpret_cast(user_data); FT_ASSERT(client != nullptr); - FT_ASSERT(client->engine_ != nullptr); - - uint64_t frame_start_time_nanos = tv_sec * 1e9 + tv_usec * 1e3; - uint64_t frame_target_time_nanos = 16.6 * 1e6 + frame_start_time_nanos; - client->engine_->OnVsync(client->baton_, frame_start_time_nanos, - frame_target_time_nanos); + if (client->engine_) { + uint64_t frame_start_time_nanos = tv_sec * 1e9 + tv_usec * 1e3; + uint64_t frame_target_time_nanos = 16.6 * 1e6 + frame_start_time_nanos; + client->engine_->OnVsync(client->baton_, frame_start_time_nanos, + frame_target_time_nanos); + } } } // namespace flutter diff --git a/shell/platform/tizen/tizen_vsync_waiter.h b/shell/platform/tizen/tizen_vsync_waiter.h index b48429f18c887..4ddc42bb55fba 100644 --- a/shell/platform/tizen/tizen_vsync_waiter.h +++ b/shell/platform/tizen/tizen_vsync_waiter.h @@ -7,6 +7,7 @@ #include #include +#include #include "flutter/shell/platform/embedder/embedder.h" @@ -22,6 +23,7 @@ class TdmClient { void DestroyTdm(); bool IsValid(); void WaitVblank(intptr_t baton); + void OnEngineStop(); static void VblankCallback(tdm_client_vblank* vblank, tdm_error error, unsigned int sequence, @@ -30,6 +32,7 @@ class TdmClient { void* user_data); private: + std::mutex engine_mutex_; tdm_client* client_{nullptr}; tdm_client_output* output_{nullptr}; tdm_client_vblank* vblank_{nullptr}; @@ -42,6 +45,7 @@ class TizenVsyncWaiter { TizenVsyncWaiter(FlutterTizenEngine* engine); virtual ~TizenVsyncWaiter(); void AsyncWaitForVsync(intptr_t baton); + void SetTdmClient(TdmClient* tdmClient); private: void Send(int event, intptr_t baton); @@ -49,6 +53,7 @@ class TizenVsyncWaiter { Ecore_Thread* vblank_thread_{nullptr}; Eina_Thread_Queue* vblank_thread_queue_{nullptr}; FlutterTizenEngine* engine_{nullptr}; + TdmClient* tdmClient_{nullptr}; }; } // namespace flutter From 25af2bd8cba3c0093d3e97a83171ef98130c1270 Mon Sep 17 00:00:00 2001 From: xiaowei guan Date: Thu, 11 Nov 2021 19:25:54 +0800 Subject: [PATCH 2/2] Add lock when call OnVsync 1.Remove lock when create TdmClient. 2.Add lock when call OnVsync. 3.Change tdmClient to tdm_client. --- shell/platform/tizen/tizen_vsync_waiter.cc | 10 +++++----- shell/platform/tizen/tizen_vsync_waiter.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/shell/platform/tizen/tizen_vsync_waiter.cc b/shell/platform/tizen/tizen_vsync_waiter.cc index d190c8c4bbd50..3f196bfb1c742 100644 --- a/shell/platform/tizen/tizen_vsync_waiter.cc +++ b/shell/platform/tizen/tizen_vsync_waiter.cc @@ -27,8 +27,8 @@ TizenVsyncWaiter::TizenVsyncWaiter(FlutterTizenEngine* engine) } TizenVsyncWaiter::~TizenVsyncWaiter() { - if (tdmClient_) { - tdmClient_->OnEngineStop(); + if (tdm_client_) { + tdm_client_->OnEngineStop(); } Send(kMessageQuit, 0); if (vblank_thread_) { @@ -37,8 +37,8 @@ TizenVsyncWaiter::~TizenVsyncWaiter() { } } -void TizenVsyncWaiter::SetTdmClient(TdmClient* tdmClient) { - tdmClient_ = tdmClient; +void TizenVsyncWaiter::SetTdmClient(TdmClient* tdm_client) { + tdm_client_ = tdm_client; } void TizenVsyncWaiter::AsyncWaitForVsync(intptr_t baton) { @@ -107,7 +107,6 @@ TdmClient::TdmClient(FlutterTizenEngine* engine) { if (!CreateTdm()) { FT_LOG(Error) << "CreateTdm() failed."; } - std::lock_guard lock(engine_mutex_); engine_ = engine; } @@ -178,6 +177,7 @@ void TdmClient::VblankCallback(tdm_client_vblank* vblank, void* user_data) { TdmClient* client = reinterpret_cast(user_data); FT_ASSERT(client != nullptr); + std::lock_guard lock(client->engine_mutex_); if (client->engine_) { uint64_t frame_start_time_nanos = tv_sec * 1e9 + tv_usec * 1e3; uint64_t frame_target_time_nanos = 16.6 * 1e6 + frame_start_time_nanos; diff --git a/shell/platform/tizen/tizen_vsync_waiter.h b/shell/platform/tizen/tizen_vsync_waiter.h index 4ddc42bb55fba..9f5be4bb20f14 100644 --- a/shell/platform/tizen/tizen_vsync_waiter.h +++ b/shell/platform/tizen/tizen_vsync_waiter.h @@ -45,7 +45,7 @@ class TizenVsyncWaiter { TizenVsyncWaiter(FlutterTizenEngine* engine); virtual ~TizenVsyncWaiter(); void AsyncWaitForVsync(intptr_t baton); - void SetTdmClient(TdmClient* tdmClient); + void SetTdmClient(TdmClient* tdm_client); private: void Send(int event, intptr_t baton); @@ -53,7 +53,7 @@ class TizenVsyncWaiter { Ecore_Thread* vblank_thread_{nullptr}; Eina_Thread_Queue* vblank_thread_queue_{nullptr}; FlutterTizenEngine* engine_{nullptr}; - TdmClient* tdmClient_{nullptr}; + TdmClient* tdm_client_{nullptr}; }; } // namespace flutter