Skip to content

Commit 361fc56

Browse files
authored
Refactor renderer to support vulkan extensions (#105)
1 parent 36968dd commit 361fc56

21 files changed

+405
-307
lines changed

flutter/shell/platform/tizen/BUILD.gn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ template("embedder") {
115115
"tizen_renderer.cc",
116116
"tizen_renderer_egl.cc",
117117
"tizen_renderer_evas_gl.cc",
118+
"tizen_renderer_gl.cc",
118119
"tizen_view_elementary.cc",
119120
"tizen_vsync_waiter.cc",
120121
"tizen_window_ecore_wl2.cc",
@@ -171,6 +172,7 @@ template("embedder") {
171172
sources += [
172173
"flutter_tizen_nui.cc",
173174
"tizen_clipboard.cc",
175+
"tizen_renderer_nui_gl.cc",
174176
"tizen_view_nui.cc",
175177
]
176178

@@ -229,7 +231,7 @@ embedder("flutter_tizen_common") {
229231
embedder("flutter_tizen_source") {
230232
target_type = "source_set"
231233

232-
defines = []
234+
defines = [ "UNIT_TESTS" ]
233235
}
234236

235237
executable("flutter_tizen_unittests") {

flutter/shell/platform/tizen/flutter_tizen.cc

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,9 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow(
214214

215215
auto view = std::make_unique<flutter::FlutterTizenView>(
216216
flutter::kImplicitViewId, std::move(window),
217-
window_properties.user_pixel_ratio);
217+
std::unique_ptr<flutter::FlutterTizenEngine>(EngineFromHandle(engine)),
218+
window_properties.renderer_type, window_properties.user_pixel_ratio);
218219

219-
// Take ownership of the engine, starting it if necessary.
220-
view->SetEngine(
221-
std::unique_ptr<flutter::FlutterTizenEngine>(EngineFromHandle(engine)));
222-
view->CreateRenderSurface(window_properties.renderer_type);
223220
if (!view->engine()->IsRunning()) {
224221
if (!view->engine()->RunEngine()) {
225222
return nullptr;

flutter/shell/platform/tizen/flutter_tizen_elementary.cc

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,10 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent(
3131
static_cast<Evas_Object*>(parent));
3232

3333
auto view = std::make_unique<flutter::FlutterTizenView>(
34-
flutter::kImplicitViewId, std::move(tizen_view));
34+
flutter::kImplicitViewId, std::move(tizen_view),
35+
std::unique_ptr<flutter::FlutterTizenEngine>(EngineFromHandle(engine)),
36+
FlutterDesktopRendererType::kEvasGL);
3537

36-
// Take ownership of the engine, starting it if necessary.
37-
view->SetEngine(
38-
std::unique_ptr<flutter::FlutterTizenEngine>(EngineFromHandle(engine)));
39-
view->CreateRenderSurface(FlutterDesktopRendererType::kEvasGL);
4038
if (!view->engine()->IsRunning()) {
4139
if (!view->engine()->RunEngine()) {
4240
return nullptr;

flutter/shell/platform/tizen/flutter_tizen_engine.cc

Lines changed: 38 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
#include "flutter/shell/platform/tizen/tizen_renderer_egl.h"
2020
#include "flutter/shell/platform/tizen/tizen_renderer_evas_gl.h"
2121

22+
#ifdef NUI_SUPPORT
23+
#include "flutter/shell/platform/tizen/tizen_renderer_nui_gl.h"
24+
#include "flutter/shell/platform/tizen/tizen_view_nui.h"
25+
#endif
26+
2227
namespace flutter {
2328

2429
namespace {
@@ -79,23 +84,21 @@ FlutterTizenEngine::~FlutterTizenEngine() {
7984
StopEngine();
8085
}
8186

82-
void FlutterTizenEngine::CreateRenderer(
87+
std::unique_ptr<TizenRenderer> FlutterTizenEngine::CreateRenderer(
8388
FlutterDesktopRendererType renderer_type) {
84-
if (renderer_type == FlutterDesktopRendererType::kEvasGL) {
85-
renderer_ = std::make_unique<TizenRendererEvasGL>();
86-
87-
render_loop_ = std::make_unique<TizenRenderEventLoop>(
88-
std::this_thread::get_id(), // main thread
89-
embedder_api_.GetCurrentTime,
90-
[this](const auto* task) {
91-
if (embedder_api_.RunTask(this->engine_, task) != kSuccess) {
92-
FT_LOG(Error) << "Could not post an engine task.";
93-
}
94-
},
95-
renderer_.get());
96-
} else {
97-
renderer_ = std::make_unique<TizenRendererEgl>(
98-
project_->HasArgument("--enable-impeller"));
89+
switch (renderer_type) {
90+
case FlutterDesktopRendererType::kEvasGL:
91+
return std::make_unique<TizenRendererEvasGL>(view_->tizen_view());
92+
case FlutterDesktopRendererType::kEGL:
93+
#ifdef NUI_SUPPORT
94+
if (auto* nui_view =
95+
dynamic_cast<flutter::TizenViewNui*>(view_->tizen_view())) {
96+
return std::make_unique<TizenRendererNuiGL>(
97+
nui_view, project_->HasArgument("--enable-impeller"));
98+
}
99+
#endif
100+
return std::make_unique<TizenRendererEgl>(
101+
view_->tizen_view(), project_->HasArgument("--enable-impeller"));
99102
}
100103
}
101104

@@ -244,8 +247,7 @@ bool FlutterTizenEngine::RunEngine() {
244247
internal_plugin_registrar_->messenger());
245248

246249
if (IsHeaded()) {
247-
texture_registrar_ = std::make_unique<FlutterTizenTextureRegistrar>(
248-
this, project_->HasArgument("--enable-impeller"));
250+
texture_registrar_ = std::make_unique<FlutterTizenTextureRegistrar>(this);
249251
keyboard_channel_ = std::make_unique<KeyboardChannel>(
250252
internal_plugin_registrar_->messenger(),
251253
[this](const FlutterKeyEvent& event, FlutterKeyEventCallback callback,
@@ -294,8 +296,22 @@ bool FlutterTizenEngine::StopEngine() {
294296
return false;
295297
}
296298

297-
void FlutterTizenEngine::SetView(FlutterTizenView* view) {
299+
void FlutterTizenEngine::SetView(FlutterTizenView* view,
300+
FlutterDesktopRendererType renderer_type) {
298301
view_ = view;
302+
renderer_ = CreateRenderer(renderer_type);
303+
304+
if (renderer_type == FlutterDesktopRendererType::kEvasGL) {
305+
render_loop_ = std::make_unique<TizenRenderEventLoop>(
306+
std::this_thread::get_id(), // main thread
307+
embedder_api_.GetCurrentTime,
308+
[this](const auto* task) {
309+
if (embedder_api_.RunTask(this->engine_, task) != kSuccess) {
310+
FT_LOG(Error) << "Could not post an engine task.";
311+
}
312+
},
313+
renderer_.get());
314+
}
299315
}
300316

301317
void FlutterTizenEngine::AddPluginRegistrarDestructionCallback(
@@ -435,79 +451,17 @@ FlutterDesktopMessage FlutterTizenEngine::ConvertToDesktopMessage(
435451
}
436452

437453
FlutterRendererConfig FlutterTizenEngine::GetRendererConfig() {
438-
FlutterRendererConfig config = {};
439454
if (IsHeaded()) {
440-
config.type = kOpenGL;
441-
config.open_gl.struct_size = sizeof(config.open_gl);
442-
config.open_gl.make_current = [](void* user_data) -> bool {
443-
auto* engine = static_cast<FlutterTizenEngine*>(user_data);
444-
if (!engine->view()) {
445-
return false;
446-
}
447-
return engine->view()->OnMakeCurrent();
448-
};
449-
config.open_gl.make_resource_current = [](void* user_data) -> bool {
450-
auto* engine = static_cast<FlutterTizenEngine*>(user_data);
451-
if (!engine->view()) {
452-
return false;
453-
}
454-
return engine->view()->OnMakeResourceCurrent();
455-
};
456-
config.open_gl.clear_current = [](void* user_data) -> bool {
457-
auto* engine = static_cast<FlutterTizenEngine*>(user_data);
458-
if (!engine->view()) {
459-
return false;
460-
}
461-
return engine->view()->OnClearCurrent();
462-
};
463-
config.open_gl.present = [](void* user_data) -> bool {
464-
auto* engine = static_cast<FlutterTizenEngine*>(user_data);
465-
if (!engine->view()) {
466-
return false;
467-
}
468-
return engine->view()->OnPresent();
469-
};
470-
config.open_gl.fbo_callback = [](void* user_data) -> uint32_t {
471-
auto* engine = static_cast<FlutterTizenEngine*>(user_data);
472-
if (!engine->view()) {
473-
return false;
474-
}
475-
return engine->view()->OnGetFBO();
476-
};
477-
config.open_gl.surface_transformation =
478-
[](void* user_data) -> FlutterTransformation {
479-
auto* engine = static_cast<FlutterTizenEngine*>(user_data);
480-
if (!engine->view()) {
481-
return FlutterTransformation();
482-
}
483-
return engine->view()->GetFlutterTransformation();
484-
};
485-
config.open_gl.gl_proc_resolver = [](void* user_data,
486-
const char* name) -> void* {
487-
auto* engine = static_cast<FlutterTizenEngine*>(user_data);
488-
if (!engine->view()) {
489-
return nullptr;
490-
}
491-
return engine->view()->OnProcResolver(name);
492-
};
493-
config.open_gl.gl_external_texture_frame_callback =
494-
[](void* user_data, int64_t texture_id, size_t width, size_t height,
495-
FlutterOpenGLTexture* texture) -> bool {
496-
auto* engine = static_cast<FlutterTizenEngine*>(user_data);
497-
if (!engine->texture_registrar()) {
498-
return false;
499-
}
500-
return engine->texture_registrar()->PopulateTexture(texture_id, width,
501-
height, texture);
502-
};
455+
return renderer()->GetRendererConfig();
503456
} else {
457+
FlutterRendererConfig config = {};
504458
config.type = kSoftware;
505459
config.software.struct_size = sizeof(config.software);
506460
config.software.surface_present_callback =
507461
[](void* user_data, const void* allocation, size_t row_bytes,
508462
size_t height) -> bool { return true; };
463+
return config;
509464
}
510-
return config;
511465
}
512466

513467
void FlutterTizenEngine::DispatchAccessibilityAction(

flutter/shell/platform/tizen/flutter_tizen_engine.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ class FlutterTizenEngine {
6363
FlutterTizenEngine& operator=(FlutterTizenEngine const&) = delete;
6464

6565
// Creates a GL renderer from the given type.
66-
void CreateRenderer(FlutterDesktopRendererType renderer_type);
66+
std::unique_ptr<TizenRenderer> CreateRenderer(
67+
FlutterDesktopRendererType renderer_type);
6768

6869
// Starts running the engine with the given entrypoint. If null, defaults to
6970
// main().
@@ -78,7 +79,8 @@ class FlutterTizenEngine {
7879
bool StopEngine();
7980

8081
// Sets the view that is displaying this engine's content.
81-
void SetView(FlutterTizenView* view);
82+
void SetView(FlutterTizenView* view,
83+
FlutterDesktopRendererType renderer_type);
8284

8385
// The view displaying this engine's content, if any. This will be null for
8486
// headless engines.

flutter/shell/platform/tizen/flutter_tizen_nui.cc

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,10 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromImageView(
4040
default_window_id);
4141

4242
auto view = std::make_unique<flutter::FlutterTizenView>(
43-
flutter::kImplicitViewId, std::move(tizen_view));
43+
flutter::kImplicitViewId, std::move(tizen_view),
44+
std::unique_ptr<flutter::FlutterTizenEngine>(EngineFromHandle(engine)),
45+
FlutterDesktopRendererType::kEGL);
4446

45-
// Take ownership of the engine, starting it if necessary.
46-
view->SetEngine(
47-
std::unique_ptr<flutter::FlutterTizenEngine>(EngineFromHandle(engine)));
48-
view->CreateRenderSurface(FlutterDesktopRendererType::kEGL);
4947
if (!view->engine()->IsRunning()) {
5048
if (!view->engine()->RunEngine()) {
5149
return nullptr;

flutter/shell/platform/tizen/flutter_tizen_texture_registrar.cc

Lines changed: 14 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@
2020
namespace flutter {
2121

2222
FlutterTizenTextureRegistrar::FlutterTizenTextureRegistrar(
23-
FlutterTizenEngine* engine,
24-
bool enable_impeller)
25-
: engine_(engine), enable_impeller_(enable_impeller) {}
23+
FlutterTizenEngine* engine)
24+
: engine_(engine) {}
2625

2726
int64_t FlutterTizenTextureRegistrar::RegisterTexture(
2827
const FlutterDesktopTextureInfo* texture_info) {
@@ -45,12 +44,19 @@ int64_t FlutterTizenTextureRegistrar::RegisterTexture(
4544
return -1;
4645
}
4746
}
48-
FlutterDesktopRendererType renderer_type = FlutterDesktopRendererType::kEGL;
49-
if (dynamic_cast<TizenRendererEvasGL*>(engine_->renderer())) {
50-
renderer_type = FlutterDesktopRendererType::kEvasGL;
47+
std::unique_ptr<ExternalTexture> texture_gl = nullptr;
48+
49+
#ifndef UNIT_TESTS
50+
if (engine_->renderer()) {
51+
texture_gl = engine_->renderer()->CreateExternalTexture(texture_info);
5152
}
52-
std::unique_ptr<ExternalTexture> texture_gl =
53-
CreateExternalTexture(texture_info, renderer_type);
53+
#else
54+
texture_gl = std::make_unique<ExternalTextureSurfaceEGL>(
55+
ExternalTextureExtensionType::kDmaBuffer,
56+
texture_info->gpu_surface_config.callback,
57+
texture_info->gpu_surface_config.user_data);
58+
#endif
59+
5460
if (!texture_gl) {
5561
FT_LOG(Error) << "Failed to create ExternalTexture.";
5662
return -1;
@@ -100,52 +106,4 @@ bool FlutterTizenTextureRegistrar::PopulateTexture(
100106
return texture->PopulateTexture(width, height, opengl_texture);
101107
}
102108

103-
std::unique_ptr<ExternalTexture>
104-
FlutterTizenTextureRegistrar::CreateExternalTexture(
105-
const FlutterDesktopTextureInfo* texture_info,
106-
FlutterDesktopRendererType renderer_type) {
107-
switch (texture_info->type) {
108-
case kFlutterDesktopPixelBufferTexture:
109-
if (renderer_type == FlutterDesktopRendererType::kEvasGL) {
110-
return std::make_unique<ExternalTexturePixelEvasGL>(
111-
texture_info->pixel_buffer_config.callback,
112-
texture_info->pixel_buffer_config.user_data);
113-
}
114-
if (enable_impeller_) {
115-
return std::make_unique<ExternalTexturePixelEGLImpeller>(
116-
texture_info->pixel_buffer_config.callback,
117-
texture_info->pixel_buffer_config.user_data);
118-
} else {
119-
return std::make_unique<ExternalTexturePixelEGL>(
120-
texture_info->pixel_buffer_config.callback,
121-
texture_info->pixel_buffer_config.user_data);
122-
}
123-
case kFlutterDesktopGpuSurfaceTexture:
124-
ExternalTextureExtensionType gl_extension =
125-
ExternalTextureExtensionType::kNone;
126-
if (engine_->renderer() && engine_->renderer()->IsSupportedExtension(
127-
"EGL_TIZEN_image_native_surface")) {
128-
gl_extension = ExternalTextureExtensionType::kNativeSurface;
129-
} else if (engine_->renderer() &&
130-
engine_->renderer()->IsSupportedExtension(
131-
"EGL_EXT_image_dma_buf_import")) {
132-
gl_extension = ExternalTextureExtensionType::kDmaBuffer;
133-
}
134-
if (renderer_type == FlutterDesktopRendererType::kEvasGL) {
135-
return std::make_unique<ExternalTextureSurfaceEvasGL>(
136-
gl_extension, texture_info->gpu_surface_config.callback,
137-
texture_info->gpu_surface_config.user_data);
138-
}
139-
if (enable_impeller_) {
140-
return std::make_unique<ExternalTextureSurfaceEGLImpeller>(
141-
gl_extension, texture_info->gpu_surface_config.callback,
142-
texture_info->gpu_surface_config.user_data);
143-
} else {
144-
return std::make_unique<ExternalTextureSurfaceEGL>(
145-
gl_extension, texture_info->gpu_surface_config.callback,
146-
texture_info->gpu_surface_config.user_data);
147-
}
148-
}
149-
}
150-
151109
} // namespace flutter

flutter/shell/platform/tizen/flutter_tizen_texture_registrar.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ class FlutterTizenEngine;
2020
// Thread safety: All member methods are thread safe.
2121
class FlutterTizenTextureRegistrar {
2222
public:
23-
explicit FlutterTizenTextureRegistrar(FlutterTizenEngine* engine,
24-
bool enable_impeller);
23+
explicit FlutterTizenTextureRegistrar(FlutterTizenEngine* engine);
2524

2625
// Registers a texture described by the given |texture_info| object.
2726
//
@@ -47,17 +46,12 @@ class FlutterTizenTextureRegistrar {
4746
size_t height,
4847
FlutterOpenGLTexture* texture);
4948

50-
std::unique_ptr<ExternalTexture> CreateExternalTexture(
51-
const FlutterDesktopTextureInfo* info,
52-
FlutterDesktopRendererType renderer_type);
53-
5449
private:
5550
FlutterTizenEngine* engine_ = nullptr;
5651

5752
// All registered textures, keyed by their IDs.
5853
std::unordered_map<int64_t, std::unique_ptr<ExternalTexture>> textures_;
5954
std::mutex map_mutex_;
60-
bool enable_impeller_ = false;
6155
};
6256

6357
} // namespace flutter

0 commit comments

Comments
 (0)