From 8b03d53e8f52ea7cd8092076dc735342a96ac0e6 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Wed, 25 Jun 2025 19:21:50 +0800 Subject: [PATCH 01/13] Refactor FlutterTizenView Make SetEngine and CreateRenderSurfcae private. --- flutter/shell/platform/tizen/flutter_tizen.cc | 7 ++---- .../tizen/flutter_tizen_elementary.cc | 8 +++---- .../shell/platform/tizen/flutter_tizen_nui.cc | 8 +++---- .../platform/tizen/flutter_tizen_view.cc | 12 ++++++---- .../shell/platform/tizen/flutter_tizen_view.h | 24 ++++++++++--------- 5 files changed, 28 insertions(+), 31 deletions(-) diff --git a/flutter/shell/platform/tizen/flutter_tizen.cc b/flutter/shell/platform/tizen/flutter_tizen.cc index f3faa27..592b03c 100644 --- a/flutter/shell/platform/tizen/flutter_tizen.cc +++ b/flutter/shell/platform/tizen/flutter_tizen.cc @@ -214,12 +214,9 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( auto view = std::make_unique( flutter::kImplicitViewId, std::move(window), - window_properties.user_pixel_ratio); + std::unique_ptr(EngineFromHandle(engine)), + window_properties.renderer_type, window_properties.user_pixel_ratio); - // Take ownership of the engine, starting it if necessary. - view->SetEngine( - std::unique_ptr(EngineFromHandle(engine))); - view->CreateRenderSurface(window_properties.renderer_type); if (!view->engine()->IsRunning()) { if (!view->engine()->RunEngine()) { return nullptr; diff --git a/flutter/shell/platform/tizen/flutter_tizen_elementary.cc b/flutter/shell/platform/tizen/flutter_tizen_elementary.cc index c5640ce..605e3dd 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_elementary.cc @@ -31,12 +31,10 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( static_cast(parent)); auto view = std::make_unique( - flutter::kImplicitViewId, std::move(tizen_view)); + flutter::kImplicitViewId, std::move(tizen_view), + std::unique_ptr(EngineFromHandle(engine)), + FlutterDesktopRendererType::kEvasGL); - // Take ownership of the engine, starting it if necessary. - view->SetEngine( - std::unique_ptr(EngineFromHandle(engine))); - view->CreateRenderSurface(FlutterDesktopRendererType::kEvasGL); if (!view->engine()->IsRunning()) { if (!view->engine()->RunEngine()) { return nullptr; diff --git a/flutter/shell/platform/tizen/flutter_tizen_nui.cc b/flutter/shell/platform/tizen/flutter_tizen_nui.cc index 74fae07..32787e0 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_nui.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_nui.cc @@ -40,12 +40,10 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromImageView( default_window_id); auto view = std::make_unique( - flutter::kImplicitViewId, std::move(tizen_view)); + flutter::kImplicitViewId, std::move(tizen_view), + std::unique_ptr(EngineFromHandle(engine)), + FlutterDesktopRendererType::kEGL); - // Take ownership of the engine, starting it if necessary. - view->SetEngine( - std::unique_ptr(EngineFromHandle(engine))); - view->CreateRenderSurface(FlutterDesktopRendererType::kEGL); if (!view->engine()->IsRunning()) { if (!view->engine()->RunEngine()) { return nullptr; diff --git a/flutter/shell/platform/tizen/flutter_tizen_view.cc b/flutter/shell/platform/tizen/flutter_tizen_view.cc index 7666856..323b21f 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_view.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_view.cc @@ -44,12 +44,17 @@ namespace flutter { FlutterTizenView::FlutterTizenView(FlutterViewId view_id, std::unique_ptr tizen_view, + std::unique_ptr engine, + FlutterDesktopRendererType renderer_type, double user_pixel_ratio) : view_id_(view_id), tizen_view_(std::move(tizen_view)), + engine_(std::move(engine)), user_pixel_ratio_(user_pixel_ratio) { tizen_view_->SetView(this); - + engine_->SetView(this); + SetupChannels(); + CreateRenderSurface(renderer_type); if (auto* window = dynamic_cast(tizen_view_.get())) { window->BindKeys(kBindableSystemKeys); } @@ -65,10 +70,7 @@ FlutterTizenView::~FlutterTizenView() { DestroyRenderSurface(); } -void FlutterTizenView::SetEngine(std::unique_ptr engine) { - engine_ = std::move(engine); - engine_->SetView(this); - +void FlutterTizenView::SetupChannels() { internal_plugin_registrar_ = std::make_unique(engine_->plugin_registrar()); diff --git a/flutter/shell/platform/tizen/flutter_tizen_view.h b/flutter/shell/platform/tizen/flutter_tizen_view.h index a965cb0..13b0d3e 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_view.h +++ b/flutter/shell/platform/tizen/flutter_tizen_view.h @@ -27,6 +27,8 @@ class FlutterTizenView : public TizenViewEventHandlerDelegate { public: FlutterTizenView(FlutterViewId view_id, std::unique_ptr tizen_view, + std::unique_ptr engine, + FlutterDesktopRendererType renderer_type, double user_pixel_ratio = 0); virtual ~FlutterTizenView(); @@ -36,19 +38,12 @@ class FlutterTizenView : public TizenViewEventHandlerDelegate { // Configures the window instance with an instance of a running Flutter // engine. - void SetEngine(std::unique_ptr engine); + void SetupChannels(); FlutterTizenEngine* engine() { return engine_.get(); } TizenViewBase* tizen_view() { return tizen_view_.get(); } - // Creates rendering surface for Flutter engine to draw into. - // Should be called before calling FlutterEngineRun using this view. - void CreateRenderSurface(FlutterDesktopRendererType renderer_type); - - // Destroys current rendering surface if one has been allocated. - void DestroyRenderSurface(); - void Resize(int32_t width, int32_t height); // Callbacks for clearing context, settings context and swapping buffers, @@ -148,6 +143,13 @@ class FlutterTizenView : public TizenViewEventHandlerDelegate { uint64_t buttons = 0; }; + // Creates rendering surface for Flutter engine to draw into. + // Should be called before calling FlutterEngineRun using this view. + void CreateRenderSurface(FlutterDesktopRendererType renderer_type); + + // Destroys current rendering surface if one has been allocated. + void DestroyRenderSurface(); + // Creates a PointerState object unless it already exists. PointerState* GetOrCreatePointerState(FlutterPointerDeviceKind device_kind, int32_t device_id); @@ -172,15 +174,15 @@ class FlutterTizenView : public TizenViewEventHandlerDelegate { size_t timestamp, PointerState* state); - // The engine associated with this view. - std::unique_ptr engine_; - // The view's unique identifier. FlutterViewId view_id_; // The platform view associated with this Flutter view. std::unique_ptr tizen_view_; + // The engine associated with this view. + std::unique_ptr engine_; + // Keeps track of pointer states. std::unordered_map> pointer_states_; From fd412b31e3af4736d4a06ced24b4f55a20c2c684 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 26 Jun 2025 19:26:56 +0800 Subject: [PATCH 02/13] Remove tizen renderer methods from FlutterTizenView 1. Add TizenRendererNui class to decorate GL renderer. --- flutter/shell/platform/tizen/BUILD.gn | 1 + .../tizen/flutter_tizen_elementary.cc | 4 +- .../platform/tizen/flutter_tizen_engine.cc | 28 +++++++-- .../platform/tizen/flutter_tizen_view.cc | 33 +--------- .../shell/platform/tizen/flutter_tizen_view.h | 14 +---- .../platform/tizen/tizen_renderer_nui.cc | 63 +++++++++++++++++++ .../shell/platform/tizen/tizen_renderer_nui.h | 51 +++++++++++++++ 7 files changed, 141 insertions(+), 53 deletions(-) create mode 100644 flutter/shell/platform/tizen/tizen_renderer_nui.cc create mode 100644 flutter/shell/platform/tizen/tizen_renderer_nui.h diff --git a/flutter/shell/platform/tizen/BUILD.gn b/flutter/shell/platform/tizen/BUILD.gn index bb52995..14488e1 100644 --- a/flutter/shell/platform/tizen/BUILD.gn +++ b/flutter/shell/platform/tizen/BUILD.gn @@ -172,6 +172,7 @@ template("embedder") { "flutter_tizen_nui.cc", "tizen_clipboard.cc", "tizen_view_nui.cc", + "tizen_renderer_nui.cc", ] libs += [ diff --git a/flutter/shell/platform/tizen/flutter_tizen_elementary.cc b/flutter/shell/platform/tizen/flutter_tizen_elementary.cc index 605e3dd..c7bf405 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_elementary.cc @@ -32,8 +32,8 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( auto view = std::make_unique( flutter::kImplicitViewId, std::move(tizen_view), - std::unique_ptr(EngineFromHandle(engine)), - FlutterDesktopRendererType::kEvasGL); + std::unique_ptr(EngineFromHandle(engine)), + FlutterDesktopRendererType::kEvasGL); if (!view->engine()->IsRunning()) { if (!view->engine()->RunEngine()) { diff --git a/flutter/shell/platform/tizen/flutter_tizen_engine.cc b/flutter/shell/platform/tizen/flutter_tizen_engine.cc index 848b02b..ccaceea 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_engine.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_engine.cc @@ -19,6 +19,11 @@ #include "flutter/shell/platform/tizen/tizen_renderer_egl.h" #include "flutter/shell/platform/tizen/tizen_renderer_evas_gl.h" +#ifdef NUI_SUPPORT +#include "flutter/shell/platform/tizen/tizen_renderer_nui.h" +#include "flutter/shell/platform/tizen/tizen_view_nui.h" +#endif + namespace flutter { namespace { @@ -94,8 +99,19 @@ void FlutterTizenEngine::CreateRenderer( }, renderer_.get()); } else { +#ifdef NUI_SUPPORT + if (auto* nui_view = + dynamic_cast(view_->tizen_view())) { + renderer_ = std::make_unique( + true, dynamic_cast(view_->tizen_view())); + } else { + renderer_ = std::make_unique( + project_->HasArgument("--enable-impeller")); + } +#else renderer_ = std::make_unique( project_->HasArgument("--enable-impeller")); +#endif } } @@ -444,35 +460,35 @@ FlutterRendererConfig FlutterTizenEngine::GetRendererConfig() { if (!engine->view()) { return false; } - return engine->view()->OnMakeCurrent(); + return engine->renderer()->OnMakeCurrent(); }; config.open_gl.make_resource_current = [](void* user_data) -> bool { auto* engine = static_cast(user_data); if (!engine->view()) { return false; } - return engine->view()->OnMakeResourceCurrent(); + return engine->renderer()->OnMakeResourceCurrent(); }; config.open_gl.clear_current = [](void* user_data) -> bool { auto* engine = static_cast(user_data); if (!engine->view()) { return false; } - return engine->view()->OnClearCurrent(); + return engine->renderer()->OnClearCurrent(); }; config.open_gl.present = [](void* user_data) -> bool { auto* engine = static_cast(user_data); if (!engine->view()) { return false; } - return engine->view()->OnPresent(); + return engine->renderer()->OnPresent(); }; config.open_gl.fbo_callback = [](void* user_data) -> uint32_t { auto* engine = static_cast(user_data); if (!engine->view()) { return false; } - return engine->view()->OnGetFBO(); + return engine->renderer()->OnGetFBO(); }; config.open_gl.surface_transformation = [](void* user_data) -> FlutterTransformation { @@ -488,7 +504,7 @@ FlutterRendererConfig FlutterTizenEngine::GetRendererConfig() { if (!engine->view()) { return nullptr; } - return engine->view()->OnProcResolver(name); + return engine->renderer()->OnProcResolver(name); }; config.open_gl.gl_external_texture_frame_callback = [](void* user_data, int64_t texture_id, size_t width, size_t height, diff --git a/flutter/shell/platform/tizen/flutter_tizen_view.cc b/flutter/shell/platform/tizen/flutter_tizen_view.cc index 323b21f..f9ceaa0 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_view.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_view.cc @@ -55,6 +55,7 @@ FlutterTizenView::FlutterTizenView(FlutterViewId view_id, engine_->SetView(this); SetupChannels(); CreateRenderSurface(renderer_type); + if (auto* window = dynamic_cast(tizen_view_.get())) { window->BindKeys(kBindableSystemKeys); } @@ -74,7 +75,6 @@ void FlutterTizenView::SetupChannels() { internal_plugin_registrar_ = std::make_unique(engine_->plugin_registrar()); - // Set up window dependent channels. BinaryMessenger* messenger = internal_plugin_registrar_->messenger(); auto* window = dynamic_cast(tizen_view_.get()); @@ -134,37 +134,6 @@ void FlutterTizenView::Resize(int32_t width, int32_t height) { tizen_view_->SetGeometry(geometry); } -bool FlutterTizenView::OnMakeCurrent() { - return engine_->renderer()->OnMakeCurrent(); -} - -bool FlutterTizenView::OnClearCurrent() { - return engine_->renderer()->OnClearCurrent(); -} - -bool FlutterTizenView::OnMakeResourceCurrent() { - return engine_->renderer()->OnMakeResourceCurrent(); -} - -bool FlutterTizenView::OnPresent() { - bool result = engine_->renderer()->OnPresent(); -#ifdef NUI_SUPPORT - if (auto* nui_view = - dynamic_cast(tizen_view_.get())) { - nui_view->RequestRendering(); - } -#endif - return result; -} - -uint32_t FlutterTizenView::OnGetFBO() { - return engine_->renderer()->OnGetFBO(); -} - -void* FlutterTizenView::OnProcResolver(const char* name) { - return engine_->renderer()->OnProcResolver(name); -} - void FlutterTizenView::OnResize(int32_t left, int32_t top, int32_t width, diff --git a/flutter/shell/platform/tizen/flutter_tizen_view.h b/flutter/shell/platform/tizen/flutter_tizen_view.h index 13b0d3e..efe23e0 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_view.h +++ b/flutter/shell/platform/tizen/flutter_tizen_view.h @@ -36,8 +36,7 @@ class FlutterTizenView : public TizenViewEventHandlerDelegate { // Get the view's unique identifier. FlutterViewId view_id() const { return view_id_; } - // Configures the window instance with an instance of a running Flutter - // engine. + // Set up window dependent channels. void SetupChannels(); FlutterTizenEngine* engine() { return engine_.get(); } @@ -46,17 +45,6 @@ class FlutterTizenView : public TizenViewEventHandlerDelegate { void Resize(int32_t width, int32_t height); - // Callbacks for clearing context, settings context and swapping buffers, - // these are typically called on an engine-controlled (non-platform) thread. - bool OnMakeCurrent(); - bool OnClearCurrent(); - bool OnMakeResourceCurrent(); - bool OnPresent(); - - uint32_t OnGetFBO(); - - void* OnProcResolver(const char* name); - void OnResize(int32_t left, int32_t top, int32_t width, diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui.cc b/flutter/shell/platform/tizen/tizen_renderer_nui.cc new file mode 100644 index 0000000..8727ae9 --- /dev/null +++ b/flutter/shell/platform/tizen/tizen_renderer_nui.cc @@ -0,0 +1,63 @@ +// Copyright 2025 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/shell/platform/tizen/tizen_renderer_nui.h" +#include "flutter/shell/platform/tizen/tizen_renderer_egl.h" +#include "tizen_renderer.h" + +namespace flutter { + +TizenRendererNui::TizenRendererNui(bool enable_impeller, TizenViewNui* view_nui) + : renderer_(std::make_unique(enable_impeller)), + view_(view_nui) {} + +TizenRendererNui::~TizenRendererNui() {} + +bool TizenRendererNui::CreateSurface(void* render_target, + void* render_target_display, + int32_t width, + int32_t height) { + return renderer_->CreateSurface(render_target, render_target_display, width, + height); +} + +void TizenRendererNui::DestroySurface() { + renderer_->DestroySurface(); +} + +bool TizenRendererNui::OnMakeCurrent() { + return renderer_->OnMakeCurrent(); +} + +bool TizenRendererNui::OnClearCurrent() { + return renderer_->OnClearCurrent(); +} + +bool TizenRendererNui::OnMakeResourceCurrent() { + return renderer_->OnMakeResourceCurrent(); +} + +bool TizenRendererNui::OnPresent() { + auto result = renderer_->OnPresent(); + view_->RequestRendering(); + return result; +} + +uint32_t TizenRendererNui::OnGetFBO() { + return renderer_->OnGetFBO(); +} + +void* TizenRendererNui::OnProcResolver(const char* name) { + return renderer_->OnProcResolver(name); +} + +bool TizenRendererNui::IsSupportedExtension(const char* name) { + return renderer_->IsSupportedExtension(name); +} + +void TizenRendererNui::ResizeSurface(int32_t width, int32_t height) { + renderer_->ResizeSurface(width, height); +} + +} // namespace flutter diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui.h b/flutter/shell/platform/tizen/tizen_renderer_nui.h new file mode 100644 index 0000000..bc3d7a8 --- /dev/null +++ b/flutter/shell/platform/tizen/tizen_renderer_nui.h @@ -0,0 +1,51 @@ +// Copyright 2025 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef EMBEDDER_TIZEN_RENDERER_NUI_H_ +#define EMBEDDER_TIZEN_RENDERER_NUI_H_ + +#include +#include +#include "flutter/shell/platform/tizen/tizen_renderer.h" +#include "flutter/shell/platform/tizen/tizen_view_nui.h" + +namespace flutter { + +class TizenRendererNui : public TizenRenderer { + public: + explicit TizenRendererNui(bool enable_impeller, TizenViewNui* view_nui); + + virtual ~TizenRendererNui(); + + bool CreateSurface(void* render_target, + void* render_target_display, + int32_t width, + int32_t height) override; + + void DestroySurface() override; + + bool OnMakeCurrent() override; + + bool OnClearCurrent() override; + + bool OnMakeResourceCurrent() override; + + bool OnPresent() override; + + uint32_t OnGetFBO() override; + + void* OnProcResolver(const char* name) override; + + bool IsSupportedExtension(const char* name) override; + + void ResizeSurface(int32_t width, int32_t height) override; + + private: + std::unique_ptr renderer_; + TizenViewNui* view_; +}; + +} // namespace flutter + +#endif // EMBEDDER_TIZEN_RENDERER_NUI_H_ From 21d363d124578d772b2251518b557d6cc3bc5add Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Fri, 27 Jun 2025 13:32:44 +0800 Subject: [PATCH 03/13] Do not call CreateSurface and DestorySurface in FlutterTizenView 1.Call CreateSurface when new renderer. 2.Call DestorySurface when desconstruct renderer. --- flutter/shell/platform/tizen/BUILD.gn | 2 +- .../platform/tizen/flutter_tizen_engine.cc | 12 ++++--- .../platform/tizen/flutter_tizen_engine.h | 3 +- .../platform/tizen/flutter_tizen_view.cc | 31 +------------------ .../shell/platform/tizen/flutter_tizen_view.h | 7 ----- .../shell/platform/tizen/tizen_renderer.cc | 17 ++++++++++ flutter/shell/platform/tizen/tizen_renderer.h | 16 +++++----- .../platform/tizen/tizen_renderer_egl.cc | 7 +++-- .../shell/platform/tizen/tizen_renderer_egl.h | 3 +- .../platform/tizen/tizen_renderer_evas_gl.cc | 4 ++- .../platform/tizen/tizen_renderer_evas_gl.h | 3 +- .../platform/tizen/tizen_renderer_nui.cc | 4 +-- .../shell/platform/tizen/tizen_renderer_nui.h | 2 +- 13 files changed, 51 insertions(+), 60 deletions(-) diff --git a/flutter/shell/platform/tizen/BUILD.gn b/flutter/shell/platform/tizen/BUILD.gn index 14488e1..1ae4f82 100644 --- a/flutter/shell/platform/tizen/BUILD.gn +++ b/flutter/shell/platform/tizen/BUILD.gn @@ -171,8 +171,8 @@ template("embedder") { sources += [ "flutter_tizen_nui.cc", "tizen_clipboard.cc", - "tizen_view_nui.cc", "tizen_renderer_nui.cc", + "tizen_view_nui.cc", ] libs += [ diff --git a/flutter/shell/platform/tizen/flutter_tizen_engine.cc b/flutter/shell/platform/tizen/flutter_tizen_engine.cc index ccaceea..48e2df4 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_engine.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_engine.cc @@ -87,7 +87,7 @@ FlutterTizenEngine::~FlutterTizenEngine() { void FlutterTizenEngine::CreateRenderer( FlutterDesktopRendererType renderer_type) { if (renderer_type == FlutterDesktopRendererType::kEvasGL) { - renderer_ = std::make_unique(); + renderer_ = std::make_unique(view_->tizen_view()); render_loop_ = std::make_unique( std::this_thread::get_id(), // main thread @@ -103,14 +103,15 @@ void FlutterTizenEngine::CreateRenderer( if (auto* nui_view = dynamic_cast(view_->tizen_view())) { renderer_ = std::make_unique( - true, dynamic_cast(view_->tizen_view())); + dynamic_cast(view_->tizen_view()), + project_->HasArgument("--enable-impeller")); } else { renderer_ = std::make_unique( - project_->HasArgument("--enable-impeller")); + view_->tizen_view(), project_->HasArgument("--enable-impeller")); } #else renderer_ = std::make_unique( - project_->HasArgument("--enable-impeller")); + view_->tizen_view(), project_->HasArgument("--enable-impeller")); #endif } } @@ -310,8 +311,9 @@ bool FlutterTizenEngine::StopEngine() { return false; } -void FlutterTizenEngine::SetView(FlutterTizenView* view) { +void FlutterTizenEngine::SetView(FlutterTizenView* view, FlutterDesktopRendererType renderer_type) { view_ = view; + CreateRenderer(renderer_type); } void FlutterTizenEngine::AddPluginRegistrarDestructionCallback( diff --git a/flutter/shell/platform/tizen/flutter_tizen_engine.h b/flutter/shell/platform/tizen/flutter_tizen_engine.h index 5d995c5..c9ac10f 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_engine.h +++ b/flutter/shell/platform/tizen/flutter_tizen_engine.h @@ -78,7 +78,8 @@ class FlutterTizenEngine { bool StopEngine(); // Sets the view that is displaying this engine's content. - void SetView(FlutterTizenView* view); + void SetView(FlutterTizenView* view, + FlutterDesktopRendererType renderer_type); // The view displaying this engine's content, if any. This will be null for // headless engines. diff --git a/flutter/shell/platform/tizen/flutter_tizen_view.cc b/flutter/shell/platform/tizen/flutter_tizen_view.cc index f9ceaa0..73643d3 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_view.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_view.cc @@ -52,9 +52,8 @@ FlutterTizenView::FlutterTizenView(FlutterViewId view_id, engine_(std::move(engine)), user_pixel_ratio_(user_pixel_ratio) { tizen_view_->SetView(this); - engine_->SetView(this); + engine_->SetView(this,renderer_type); SetupChannels(); - CreateRenderSurface(renderer_type); if (auto* window = dynamic_cast(tizen_view_.get())) { window->BindKeys(kBindableSystemKeys); @@ -68,7 +67,6 @@ FlutterTizenView::~FlutterTizenView() { } engine_->StopEngine(); } - DestroyRenderSurface(); } void FlutterTizenView::SetupChannels() { @@ -100,33 +98,6 @@ void FlutterTizenView::SetupChannels() { input_device_channel_ = std::make_unique(messenger); } -void FlutterTizenView::CreateRenderSurface( - FlutterDesktopRendererType renderer_type) { - if (engine_) { - engine_->CreateRenderer(renderer_type); - } - - if (engine_ && engine_->renderer()) { - TizenGeometry geometry = tizen_view_->GetGeometry(); - if (dynamic_cast(tizen_view_.get())) { - auto* window = dynamic_cast(tizen_view_.get()); - engine_->renderer()->CreateSurface(window->GetRenderTarget(), - window->GetRenderTargetDisplay(), - geometry.width, geometry.height); - } else { - auto* tizen_view = dynamic_cast(tizen_view_.get()); - engine_->renderer()->CreateSurface(tizen_view->GetRenderTarget(), nullptr, - geometry.width, geometry.height); - } - } -} - -void FlutterTizenView::DestroyRenderSurface() { - if (engine_ && engine_->renderer()) { - engine_->renderer()->DestroySurface(); - } -} - void FlutterTizenView::Resize(int32_t width, int32_t height) { TizenGeometry geometry = tizen_view_->GetGeometry(); geometry.width = width; diff --git a/flutter/shell/platform/tizen/flutter_tizen_view.h b/flutter/shell/platform/tizen/flutter_tizen_view.h index efe23e0..f37d562 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_view.h +++ b/flutter/shell/platform/tizen/flutter_tizen_view.h @@ -131,13 +131,6 @@ class FlutterTizenView : public TizenViewEventHandlerDelegate { uint64_t buttons = 0; }; - // Creates rendering surface for Flutter engine to draw into. - // Should be called before calling FlutterEngineRun using this view. - void CreateRenderSurface(FlutterDesktopRendererType renderer_type); - - // Destroys current rendering surface if one has been allocated. - void DestroyRenderSurface(); - // Creates a PointerState object unless it already exists. PointerState* GetOrCreatePointerState(FlutterPointerDeviceKind device_kind, int32_t device_id); diff --git a/flutter/shell/platform/tizen/tizen_renderer.cc b/flutter/shell/platform/tizen/tizen_renderer.cc index f37732b..02fe231 100644 --- a/flutter/shell/platform/tizen/tizen_renderer.cc +++ b/flutter/shell/platform/tizen/tizen_renderer.cc @@ -3,11 +3,28 @@ // found in the LICENSE file. #include "tizen_renderer.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" +#include "flutter/shell/platform/tizen/tizen_view.h" +#include "flutter/shell/platform/tizen/tizen_window.h" namespace flutter { TizenRenderer::TizenRenderer() {} +bool TizenRenderer::CreateSurface(TizenViewBase* view) { + TizenGeometry geometry = view->GetGeometry(); + if (dynamic_cast(view)) { + auto* window = dynamic_cast(view); + return CreateSurface(window->GetRenderTarget(), + window->GetRenderTargetDisplay(), geometry.width, + geometry.height); + } else { + auto* tizen_view = dynamic_cast(view); + return CreateSurface(tizen_view->GetRenderTarget(), nullptr, geometry.width, + geometry.height); + } +} + TizenRenderer::~TizenRenderer() = default; } // namespace flutter diff --git a/flutter/shell/platform/tizen/tizen_renderer.h b/flutter/shell/platform/tizen/tizen_renderer.h index 1077b17..dbc8661 100644 --- a/flutter/shell/platform/tizen/tizen_renderer.h +++ b/flutter/shell/platform/tizen/tizen_renderer.h @@ -6,6 +6,7 @@ #define EMBEDDER_TIZEN_RENDERER_H_ #include +#include "flutter/shell/platform/tizen/tizen_view_base.h" namespace flutter { @@ -14,14 +15,6 @@ class TizenRenderer { TizenRenderer(); virtual ~TizenRenderer(); - - virtual bool CreateSurface(void* render_target, - void* render_target_display, - int32_t width, - int32_t height) = 0; - - virtual void DestroySurface() = 0; - bool IsValid() { return is_valid_; } virtual bool OnMakeCurrent() = 0; @@ -39,8 +32,15 @@ class TizenRenderer { virtual bool IsSupportedExtension(const char* name) = 0; virtual void ResizeSurface(int32_t width, int32_t height) = 0; + virtual bool CreateSurface(void* render_target, + void* render_target_display, + int32_t width, + int32_t height) = 0; + virtual void DestroySurface() = 0; protected: + bool CreateSurface(TizenViewBase* view); + bool is_valid_ = false; }; diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.cc b/flutter/shell/platform/tizen/tizen_renderer_egl.cc index 2379395..6c7bc0a 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.cc @@ -19,8 +19,11 @@ namespace flutter { -TizenRendererEgl::TizenRendererEgl(bool enable_impeller) - : enable_impeller_(enable_impeller) {} +TizenRendererEgl::TizenRendererEgl(TizenViewBase* view_base, + bool enable_impeller) + : enable_impeller_(enable_impeller) { + TizenRenderer::CreateSurface(view_base); +} TizenRendererEgl::~TizenRendererEgl() { DestroySurface(); diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.h b/flutter/shell/platform/tizen/tizen_renderer_egl.h index cc19ec3..00f8368 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.h @@ -10,12 +10,13 @@ #include #include "flutter/shell/platform/tizen/tizen_renderer.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" namespace flutter { class TizenRendererEgl : public TizenRenderer { public: - explicit TizenRendererEgl(bool enable_impeller); + explicit TizenRendererEgl(TizenViewBase* view_base, bool enable_impeller); virtual ~TizenRendererEgl(); diff --git a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.cc b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.cc index c9e6fc4..5fd58da 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -14,7 +14,9 @@ EVAS_GL_GLOBAL_GLES2_DEFINE(); namespace flutter { -TizenRendererEvasGL::TizenRendererEvasGL() {} +TizenRendererEvasGL::TizenRendererEvasGL(TizenViewBase* view_base) { + TizenRenderer::CreateSurface(view_base); +} TizenRendererEvasGL::~TizenRendererEvasGL() { DestroySurface(); diff --git a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h index 3e74627..b8b50c2 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -10,6 +10,7 @@ #include #include "flutter/shell/platform/tizen/tizen_renderer.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" namespace flutter { @@ -17,7 +18,7 @@ using OnPixelsDirty = std::function; class TizenRendererEvasGL : public TizenRenderer { public: - explicit TizenRendererEvasGL(); + explicit TizenRendererEvasGL(TizenViewBase* view_base); virtual ~TizenRendererEvasGL(); diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui.cc b/flutter/shell/platform/tizen/tizen_renderer_nui.cc index 8727ae9..ac903de 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_nui.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_nui.cc @@ -8,8 +8,8 @@ namespace flutter { -TizenRendererNui::TizenRendererNui(bool enable_impeller, TizenViewNui* view_nui) - : renderer_(std::make_unique(enable_impeller)), +TizenRendererNui::TizenRendererNui(TizenViewNui* view_nui, bool enable_impeller) + : renderer_(std::make_unique(view_nui, enable_impeller)), view_(view_nui) {} TizenRendererNui::~TizenRendererNui() {} diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui.h b/flutter/shell/platform/tizen/tizen_renderer_nui.h index bc3d7a8..2226bd4 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_nui.h +++ b/flutter/shell/platform/tizen/tizen_renderer_nui.h @@ -14,7 +14,7 @@ namespace flutter { class TizenRendererNui : public TizenRenderer { public: - explicit TizenRendererNui(bool enable_impeller, TizenViewNui* view_nui); + explicit TizenRendererNui(TizenViewNui* view_nui, bool enable_impeller); virtual ~TizenRendererNui(); From 6025c589b197896c8f10c0025ede8d2ef413bf2f Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Fri, 27 Jun 2025 14:36:43 +0800 Subject: [PATCH 04/13] Move GetRendererConfig to renderer --- .../platform/tizen/flutter_tizen_engine.cc | 71 ++---------------- .../shell/platform/tizen/tizen_renderer.cc | 75 ++++++++++++++++++- flutter/shell/platform/tizen/tizen_renderer.h | 9 ++- .../platform/tizen/tizen_renderer_egl.cc | 2 + 4 files changed, 89 insertions(+), 68 deletions(-) diff --git a/flutter/shell/platform/tizen/flutter_tizen_engine.cc b/flutter/shell/platform/tizen/flutter_tizen_engine.cc index 48e2df4..bef47d5 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_engine.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_engine.cc @@ -311,7 +311,8 @@ bool FlutterTizenEngine::StopEngine() { return false; } -void FlutterTizenEngine::SetView(FlutterTizenView* view, FlutterDesktopRendererType renderer_type) { +void FlutterTizenEngine::SetView(FlutterTizenView* view, + FlutterDesktopRendererType renderer_type) { view_ = view; CreateRenderer(renderer_type); } @@ -453,79 +454,17 @@ FlutterDesktopMessage FlutterTizenEngine::ConvertToDesktopMessage( } FlutterRendererConfig FlutterTizenEngine::GetRendererConfig() { - FlutterRendererConfig config = {}; if (IsHeaded()) { - config.type = kOpenGL; - config.open_gl.struct_size = sizeof(config.open_gl); - config.open_gl.make_current = [](void* user_data) -> bool { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return false; - } - return engine->renderer()->OnMakeCurrent(); - }; - config.open_gl.make_resource_current = [](void* user_data) -> bool { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return false; - } - return engine->renderer()->OnMakeResourceCurrent(); - }; - config.open_gl.clear_current = [](void* user_data) -> bool { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return false; - } - return engine->renderer()->OnClearCurrent(); - }; - config.open_gl.present = [](void* user_data) -> bool { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return false; - } - return engine->renderer()->OnPresent(); - }; - config.open_gl.fbo_callback = [](void* user_data) -> uint32_t { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return false; - } - return engine->renderer()->OnGetFBO(); - }; - config.open_gl.surface_transformation = - [](void* user_data) -> FlutterTransformation { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return FlutterTransformation(); - } - return engine->view()->GetFlutterTransformation(); - }; - config.open_gl.gl_proc_resolver = [](void* user_data, - const char* name) -> void* { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return nullptr; - } - return engine->renderer()->OnProcResolver(name); - }; - config.open_gl.gl_external_texture_frame_callback = - [](void* user_data, int64_t texture_id, size_t width, size_t height, - FlutterOpenGLTexture* texture) -> bool { - auto* engine = static_cast(user_data); - if (!engine->texture_registrar()) { - return false; - } - return engine->texture_registrar()->PopulateTexture(texture_id, width, - height, texture); - }; + return renderer()->GetRendererConfig(); } else { + FlutterRendererConfig config = {}; config.type = kSoftware; config.software.struct_size = sizeof(config.software); config.software.surface_present_callback = [](void* user_data, const void* allocation, size_t row_bytes, size_t height) -> bool { return true; }; + return config; } - return config; } void FlutterTizenEngine::DispatchAccessibilityAction( diff --git a/flutter/shell/platform/tizen/tizen_renderer.cc b/flutter/shell/platform/tizen/tizen_renderer.cc index 02fe231..63f4a0d 100644 --- a/flutter/shell/platform/tizen/tizen_renderer.cc +++ b/flutter/shell/platform/tizen/tizen_renderer.cc @@ -3,8 +3,9 @@ // found in the LICENSE file. #include "tizen_renderer.h" -#include "flutter/shell/platform/tizen/tizen_view_base.h" +#include "flutter/shell/platform/tizen/flutter_tizen_engine.h" #include "flutter/shell/platform/tizen/tizen_view.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" #include "flutter/shell/platform/tizen/tizen_window.h" namespace flutter { @@ -25,6 +26,78 @@ bool TizenRenderer::CreateSurface(TizenViewBase* view) { } } +FlutterTransformation TizenRenderer::GetTransformation() const { + return flutter_transformation_; +} + +FlutterRendererConfig TizenRenderer::GetRendererConfig() { + FlutterRendererConfig config = {}; + config.type = kOpenGL; + config.open_gl.struct_size = sizeof(config.open_gl); + config.open_gl.make_current = [](void* user_data) -> bool { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return false; + } + return engine->renderer()->OnMakeCurrent(); + }; + config.open_gl.make_resource_current = [](void* user_data) -> bool { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return false; + } + return engine->renderer()->OnMakeResourceCurrent(); + }; + config.open_gl.clear_current = [](void* user_data) -> bool { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return false; + } + return engine->renderer()->OnClearCurrent(); + }; + config.open_gl.present = [](void* user_data) -> bool { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return false; + } + return engine->renderer()->OnPresent(); + }; + config.open_gl.fbo_callback = [](void* user_data) -> uint32_t { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return false; + } + return engine->renderer()->OnGetFBO(); + }; + config.open_gl.surface_transformation = + [](void* user_data) -> FlutterTransformation { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return FlutterTransformation(); + } + return engine->renderer()->GetTransformation(); + }; + config.open_gl.gl_proc_resolver = [](void* user_data, + const char* name) -> void* { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return nullptr; + } + return engine->renderer()->OnProcResolver(name); + }; + config.open_gl.gl_external_texture_frame_callback = + [](void* user_data, int64_t texture_id, size_t width, size_t height, + FlutterOpenGLTexture* texture) -> bool { + auto* engine = static_cast(user_data); + if (!engine->texture_registrar()) { + return false; + } + return engine->texture_registrar()->PopulateTexture(texture_id, width, + height, texture); + }; + return config; +} + TizenRenderer::~TizenRenderer() = default; } // namespace flutter diff --git a/flutter/shell/platform/tizen/tizen_renderer.h b/flutter/shell/platform/tizen/tizen_renderer.h index dbc8661..c76bc3b 100644 --- a/flutter/shell/platform/tizen/tizen_renderer.h +++ b/flutter/shell/platform/tizen/tizen_renderer.h @@ -6,6 +6,7 @@ #define EMBEDDER_TIZEN_RENDERER_H_ #include +#include "flutter/shell/platform/embedder/embedder.h" #include "flutter/shell/platform/tizen/tizen_view_base.h" namespace flutter { @@ -38,10 +39,16 @@ class TizenRenderer { int32_t height) = 0; virtual void DestroySurface() = 0; + FlutterTransformation GetTransformation() const; + + FlutterRendererConfig GetRendererConfig(); + protected: bool CreateSurface(TizenViewBase* view); - bool is_valid_ = false; + // The current surface transformation. + FlutterTransformation flutter_transformation_ = {1.0, 0.0, 0.0, 0.0, 1.0, + 0.0, 0.0, 0.0, 1.0}; }; } // namespace flutter diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.cc b/flutter/shell/platform/tizen/tizen_renderer_egl.cc index 6c7bc0a..be2254c 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.cc @@ -33,6 +33,7 @@ bool TizenRendererEgl::CreateSurface(void* render_target, void* render_target_display, int32_t width, int32_t height) { + FT_LOG(Error) << "CreateSurface"; if (render_target_display) { egl_display_ = eglGetDisplay(static_cast(render_target_display)); @@ -118,6 +119,7 @@ bool TizenRendererEgl::CreateSurface(void* render_target, } void TizenRendererEgl::DestroySurface() { + FT_LOG(Error) << "DestroySurface"; if (egl_display_) { eglMakeCurrent(egl_display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); From 445a7c9ad8f6498cb143e44013d332b27dfc33a9 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Fri, 27 Jun 2025 15:53:01 +0800 Subject: [PATCH 05/13] Add TizenRendererGL --- flutter/shell/platform/tizen/BUILD.gn | 1 + .../tizen/flutter_tizen_texture_registrar.cc | 9 +- .../shell/platform/tizen/tizen_renderer.cc | 72 --------------- flutter/shell/platform/tizen/tizen_renderer.h | 21 +---- .../platform/tizen/tizen_renderer_egl.cc | 1 - .../shell/platform/tizen/tizen_renderer_egl.h | 3 +- .../platform/tizen/tizen_renderer_evas_gl.h | 3 +- .../shell/platform/tizen/tizen_renderer_gl.cc | 92 +++++++++++++++++++ .../shell/platform/tizen/tizen_renderer_gl.h | 48 ++++++++++ 9 files changed, 151 insertions(+), 99 deletions(-) create mode 100644 flutter/shell/platform/tizen/tizen_renderer_gl.cc create mode 100644 flutter/shell/platform/tizen/tizen_renderer_gl.h diff --git a/flutter/shell/platform/tizen/BUILD.gn b/flutter/shell/platform/tizen/BUILD.gn index 1ae4f82..c534986 100644 --- a/flutter/shell/platform/tizen/BUILD.gn +++ b/flutter/shell/platform/tizen/BUILD.gn @@ -115,6 +115,7 @@ template("embedder") { "tizen_renderer.cc", "tizen_renderer_egl.cc", "tizen_renderer_evas_gl.cc", + "tizen_renderer_gl.cc", "tizen_view_elementary.cc", "tizen_vsync_waiter.cc", "tizen_window_ecore_wl2.cc", diff --git a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc index a3b4181..b16b481 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -123,12 +123,13 @@ FlutterTizenTextureRegistrar::CreateExternalTexture( case kFlutterDesktopGpuSurfaceTexture: ExternalTextureExtensionType gl_extension = ExternalTextureExtensionType::kNone; - if (engine_->renderer() && engine_->renderer()->IsSupportedExtension( - "EGL_TIZEN_image_native_surface")) { + if (engine_->renderer() && + dynamic_cast(engine_->renderer()) + ->IsSupportedExtension("EGL_TIZEN_image_native_surface")) { gl_extension = ExternalTextureExtensionType::kNativeSurface; } else if (engine_->renderer() && - engine_->renderer()->IsSupportedExtension( - "EGL_EXT_image_dma_buf_import")) { + dynamic_cast(engine_->renderer()) + ->IsSupportedExtension("EGL_EXT_image_dma_buf_import")) { gl_extension = ExternalTextureExtensionType::kDmaBuffer; } if (renderer_type == FlutterDesktopRendererType::kEvasGL) { diff --git a/flutter/shell/platform/tizen/tizen_renderer.cc b/flutter/shell/platform/tizen/tizen_renderer.cc index 63f4a0d..4272a44 100644 --- a/flutter/shell/platform/tizen/tizen_renderer.cc +++ b/flutter/shell/platform/tizen/tizen_renderer.cc @@ -26,78 +26,6 @@ bool TizenRenderer::CreateSurface(TizenViewBase* view) { } } -FlutterTransformation TizenRenderer::GetTransformation() const { - return flutter_transformation_; -} - -FlutterRendererConfig TizenRenderer::GetRendererConfig() { - FlutterRendererConfig config = {}; - config.type = kOpenGL; - config.open_gl.struct_size = sizeof(config.open_gl); - config.open_gl.make_current = [](void* user_data) -> bool { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return false; - } - return engine->renderer()->OnMakeCurrent(); - }; - config.open_gl.make_resource_current = [](void* user_data) -> bool { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return false; - } - return engine->renderer()->OnMakeResourceCurrent(); - }; - config.open_gl.clear_current = [](void* user_data) -> bool { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return false; - } - return engine->renderer()->OnClearCurrent(); - }; - config.open_gl.present = [](void* user_data) -> bool { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return false; - } - return engine->renderer()->OnPresent(); - }; - config.open_gl.fbo_callback = [](void* user_data) -> uint32_t { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return false; - } - return engine->renderer()->OnGetFBO(); - }; - config.open_gl.surface_transformation = - [](void* user_data) -> FlutterTransformation { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return FlutterTransformation(); - } - return engine->renderer()->GetTransformation(); - }; - config.open_gl.gl_proc_resolver = [](void* user_data, - const char* name) -> void* { - auto* engine = static_cast(user_data); - if (!engine->view()) { - return nullptr; - } - return engine->renderer()->OnProcResolver(name); - }; - config.open_gl.gl_external_texture_frame_callback = - [](void* user_data, int64_t texture_id, size_t width, size_t height, - FlutterOpenGLTexture* texture) -> bool { - auto* engine = static_cast(user_data); - if (!engine->texture_registrar()) { - return false; - } - return engine->texture_registrar()->PopulateTexture(texture_id, width, - height, texture); - }; - return config; -} - TizenRenderer::~TizenRenderer() = default; } // namespace flutter diff --git a/flutter/shell/platform/tizen/tizen_renderer.h b/flutter/shell/platform/tizen/tizen_renderer.h index c76bc3b..20a9354 100644 --- a/flutter/shell/platform/tizen/tizen_renderer.h +++ b/flutter/shell/platform/tizen/tizen_renderer.h @@ -18,20 +18,6 @@ class TizenRenderer { virtual ~TizenRenderer(); bool IsValid() { return is_valid_; } - virtual bool OnMakeCurrent() = 0; - - virtual bool OnClearCurrent() = 0; - - virtual bool OnMakeResourceCurrent() = 0; - - virtual bool OnPresent() = 0; - - virtual uint32_t OnGetFBO() = 0; - - virtual void* OnProcResolver(const char* name) = 0; - - virtual bool IsSupportedExtension(const char* name) = 0; - virtual void ResizeSurface(int32_t width, int32_t height) = 0; virtual bool CreateSurface(void* render_target, void* render_target_display, @@ -39,16 +25,11 @@ class TizenRenderer { int32_t height) = 0; virtual void DestroySurface() = 0; - FlutterTransformation GetTransformation() const; - - FlutterRendererConfig GetRendererConfig(); + virtual FlutterRendererConfig GetRendererConfig() = 0; protected: bool CreateSurface(TizenViewBase* view); bool is_valid_ = false; - // The current surface transformation. - FlutterTransformation flutter_transformation_ = {1.0, 0.0, 0.0, 0.0, 1.0, - 0.0, 0.0, 0.0, 1.0}; }; } // namespace flutter diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.cc b/flutter/shell/platform/tizen/tizen_renderer_egl.cc index be2254c..2eb7519 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.cc @@ -33,7 +33,6 @@ bool TizenRendererEgl::CreateSurface(void* render_target, void* render_target_display, int32_t width, int32_t height) { - FT_LOG(Error) << "CreateSurface"; if (render_target_display) { egl_display_ = eglGetDisplay(static_cast(render_target_display)); diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.h b/flutter/shell/platform/tizen/tizen_renderer_egl.h index 00f8368..5e2af61 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.h @@ -11,10 +11,11 @@ #include "flutter/shell/platform/tizen/tizen_renderer.h" #include "flutter/shell/platform/tizen/tizen_view_base.h" +#include "flutter/shell/platform/tizen/tizen_renderer_gl.h" namespace flutter { -class TizenRendererEgl : public TizenRenderer { +class TizenRendererEgl : public TizenRendererGL { public: explicit TizenRendererEgl(TizenViewBase* view_base, bool enable_impeller); diff --git a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h index b8b50c2..a24c9ce 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -11,12 +11,13 @@ #include "flutter/shell/platform/tizen/tizen_renderer.h" #include "flutter/shell/platform/tizen/tizen_view_base.h" +#include "flutter/shell/platform/tizen/tizen_renderer_gl.h" namespace flutter { using OnPixelsDirty = std::function; -class TizenRendererEvasGL : public TizenRenderer { +class TizenRendererEvasGL : public TizenRendererGL { public: explicit TizenRendererEvasGL(TizenViewBase* view_base); diff --git a/flutter/shell/platform/tizen/tizen_renderer_gl.cc b/flutter/shell/platform/tizen/tizen_renderer_gl.cc new file mode 100644 index 0000000..45ef840 --- /dev/null +++ b/flutter/shell/platform/tizen/tizen_renderer_gl.cc @@ -0,0 +1,92 @@ +// Copyright 2025 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "tizen_renderer_gl.h" +#include "flutter/shell/platform/tizen/flutter_tizen_engine.h" +#include "flutter/shell/platform/tizen/tizen_view.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" +#include "flutter/shell/platform/tizen/tizen_window.h" + +namespace flutter { + +TizenRendererGL::TizenRendererGL() {} + +FlutterTransformation TizenRendererGL::GetTransformation() const { + return flutter_transformation_; +} + +FlutterRendererConfig TizenRendererGL::GetRendererConfig() { + FlutterRendererConfig config = {}; + config.type = kOpenGL; + config.open_gl.struct_size = sizeof(config.open_gl); + config.open_gl.make_current = [](void* user_data) -> bool { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return false; + } + return dynamic_cast(engine->renderer())->OnMakeCurrent(); + }; + config.open_gl.make_resource_current = [](void* user_data) -> bool { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return false; + } + return dynamic_cast(engine->renderer()) + ->OnMakeResourceCurrent(); + }; + config.open_gl.clear_current = [](void* user_data) -> bool { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return false; + } + return dynamic_cast(engine->renderer())->OnClearCurrent(); + }; + config.open_gl.present = [](void* user_data) -> bool { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return false; + } + return dynamic_cast(engine->renderer())->OnPresent(); + }; + config.open_gl.fbo_callback = [](void* user_data) -> uint32_t { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return false; + } + return dynamic_cast(engine->renderer())->OnGetFBO(); + }; + config.open_gl.surface_transformation = + [](void* user_data) -> FlutterTransformation { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return FlutterTransformation(); + } + return dynamic_cast(engine->renderer()) + ->GetTransformation(); + }; + config.open_gl.gl_proc_resolver = [](void* user_data, + const char* name) -> void* { + auto* engine = static_cast(user_data); + if (!engine->view()) { + return nullptr; + } + return dynamic_cast(engine->renderer()) + ->OnProcResolver(name); + }; + config.open_gl.gl_external_texture_frame_callback = + [](void* user_data, int64_t texture_id, size_t width, size_t height, + FlutterOpenGLTexture* texture) -> bool { + auto* engine = static_cast(user_data); + if (!engine->texture_registrar()) { + return false; + } + return engine->texture_registrar()->PopulateTexture(texture_id, width, + height, texture); + }; + return config; +} + +TizenRendererGL::~TizenRendererGL() = default; + +} // namespace flutter diff --git a/flutter/shell/platform/tizen/tizen_renderer_gl.h b/flutter/shell/platform/tizen/tizen_renderer_gl.h new file mode 100644 index 0000000..c08290c --- /dev/null +++ b/flutter/shell/platform/tizen/tizen_renderer_gl.h @@ -0,0 +1,48 @@ +// Copyright 2025 Samsung Electronics Co., Ltd. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef EMBEDDER_TIZEN_RENDERER_GL_H_ +#define EMBEDDER_TIZEN_RENDERER_GL_H_ + +#include +#include "flutter/shell/platform/embedder/embedder.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" +#include "flutter/shell/platform/tizen/tizen_renderer.h" + +namespace flutter { + +class TizenRendererGL : public TizenRenderer { + public: + TizenRendererGL(); + + virtual ~TizenRendererGL(); + + virtual bool OnMakeCurrent() = 0; + + virtual bool OnClearCurrent() = 0; + + virtual bool OnMakeResourceCurrent() = 0; + + virtual bool OnPresent() = 0; + + virtual uint32_t OnGetFBO() = 0; + + virtual void* OnProcResolver(const char* name) = 0; + + + virtual bool IsSupportedExtension(const char* name) = 0; + + FlutterTransformation GetTransformation() const; + + FlutterRendererConfig GetRendererConfig() override; + + protected: + // The current surface transformation. + FlutterTransformation flutter_transformation_ = {1.0, 0.0, 0.0, 0.0, 1.0, + 0.0, 0.0, 0.0, 1.0}; +}; + +} // namespace flutter + +#endif // EMBEDDER_TIZEN_RENDERER_GL_H_ From c5aef70629d9c30884dee3524e9575df66f8ca98 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Fri, 27 Jun 2025 16:43:29 +0800 Subject: [PATCH 06/13] Fix build error and code format issue --- flutter/shell/platform/tizen/BUILD.gn | 2 +- .../platform/tizen/flutter_tizen_engine.cc | 4 +-- .../platform/tizen/flutter_tizen_view.cc | 2 +- .../shell/platform/tizen/tizen_renderer_egl.h | 2 +- .../platform/tizen/tizen_renderer_evas_gl.h | 2 +- .../shell/platform/tizen/tizen_renderer_gl.h | 3 +- ...nderer_nui.cc => tizen_renderer_nui_gl.cc} | 33 ++++++++++--------- ...renderer_nui.h => tizen_renderer_nui_gl.h} | 10 +++--- 8 files changed, 29 insertions(+), 29 deletions(-) rename flutter/shell/platform/tizen/{tizen_renderer_nui.cc => tizen_renderer_nui_gl.cc} (50%) rename flutter/shell/platform/tizen/{tizen_renderer_nui.h => tizen_renderer_nui_gl.h} (79%) diff --git a/flutter/shell/platform/tizen/BUILD.gn b/flutter/shell/platform/tizen/BUILD.gn index c534986..55149d4 100644 --- a/flutter/shell/platform/tizen/BUILD.gn +++ b/flutter/shell/platform/tizen/BUILD.gn @@ -172,7 +172,7 @@ template("embedder") { sources += [ "flutter_tizen_nui.cc", "tizen_clipboard.cc", - "tizen_renderer_nui.cc", + "tizen_renderer_nui_gl.cc", "tizen_view_nui.cc", ] diff --git a/flutter/shell/platform/tizen/flutter_tizen_engine.cc b/flutter/shell/platform/tizen/flutter_tizen_engine.cc index bef47d5..abe38d0 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_engine.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_engine.cc @@ -20,7 +20,7 @@ #include "flutter/shell/platform/tizen/tizen_renderer_evas_gl.h" #ifdef NUI_SUPPORT -#include "flutter/shell/platform/tizen/tizen_renderer_nui.h" +#include "flutter/shell/platform/tizen/tizen_renderer_nui_gl.h" #include "flutter/shell/platform/tizen/tizen_view_nui.h" #endif @@ -102,7 +102,7 @@ void FlutterTizenEngine::CreateRenderer( #ifdef NUI_SUPPORT if (auto* nui_view = dynamic_cast(view_->tizen_view())) { - renderer_ = std::make_unique( + renderer_ = std::make_unique( dynamic_cast(view_->tizen_view()), project_->HasArgument("--enable-impeller")); } else { diff --git a/flutter/shell/platform/tizen/flutter_tizen_view.cc b/flutter/shell/platform/tizen/flutter_tizen_view.cc index 73643d3..1c7c0fe 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_view.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_view.cc @@ -52,7 +52,7 @@ FlutterTizenView::FlutterTizenView(FlutterViewId view_id, engine_(std::move(engine)), user_pixel_ratio_(user_pixel_ratio) { tizen_view_->SetView(this); - engine_->SetView(this,renderer_type); + engine_->SetView(this, renderer_type); SetupChannels(); if (auto* window = dynamic_cast(tizen_view_.get())) { diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.h b/flutter/shell/platform/tizen/tizen_renderer_egl.h index 5e2af61..10ccf21 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.h @@ -10,8 +10,8 @@ #include #include "flutter/shell/platform/tizen/tizen_renderer.h" -#include "flutter/shell/platform/tizen/tizen_view_base.h" #include "flutter/shell/platform/tizen/tizen_renderer_gl.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" namespace flutter { diff --git a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h index a24c9ce..975933d 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -10,8 +10,8 @@ #include #include "flutter/shell/platform/tizen/tizen_renderer.h" -#include "flutter/shell/platform/tizen/tizen_view_base.h" #include "flutter/shell/platform/tizen/tizen_renderer_gl.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" namespace flutter { diff --git a/flutter/shell/platform/tizen/tizen_renderer_gl.h b/flutter/shell/platform/tizen/tizen_renderer_gl.h index c08290c..bff1266 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_gl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_gl.h @@ -7,8 +7,8 @@ #include #include "flutter/shell/platform/embedder/embedder.h" -#include "flutter/shell/platform/tizen/tizen_view_base.h" #include "flutter/shell/platform/tizen/tizen_renderer.h" +#include "flutter/shell/platform/tizen/tizen_view_base.h" namespace flutter { @@ -30,7 +30,6 @@ class TizenRendererGL : public TizenRenderer { virtual void* OnProcResolver(const char* name) = 0; - virtual bool IsSupportedExtension(const char* name) = 0; FlutterTransformation GetTransformation() const; diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui.cc b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc similarity index 50% rename from flutter/shell/platform/tizen/tizen_renderer_nui.cc rename to flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc index ac903de..edfd28a 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_nui.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc @@ -2,61 +2,62 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "flutter/shell/platform/tizen/tizen_renderer_nui.h" +#include "flutter/shell/platform/tizen/tizen_renderer_nui_gl.h" #include "flutter/shell/platform/tizen/tizen_renderer_egl.h" #include "tizen_renderer.h" namespace flutter { -TizenRendererNui::TizenRendererNui(TizenViewNui* view_nui, bool enable_impeller) +TizenRendererNuiGL::TizenRendererNuiGL(TizenViewNui* view_nui, + bool enable_impeller) : renderer_(std::make_unique(view_nui, enable_impeller)), view_(view_nui) {} -TizenRendererNui::~TizenRendererNui() {} +TizenRendererNuiGL::~TizenRendererNuiGL() {} -bool TizenRendererNui::CreateSurface(void* render_target, - void* render_target_display, - int32_t width, - int32_t height) { +bool TizenRendererNuiGL::CreateSurface(void* render_target, + void* render_target_display, + int32_t width, + int32_t height) { return renderer_->CreateSurface(render_target, render_target_display, width, height); } -void TizenRendererNui::DestroySurface() { +void TizenRendererNuiGL::DestroySurface() { renderer_->DestroySurface(); } -bool TizenRendererNui::OnMakeCurrent() { +bool TizenRendererNuiGL::OnMakeCurrent() { return renderer_->OnMakeCurrent(); } -bool TizenRendererNui::OnClearCurrent() { +bool TizenRendererNuiGL::OnClearCurrent() { return renderer_->OnClearCurrent(); } -bool TizenRendererNui::OnMakeResourceCurrent() { +bool TizenRendererNuiGL::OnMakeResourceCurrent() { return renderer_->OnMakeResourceCurrent(); } -bool TizenRendererNui::OnPresent() { +bool TizenRendererNuiGL::OnPresent() { auto result = renderer_->OnPresent(); view_->RequestRendering(); return result; } -uint32_t TizenRendererNui::OnGetFBO() { +uint32_t TizenRendererNuiGL::OnGetFBO() { return renderer_->OnGetFBO(); } -void* TizenRendererNui::OnProcResolver(const char* name) { +void* TizenRendererNuiGL::OnProcResolver(const char* name) { return renderer_->OnProcResolver(name); } -bool TizenRendererNui::IsSupportedExtension(const char* name) { +bool TizenRendererNuiGL::IsSupportedExtension(const char* name) { return renderer_->IsSupportedExtension(name); } -void TizenRendererNui::ResizeSurface(int32_t width, int32_t height) { +void TizenRendererNuiGL::ResizeSurface(int32_t width, int32_t height) { renderer_->ResizeSurface(width, height); } diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui.h b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.h similarity index 79% rename from flutter/shell/platform/tizen/tizen_renderer_nui.h rename to flutter/shell/platform/tizen/tizen_renderer_nui_gl.h index 2226bd4..0a27b9d 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_nui.h +++ b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.h @@ -7,16 +7,16 @@ #include #include -#include "flutter/shell/platform/tizen/tizen_renderer.h" +#include "flutter/shell/platform/tizen/tizen_renderer_gl.h" #include "flutter/shell/platform/tizen/tizen_view_nui.h" namespace flutter { -class TizenRendererNui : public TizenRenderer { +class TizenRendererNuiGL : public TizenRendererGL { public: - explicit TizenRendererNui(TizenViewNui* view_nui, bool enable_impeller); + explicit TizenRendererNuiGL(TizenViewNui* view_nui, bool enable_impeller); - virtual ~TizenRendererNui(); + virtual ~TizenRendererNuiGL(); bool CreateSurface(void* render_target, void* render_target_display, @@ -42,7 +42,7 @@ class TizenRendererNui : public TizenRenderer { void ResizeSurface(int32_t width, int32_t height) override; private: - std::unique_ptr renderer_; + std::unique_ptr renderer_; TizenViewNui* view_; }; From 908e90093075ef3171d14eee130b3abf95c91fe1 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Mon, 30 Jun 2025 18:25:53 +0800 Subject: [PATCH 07/13] Move create texture code from texture registrar to renderer --- .../platform/tizen/flutter_tizen_engine.cc | 3 +- .../tizen/flutter_tizen_texture_registrar.cc | 60 +------------------ .../tizen/flutter_tizen_texture_registrar.h | 8 +-- ...utter_tizen_texture_registrar_unittests.cc | 8 +-- flutter/shell/platform/tizen/tizen_renderer.h | 3 + .../platform/tizen/tizen_renderer_egl.cc | 33 ++++++++++ .../shell/platform/tizen/tizen_renderer_egl.h | 4 ++ .../platform/tizen/tizen_renderer_evas_gl.cc | 17 ++++++ .../platform/tizen/tizen_renderer_evas_gl.h | 4 ++ .../shell/platform/tizen/tizen_renderer_gl.cc | 12 ++++ .../shell/platform/tizen/tizen_renderer_gl.h | 2 + .../platform/tizen/tizen_renderer_nui_gl.cc | 5 ++ .../platform/tizen/tizen_renderer_nui_gl.h | 3 + 13 files changed, 92 insertions(+), 70 deletions(-) diff --git a/flutter/shell/platform/tizen/flutter_tizen_engine.cc b/flutter/shell/platform/tizen/flutter_tizen_engine.cc index abe38d0..7a48de9 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_engine.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_engine.cc @@ -261,8 +261,7 @@ bool FlutterTizenEngine::RunEngine() { internal_plugin_registrar_->messenger()); if (IsHeaded()) { - texture_registrar_ = std::make_unique( - this, project_->HasArgument("--enable-impeller")); + texture_registrar_ = std::make_unique(this); keyboard_channel_ = std::make_unique( internal_plugin_registrar_->messenger(), [this](const FlutterKeyEvent& event, FlutterKeyEventCallback callback, diff --git a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc index b16b481..eea0c6b 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -20,9 +20,8 @@ namespace flutter { FlutterTizenTextureRegistrar::FlutterTizenTextureRegistrar( - FlutterTizenEngine* engine, - bool enable_impeller) - : engine_(engine), enable_impeller_(enable_impeller) {} + FlutterTizenEngine* engine) + : engine_(engine) {} int64_t FlutterTizenTextureRegistrar::RegisterTexture( const FlutterDesktopTextureInfo* texture_info) { @@ -45,12 +44,8 @@ int64_t FlutterTizenTextureRegistrar::RegisterTexture( return -1; } } - FlutterDesktopRendererType renderer_type = FlutterDesktopRendererType::kEGL; - if (dynamic_cast(engine_->renderer())) { - renderer_type = FlutterDesktopRendererType::kEvasGL; - } std::unique_ptr texture_gl = - CreateExternalTexture(texture_info, renderer_type); + engine_->renderer()->CreateExternalTexture(texture_info); if (!texture_gl) { FT_LOG(Error) << "Failed to create ExternalTexture."; return -1; @@ -100,53 +95,4 @@ bool FlutterTizenTextureRegistrar::PopulateTexture( return texture->PopulateTexture(width, height, opengl_texture); } -std::unique_ptr -FlutterTizenTextureRegistrar::CreateExternalTexture( - const FlutterDesktopTextureInfo* texture_info, - FlutterDesktopRendererType renderer_type) { - switch (texture_info->type) { - case kFlutterDesktopPixelBufferTexture: - if (renderer_type == FlutterDesktopRendererType::kEvasGL) { - return std::make_unique( - texture_info->pixel_buffer_config.callback, - texture_info->pixel_buffer_config.user_data); - } - if (enable_impeller_) { - return std::make_unique( - texture_info->pixel_buffer_config.callback, - texture_info->pixel_buffer_config.user_data); - } else { - return std::make_unique( - texture_info->pixel_buffer_config.callback, - texture_info->pixel_buffer_config.user_data); - } - case kFlutterDesktopGpuSurfaceTexture: - ExternalTextureExtensionType gl_extension = - ExternalTextureExtensionType::kNone; - if (engine_->renderer() && - dynamic_cast(engine_->renderer()) - ->IsSupportedExtension("EGL_TIZEN_image_native_surface")) { - gl_extension = ExternalTextureExtensionType::kNativeSurface; - } else if (engine_->renderer() && - dynamic_cast(engine_->renderer()) - ->IsSupportedExtension("EGL_EXT_image_dma_buf_import")) { - gl_extension = ExternalTextureExtensionType::kDmaBuffer; - } - if (renderer_type == FlutterDesktopRendererType::kEvasGL) { - return std::make_unique( - gl_extension, texture_info->gpu_surface_config.callback, - texture_info->gpu_surface_config.user_data); - } - if (enable_impeller_) { - return std::make_unique( - gl_extension, texture_info->gpu_surface_config.callback, - texture_info->gpu_surface_config.user_data); - } else { - return std::make_unique( - gl_extension, texture_info->gpu_surface_config.callback, - texture_info->gpu_surface_config.user_data); - } - } -} - } // namespace flutter diff --git a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.h b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.h index a56976e..cc2482c 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.h +++ b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.h @@ -20,8 +20,7 @@ class FlutterTizenEngine; // Thread safety: All member methods are thread safe. class FlutterTizenTextureRegistrar { public: - explicit FlutterTizenTextureRegistrar(FlutterTizenEngine* engine, - bool enable_impeller); + explicit FlutterTizenTextureRegistrar(FlutterTizenEngine* engine); // Registers a texture described by the given |texture_info| object. // @@ -47,17 +46,12 @@ class FlutterTizenTextureRegistrar { size_t height, FlutterOpenGLTexture* texture); - std::unique_ptr CreateExternalTexture( - const FlutterDesktopTextureInfo* info, - FlutterDesktopRendererType renderer_type); - private: FlutterTizenEngine* engine_ = nullptr; // All registered textures, keyed by their IDs. std::unordered_map> textures_; std::mutex map_mutex_; - bool enable_impeller_ = false; }; } // namespace flutter diff --git a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc index 0f9d156..f757c4c 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc @@ -43,7 +43,7 @@ class FlutterTizenTextureRegistrarTest : public ::testing::Test { }; TEST_F(FlutterTizenTextureRegistrarTest, CreateDestroy) { - FlutterTizenTextureRegistrar registrar(engine_, false); + FlutterTizenTextureRegistrar registrar(engine_); EXPECT_TRUE(true); } @@ -51,7 +51,7 @@ TEST_F(FlutterTizenTextureRegistrarTest, CreateDestroy) { TEST_F(FlutterTizenTextureRegistrarTest, RegisterUnregisterTexture) { EngineModifier modifier(engine_); - FlutterTizenTextureRegistrar registrar(engine_, false); + FlutterTizenTextureRegistrar registrar(engine_); FlutterDesktopTextureInfo texture_info = {}; texture_info.type = kFlutterDesktopGpuSurfaceTexture; @@ -105,7 +105,7 @@ TEST_F(FlutterTizenTextureRegistrarTest, RegisterUnregisterTexture) { TEST_F(FlutterTizenTextureRegistrarTest, RegisterUnknownTextureType) { EngineModifier modifier(engine_); - FlutterTizenTextureRegistrar registrar(engine_, false); + FlutterTizenTextureRegistrar registrar(engine_); FlutterDesktopTextureInfo texture_info = {}; texture_info.type = static_cast(1234); @@ -116,7 +116,7 @@ TEST_F(FlutterTizenTextureRegistrarTest, RegisterUnknownTextureType) { } TEST_F(FlutterTizenTextureRegistrarTest, PopulateInvalidTexture) { - FlutterTizenTextureRegistrar registrar(engine_, false); + FlutterTizenTextureRegistrar registrar(engine_); bool result = registrar.PopulateTexture(1, 640, 480, nullptr); EXPECT_FALSE(result); diff --git a/flutter/shell/platform/tizen/tizen_renderer.h b/flutter/shell/platform/tizen/tizen_renderer.h index 20a9354..8fcada3 100644 --- a/flutter/shell/platform/tizen/tizen_renderer.h +++ b/flutter/shell/platform/tizen/tizen_renderer.h @@ -7,6 +7,7 @@ #include #include "flutter/shell/platform/embedder/embedder.h" +#include "flutter/shell/platform/tizen/external_texture.h" #include "flutter/shell/platform/tizen/tizen_view_base.h" namespace flutter { @@ -26,6 +27,8 @@ class TizenRenderer { virtual void DestroySurface() = 0; virtual FlutterRendererConfig GetRendererConfig() = 0; + virtual std::unique_ptr CreateExternalTexture( + const FlutterDesktopTextureInfo* texture_info) = 0; protected: bool CreateSurface(TizenViewBase* view); diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.cc b/flutter/shell/platform/tizen/tizen_renderer_egl.cc index 2eb7519..317b2d2 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.cc @@ -17,6 +17,11 @@ #include "flutter/shell/platform/tizen/logger.h" +#include "flutter/shell/platform/tizen/external_texture_pixel_egl.h" +#include "flutter/shell/platform/tizen/external_texture_pixel_egl_impeller.h" +#include "flutter/shell/platform/tizen/external_texture_surface_egl.h" +#include "flutter/shell/platform/tizen/external_texture_surface_egl_impeller.h" + namespace flutter { TizenRendererEgl::TizenRendererEgl(TizenViewBase* view_base, @@ -29,6 +34,34 @@ TizenRendererEgl::~TizenRendererEgl() { DestroySurface(); } +std::unique_ptr TizenRendererEgl::CreateExternalTexture( + const FlutterDesktopTextureInfo* texture_info) { + switch (texture_info->type) { + case kFlutterDesktopPixelBufferTexture: + if (enable_impeller_) { + return std::make_unique( + texture_info->pixel_buffer_config.callback, + texture_info->pixel_buffer_config.user_data); + } else { + return std::make_unique( + texture_info->pixel_buffer_config.callback, + texture_info->pixel_buffer_config.user_data); + } + case kFlutterDesktopGpuSurfaceTexture: + if (enable_impeller_) { + return std::make_unique( + GetExternalTextureExtensionType(), + texture_info->gpu_surface_config.callback, + texture_info->gpu_surface_config.user_data); + } else { + return std::make_unique( + GetExternalTextureExtensionType(), + texture_info->gpu_surface_config.callback, + texture_info->gpu_surface_config.user_data); + } + } +} + bool TizenRendererEgl::CreateSurface(void* render_target, void* render_target_display, int32_t width, diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.h b/flutter/shell/platform/tizen/tizen_renderer_egl.h index 10ccf21..54cd1f2 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.h @@ -9,6 +9,7 @@ #include +#include "flutter/shell/platform/tizen/external_texture.h" #include "flutter/shell/platform/tizen/tizen_renderer.h" #include "flutter/shell/platform/tizen/tizen_renderer_gl.h" #include "flutter/shell/platform/tizen/tizen_view_base.h" @@ -44,6 +45,9 @@ class TizenRendererEgl : public TizenRendererGL { void ResizeSurface(int32_t width, int32_t height) override; + std::unique_ptr CreateExternalTexture( + const FlutterDesktopTextureInfo* texture_info) override; + private: bool ChooseEGLConfiguration(); diff --git a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.cc b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.cc index 5fd58da..4ebb869 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -4,6 +4,8 @@ #include "tizen_renderer_evas_gl.h" +#include "flutter/shell/platform/tizen/external_texture_pixel_evas_gl.h" +#include "flutter/shell/platform/tizen/external_texture_surface_evas_gl.h" #include "flutter/shell/platform/tizen/logger.h" #include "flutter/shell/platform/tizen/tizen_evas_gl_helper.h" @@ -22,6 +24,21 @@ TizenRendererEvasGL::~TizenRendererEvasGL() { DestroySurface(); } +std::unique_ptr TizenRendererEvasGL::CreateExternalTexture( + const FlutterDesktopTextureInfo* texture_info) { + switch (texture_info->type) { + case kFlutterDesktopPixelBufferTexture: + return std::make_unique( + texture_info->pixel_buffer_config.callback, + texture_info->pixel_buffer_config.user_data); + case kFlutterDesktopGpuSurfaceTexture: + return std::make_unique( + GetExternalTextureExtensionType(), + texture_info->gpu_surface_config.callback, + texture_info->gpu_surface_config.user_data); + } +} + bool TizenRendererEvasGL::CreateSurface(void* render_target, void* render_target_display, int32_t width, diff --git a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h index 975933d..83394ac 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -9,6 +9,7 @@ #include +#include "flutter/shell/platform/tizen/external_texture.h" #include "flutter/shell/platform/tizen/tizen_renderer.h" #include "flutter/shell/platform/tizen/tizen_renderer_gl.h" #include "flutter/shell/platform/tizen/tizen_view_base.h" @@ -50,6 +51,9 @@ class TizenRendererEvasGL : public TizenRendererGL { void ResizeSurface(int32_t width, int32_t height) override; + std::unique_ptr CreateExternalTexture( + const FlutterDesktopTextureInfo* info) override; + private: Evas_GL* evas_gl_ = nullptr; Evas_GL_Config* gl_config_ = nullptr; diff --git a/flutter/shell/platform/tizen/tizen_renderer_gl.cc b/flutter/shell/platform/tizen/tizen_renderer_gl.cc index 45ef840..e65759b 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_gl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_gl.cc @@ -87,6 +87,18 @@ FlutterRendererConfig TizenRendererGL::GetRendererConfig() { return config; } +ExternalTextureExtensionType +TizenRendererGL::GetExternalTextureExtensionType() { + ExternalTextureExtensionType gl_extension = + ExternalTextureExtensionType::kNone; + if (IsSupportedExtension("EGL_TIZEN_image_native_surface")) { + gl_extension = ExternalTextureExtensionType::kNativeSurface; + } else if (IsSupportedExtension("EGL_EXT_image_dma_buf_import")) { + gl_extension = ExternalTextureExtensionType::kDmaBuffer; + } + return gl_extension; +} + TizenRendererGL::~TizenRendererGL() = default; } // namespace flutter diff --git a/flutter/shell/platform/tizen/tizen_renderer_gl.h b/flutter/shell/platform/tizen/tizen_renderer_gl.h index bff1266..77c7e89 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_gl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_gl.h @@ -36,6 +36,8 @@ class TizenRendererGL : public TizenRenderer { FlutterRendererConfig GetRendererConfig() override; + ExternalTextureExtensionType GetExternalTextureExtensionType(); + protected: // The current surface transformation. FlutterTransformation flutter_transformation_ = {1.0, 0.0, 0.0, 0.0, 1.0, diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc index edfd28a..837c550 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc @@ -27,6 +27,11 @@ void TizenRendererNuiGL::DestroySurface() { renderer_->DestroySurface(); } +std::unique_ptr TizenRendererNuiGL::CreateExternalTexture( + const FlutterDesktopTextureInfo* info) { + return renderer_->CreateExternalTexture(info); +} + bool TizenRendererNuiGL::OnMakeCurrent() { return renderer_->OnMakeCurrent(); } diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui_gl.h b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.h index 0a27b9d..12c8795 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_nui_gl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.h @@ -41,6 +41,9 @@ class TizenRendererNuiGL : public TizenRendererGL { void ResizeSurface(int32_t width, int32_t height) override; + std::unique_ptr CreateExternalTexture( + const FlutterDesktopTextureInfo* info) override; + private: std::unique_ptr renderer_; TizenViewNui* view_; From 8121f5e6a380103d9ff2b16794ae3a7bf0688d98 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Wed, 2 Jul 2025 11:15:07 +0800 Subject: [PATCH 08/13] Fix texture registrar crash issue 1.Fix texture registrar crash issue. 2.Temporary remove texture registrar unit test code, we need re-implement this unit test code. --- flutter/shell/platform/tizen/BUILD.gn | 1 - .../shell/platform/tizen/flutter_tizen_texture_registrar.cc | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/flutter/shell/platform/tizen/BUILD.gn b/flutter/shell/platform/tizen/BUILD.gn index 55149d4..fc09592 100644 --- a/flutter/shell/platform/tizen/BUILD.gn +++ b/flutter/shell/platform/tizen/BUILD.gn @@ -242,7 +242,6 @@ executable("flutter_tizen_unittests") { "channels/settings_channel_unittests.cc", "flutter_project_bundle_unittests.cc", "flutter_tizen_engine_unittest.cc", - "flutter_tizen_texture_registrar_unittests.cc", ] ldflags = [ "-Wl,--unresolved-symbols=ignore-in-shared-libs" ] diff --git a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc index eea0c6b..f2e5eda 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -44,8 +44,10 @@ int64_t FlutterTizenTextureRegistrar::RegisterTexture( return -1; } } - std::unique_ptr texture_gl = - engine_->renderer()->CreateExternalTexture(texture_info); + std::unique_ptr texture_gl = nullptr; + if (engine_->renderer()) { + texture_gl = engine_->renderer()->CreateExternalTexture(texture_info); + } if (!texture_gl) { FT_LOG(Error) << "Failed to create ExternalTexture."; return -1; From f01b482e925bfa254b2928a1ff42e74441d3fb09 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 3 Jul 2025 10:29:31 +0800 Subject: [PATCH 09/13] Fix NUI view not show issue --- flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc index 837c550..d84864a 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc @@ -11,7 +11,9 @@ namespace flutter { TizenRendererNuiGL::TizenRendererNuiGL(TizenViewNui* view_nui, bool enable_impeller) : renderer_(std::make_unique(view_nui, enable_impeller)), - view_(view_nui) {} + view_(view_nui) { + is_valid_ = renderer_->IsValid(); +} TizenRendererNuiGL::~TizenRendererNuiGL() {} From e83023fa19a03d9539aebfc137a75fec99fc2aab Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 3 Jul 2025 16:41:34 +0800 Subject: [PATCH 10/13] Enable texture registrar unittests --- flutter/shell/platform/tizen/BUILD.gn | 3 ++- .../platform/tizen/flutter_tizen_texture_registrar.cc | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/flutter/shell/platform/tizen/BUILD.gn b/flutter/shell/platform/tizen/BUILD.gn index fc09592..17c27ac 100644 --- a/flutter/shell/platform/tizen/BUILD.gn +++ b/flutter/shell/platform/tizen/BUILD.gn @@ -231,7 +231,7 @@ embedder("flutter_tizen_common") { embedder("flutter_tizen_source") { target_type = "source_set" - defines = [] + defines = [ "UNIT_TESTS" ] } executable("flutter_tizen_unittests") { @@ -242,6 +242,7 @@ executable("flutter_tizen_unittests") { "channels/settings_channel_unittests.cc", "flutter_project_bundle_unittests.cc", "flutter_tizen_engine_unittest.cc", + "flutter_tizen_texture_registrar_unittests.cc", ] ldflags = [ "-Wl,--unresolved-symbols=ignore-in-shared-libs" ] diff --git a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc index f2e5eda..b189d26 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -45,9 +45,18 @@ int64_t FlutterTizenTextureRegistrar::RegisterTexture( } } std::unique_ptr texture_gl = nullptr; + +#ifndef UNIT_TESTS if (engine_->renderer()) { texture_gl = engine_->renderer()->CreateExternalTexture(texture_info); } +#else + texture_gl = std::make_unique( + ExternalTextureExtensionType::kDmaBuffer, + texture_info->gpu_surface_config.callback, + texture_info->gpu_surface_config.user_data); +#endif + if (!texture_gl) { FT_LOG(Error) << "Failed to create ExternalTexture."; return -1; From c5b066da3995fcd1a532397d607790e01527fc0b Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Tue, 8 Jul 2025 14:25:46 +0800 Subject: [PATCH 11/13] Fix code review issues 1.Re-implement createRenderer method 2.Remove empty line 2.Supplement header file path --- .../platform/tizen/flutter_tizen_engine.cc | 53 +++++++++---------- .../platform/tizen/flutter_tizen_engine.h | 3 +- .../shell/platform/tizen/tizen_renderer.cc | 2 +- .../platform/tizen/tizen_renderer_egl.cc | 5 +- .../shell/platform/tizen/tizen_renderer_gl.cc | 2 +- 5 files changed, 32 insertions(+), 33 deletions(-) diff --git a/flutter/shell/platform/tizen/flutter_tizen_engine.cc b/flutter/shell/platform/tizen/flutter_tizen_engine.cc index 7a48de9..e114671 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_engine.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_engine.cc @@ -84,35 +84,22 @@ FlutterTizenEngine::~FlutterTizenEngine() { StopEngine(); } -void FlutterTizenEngine::CreateRenderer( +std::unique_ptr FlutterTizenEngine::CreateRenderer( FlutterDesktopRendererType renderer_type) { - if (renderer_type == FlutterDesktopRendererType::kEvasGL) { - renderer_ = std::make_unique(view_->tizen_view()); - - render_loop_ = std::make_unique( - std::this_thread::get_id(), // main thread - embedder_api_.GetCurrentTime, - [this](const auto* task) { - if (embedder_api_.RunTask(this->engine_, task) != kSuccess) { - FT_LOG(Error) << "Could not post an engine task."; - } - }, - renderer_.get()); - } else { + switch (renderer_type) { + case FlutterDesktopRendererType::kEvasGL: + return std::make_unique(view_->tizen_view()); + case FlutterDesktopRendererType::kEGL: #ifdef NUI_SUPPORT - if (auto* nui_view = - dynamic_cast(view_->tizen_view())) { - renderer_ = std::make_unique( - dynamic_cast(view_->tizen_view()), - project_->HasArgument("--enable-impeller")); - } else { - renderer_ = std::make_unique( - view_->tizen_view(), project_->HasArgument("--enable-impeller")); - } -#else - renderer_ = std::make_unique( - view_->tizen_view(), project_->HasArgument("--enable-impeller")); + if (auto* nui_view = + dynamic_cast(view_->tizen_view())) { + return std::make_unique( + dynamic_cast(view_->tizen_view()), + project_->HasArgument("--enable-impeller")); + } #endif + return std::make_unique( + view_->tizen_view(), project_->HasArgument("--enable-impeller")); } } @@ -313,7 +300,19 @@ bool FlutterTizenEngine::StopEngine() { void FlutterTizenEngine::SetView(FlutterTizenView* view, FlutterDesktopRendererType renderer_type) { view_ = view; - CreateRenderer(renderer_type); + renderer_ = CreateRenderer(renderer_type); + + if (renderer_type == FlutterDesktopRendererType::kEvasGL) { + render_loop_ = std::make_unique( + std::this_thread::get_id(), // main thread + embedder_api_.GetCurrentTime, + [this](const auto* task) { + if (embedder_api_.RunTask(this->engine_, task) != kSuccess) { + FT_LOG(Error) << "Could not post an engine task."; + } + }, + renderer_.get()); + } } void FlutterTizenEngine::AddPluginRegistrarDestructionCallback( diff --git a/flutter/shell/platform/tizen/flutter_tizen_engine.h b/flutter/shell/platform/tizen/flutter_tizen_engine.h index c9ac10f..00ace31 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_engine.h +++ b/flutter/shell/platform/tizen/flutter_tizen_engine.h @@ -63,7 +63,8 @@ class FlutterTizenEngine { FlutterTizenEngine& operator=(FlutterTizenEngine const&) = delete; // Creates a GL renderer from the given type. - void CreateRenderer(FlutterDesktopRendererType renderer_type); + std::unique_ptr CreateRenderer( + FlutterDesktopRendererType renderer_type); // Starts running the engine with the given entrypoint. If null, defaults to // main(). diff --git a/flutter/shell/platform/tizen/tizen_renderer.cc b/flutter/shell/platform/tizen/tizen_renderer.cc index 4272a44..52586e1 100644 --- a/flutter/shell/platform/tizen/tizen_renderer.cc +++ b/flutter/shell/platform/tizen/tizen_renderer.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "tizen_renderer.h" +#include "flutter/shell/platform/tizen/tizen_renderer.h" #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" #include "flutter/shell/platform/tizen/tizen_view.h" #include "flutter/shell/platform/tizen/tizen_view_base.h" diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.cc b/flutter/shell/platform/tizen/tizen_renderer_egl.cc index 317b2d2..c70f2a5 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "tizen_renderer_egl.h" +#include "flutter/shell/platform/tizen/tizen_renderer_egl.h" #define EFL_BETA_API_SUPPORT #include @@ -15,12 +15,11 @@ #include #include -#include "flutter/shell/platform/tizen/logger.h" - #include "flutter/shell/platform/tizen/external_texture_pixel_egl.h" #include "flutter/shell/platform/tizen/external_texture_pixel_egl_impeller.h" #include "flutter/shell/platform/tizen/external_texture_surface_egl.h" #include "flutter/shell/platform/tizen/external_texture_surface_egl_impeller.h" +#include "flutter/shell/platform/tizen/logger.h" namespace flutter { diff --git a/flutter/shell/platform/tizen/tizen_renderer_gl.cc b/flutter/shell/platform/tizen/tizen_renderer_gl.cc index e65759b..98a6fbf 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_gl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_gl.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "tizen_renderer_gl.h" +#include "flutter/shell/platform/tizen/tizen_renderer_gl.h" #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" #include "flutter/shell/platform/tizen/tizen_view.h" #include "flutter/shell/platform/tizen/tizen_view_base.h" From fb6350dfd560e4a6d35b5e915ea4a0db6e677dc8 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Tue, 8 Jul 2025 16:28:00 +0800 Subject: [PATCH 12/13] Revert GetFlutterTransformation to flutter tizen view --- flutter/shell/platform/tizen/tizen_renderer_gl.cc | 8 ++------ flutter/shell/platform/tizen/tizen_renderer_gl.h | 7 ------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/flutter/shell/platform/tizen/tizen_renderer_gl.cc b/flutter/shell/platform/tizen/tizen_renderer_gl.cc index 98a6fbf..febc73c 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_gl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_gl.cc @@ -4,6 +4,7 @@ #include "flutter/shell/platform/tizen/tizen_renderer_gl.h" #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" +#include "flutter/shell/platform/tizen/flutter_tizen_view.h" #include "flutter/shell/platform/tizen/tizen_view.h" #include "flutter/shell/platform/tizen/tizen_view_base.h" #include "flutter/shell/platform/tizen/tizen_window.h" @@ -12,10 +13,6 @@ namespace flutter { TizenRendererGL::TizenRendererGL() {} -FlutterTransformation TizenRendererGL::GetTransformation() const { - return flutter_transformation_; -} - FlutterRendererConfig TizenRendererGL::GetRendererConfig() { FlutterRendererConfig config = {}; config.type = kOpenGL; @@ -62,8 +59,7 @@ FlutterRendererConfig TizenRendererGL::GetRendererConfig() { if (!engine->view()) { return FlutterTransformation(); } - return dynamic_cast(engine->renderer()) - ->GetTransformation(); + return engine->view()->GetFlutterTransformation(); }; config.open_gl.gl_proc_resolver = [](void* user_data, const char* name) -> void* { diff --git a/flutter/shell/platform/tizen/tizen_renderer_gl.h b/flutter/shell/platform/tizen/tizen_renderer_gl.h index 77c7e89..ad59a6d 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_gl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_gl.h @@ -32,16 +32,9 @@ class TizenRendererGL : public TizenRenderer { virtual bool IsSupportedExtension(const char* name) = 0; - FlutterTransformation GetTransformation() const; - FlutterRendererConfig GetRendererConfig() override; ExternalTextureExtensionType GetExternalTextureExtensionType(); - - protected: - // The current surface transformation. - FlutterTransformation flutter_transformation_ = {1.0, 0.0, 0.0, 0.0, 1.0, - 0.0, 0.0, 0.0, 1.0}; }; } // namespace flutter From 6634d186e0a993c03a2fd3bdd5c01d6d1631f064 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Wed, 9 Jul 2025 14:58:22 +0800 Subject: [PATCH 13/13] Make CreateSurface and DestorySurface protected CreateSurface method only called by TizenRendereer and it's child class. --- .../shell/platform/tizen/flutter_tizen_engine.cc | 3 +-- flutter/shell/platform/tizen/tizen_renderer.h | 10 +++++----- .../shell/platform/tizen/tizen_renderer_egl.cc | 1 - .../shell/platform/tizen/tizen_renderer_egl.h | 15 ++++++++------- .../platform/tizen/tizen_renderer_evas_gl.h | 15 ++++++++------- .../platform/tizen/tizen_renderer_nui_gl.cc | 12 ------------ .../shell/platform/tizen/tizen_renderer_nui_gl.h | 16 +++++++++------- 7 files changed, 31 insertions(+), 41 deletions(-) diff --git a/flutter/shell/platform/tizen/flutter_tizen_engine.cc b/flutter/shell/platform/tizen/flutter_tizen_engine.cc index e114671..769c273 100644 --- a/flutter/shell/platform/tizen/flutter_tizen_engine.cc +++ b/flutter/shell/platform/tizen/flutter_tizen_engine.cc @@ -94,8 +94,7 @@ std::unique_ptr FlutterTizenEngine::CreateRenderer( if (auto* nui_view = dynamic_cast(view_->tizen_view())) { return std::make_unique( - dynamic_cast(view_->tizen_view()), - project_->HasArgument("--enable-impeller")); + nui_view, project_->HasArgument("--enable-impeller")); } #endif return std::make_unique( diff --git a/flutter/shell/platform/tizen/tizen_renderer.h b/flutter/shell/platform/tizen/tizen_renderer.h index 8fcada3..3fbf36d 100644 --- a/flutter/shell/platform/tizen/tizen_renderer.h +++ b/flutter/shell/platform/tizen/tizen_renderer.h @@ -20,11 +20,6 @@ class TizenRenderer { bool IsValid() { return is_valid_; } virtual void ResizeSurface(int32_t width, int32_t height) = 0; - virtual bool CreateSurface(void* render_target, - void* render_target_display, - int32_t width, - int32_t height) = 0; - virtual void DestroySurface() = 0; virtual FlutterRendererConfig GetRendererConfig() = 0; virtual std::unique_ptr CreateExternalTexture( @@ -32,6 +27,11 @@ class TizenRenderer { protected: bool CreateSurface(TizenViewBase* view); + virtual bool CreateSurface(void* render_target, + void* render_target_display, + int32_t width, + int32_t height) = 0; + virtual void DestroySurface() = 0; bool is_valid_ = false; }; diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.cc b/flutter/shell/platform/tizen/tizen_renderer_egl.cc index c70f2a5..15c041b 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.cc @@ -150,7 +150,6 @@ bool TizenRendererEgl::CreateSurface(void* render_target, } void TizenRendererEgl::DestroySurface() { - FT_LOG(Error) << "DestroySurface"; if (egl_display_) { eglMakeCurrent(egl_display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); diff --git a/flutter/shell/platform/tizen/tizen_renderer_egl.h b/flutter/shell/platform/tizen/tizen_renderer_egl.h index 54cd1f2..65f216a 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_egl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_egl.h @@ -22,13 +22,6 @@ class TizenRendererEgl : public TizenRendererGL { virtual ~TizenRendererEgl(); - bool CreateSurface(void* render_target, - void* render_target_display, - int32_t width, - int32_t height) override; - - void DestroySurface() override; - bool OnMakeCurrent() override; bool OnClearCurrent() override; @@ -48,6 +41,14 @@ class TizenRendererEgl : public TizenRendererGL { std::unique_ptr CreateExternalTexture( const FlutterDesktopTextureInfo* texture_info) override; + protected: + bool CreateSurface(void* render_target, + void* render_target_display, + int32_t width, + int32_t height) override; + + void DestroySurface() override; + private: bool ChooseEGLConfiguration(); diff --git a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h index 83394ac..ff393fa 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -24,13 +24,6 @@ class TizenRendererEvasGL : public TizenRendererGL { virtual ~TizenRendererEvasGL(); - bool CreateSurface(void* render_target, - void* render_target_display, - int32_t width, - int32_t height) override; - - void DestroySurface() override; - bool OnMakeCurrent() override; bool OnClearCurrent() override; @@ -54,6 +47,14 @@ class TizenRendererEvasGL : public TizenRendererGL { std::unique_ptr CreateExternalTexture( const FlutterDesktopTextureInfo* info) override; + protected: + bool CreateSurface(void* render_target, + void* render_target_display, + int32_t width, + int32_t height) override; + + void DestroySurface() override; + private: Evas_GL* evas_gl_ = nullptr; Evas_GL_Config* gl_config_ = nullptr; diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc index d84864a..5e42675 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.cc @@ -17,18 +17,6 @@ TizenRendererNuiGL::TizenRendererNuiGL(TizenViewNui* view_nui, TizenRendererNuiGL::~TizenRendererNuiGL() {} -bool TizenRendererNuiGL::CreateSurface(void* render_target, - void* render_target_display, - int32_t width, - int32_t height) { - return renderer_->CreateSurface(render_target, render_target_display, width, - height); -} - -void TizenRendererNuiGL::DestroySurface() { - renderer_->DestroySurface(); -} - std::unique_ptr TizenRendererNuiGL::CreateExternalTexture( const FlutterDesktopTextureInfo* info) { return renderer_->CreateExternalTexture(info); diff --git a/flutter/shell/platform/tizen/tizen_renderer_nui_gl.h b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.h index 12c8795..dfae340 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_nui_gl.h +++ b/flutter/shell/platform/tizen/tizen_renderer_nui_gl.h @@ -18,13 +18,6 @@ class TizenRendererNuiGL : public TizenRendererGL { virtual ~TizenRendererNuiGL(); - bool CreateSurface(void* render_target, - void* render_target_display, - int32_t width, - int32_t height) override; - - void DestroySurface() override; - bool OnMakeCurrent() override; bool OnClearCurrent() override; @@ -44,6 +37,15 @@ class TizenRendererNuiGL : public TizenRendererGL { std::unique_ptr CreateExternalTexture( const FlutterDesktopTextureInfo* info) override; + protected: + bool CreateSurface(void* render_target, + void* render_target_display, + int32_t width, + int32_t height) override { + return false; + } + void DestroySurface() override {} + private: std::unique_ptr renderer_; TizenViewNui* view_;