From e50535b213d3d59ae0375c8805f1975ac1bdb0b2 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Mon, 25 Jul 2022 09:50:45 +0900 Subject: [PATCH] Enable Evas GL renderer for all profiles (#312) For devices other than wearable, we can use either ElmFlutterView or EcoreWl2Window, depending on apps. This commit is to avoid being device dependent. Remove the use_evas_gl_renderer build flag and use the WEARABLE_PROFILE macro if necessary. Before creating the engine, the embedding can select the renderer type in the engine property. At runtime, it selects an appropriate renderer and external texture according to the renderer type and renders to it. --- shell/platform/tizen/BUILD.gn | 42 ++----- .../platform/tizen/channels/window_channel.cc | 22 ++-- shell/platform/tizen/external_texture.h | 9 +- .../tizen/external_texture_pixel_gl.cc | 77 ------------ .../tizen/external_texture_pixel_gl.h | 38 ------ ..._gl.cc => external_texture_surface_egl.cc} | 70 ++--------- ...ce_gl.h => external_texture_surface_egl.h} | 13 +- .../tizen/external_texture_surface_evas_gl.cc | 119 ++++++++++++++++++ .../tizen/external_texture_surface_evas_gl.h | 41 ++++++ shell/platform/tizen/flutter_tizen.cc | 47 +++++++ shell/platform/tizen/flutter_tizen_ecore.cc | 65 ---------- .../tizen/flutter_tizen_elementary.cc | 32 +---- shell/platform/tizen/flutter_tizen_engine.cc | 59 +++++---- shell/platform/tizen/flutter_tizen_engine.h | 12 +- .../tizen/flutter_tizen_texture_registrar.cc | 44 +++++-- .../tizen/flutter_tizen_texture_registrar.h | 4 +- ...utter_tizen_texture_registrar_unittests.cc | 8 +- shell/platform/tizen/flutter_tizen_view.cc | 7 +- shell/platform/tizen/flutter_tizen_view.h | 2 +- shell/platform/tizen/public/flutter_tizen.h | 9 ++ shell/platform/tizen/tizen_event_loop.cc | 4 - shell/platform/tizen/tizen_event_loop.h | 2 - shell/platform/tizen/tizen_renderer.h | 6 + shell/platform/tizen/tizen_renderer_egl.cc | 4 +- .../platform/tizen/tizen_renderer_evas_gl.cc | 7 +- shell/platform/tizen/tizen_renderer_evas_gl.h | 1 - shell/platform/tizen/tizen_view_base.h | 2 +- shell/platform/tizen/tizen_view_elementary.cc | 3 +- shell/platform/tizen/tizen_view_elementary.h | 2 +- .../platform/tizen/tizen_window_ecore_wl2.cc | 3 +- shell/platform/tizen/tizen_window_ecore_wl2.h | 2 +- .../platform/tizen/tizen_window_elementary.cc | 6 +- .../platform/tizen/tizen_window_elementary.h | 2 +- 33 files changed, 365 insertions(+), 399 deletions(-) delete mode 100644 shell/platform/tizen/external_texture_pixel_gl.cc delete mode 100644 shell/platform/tizen/external_texture_pixel_gl.h rename shell/platform/tizen/{external_texture_surface_gl.cc => external_texture_surface_egl.cc} (73%) rename shell/platform/tizen/{external_texture_surface_gl.h => external_texture_surface_egl.h} (77%) create mode 100644 shell/platform/tizen/external_texture_surface_evas_gl.cc create mode 100644 shell/platform/tizen/external_texture_surface_evas_gl.h delete mode 100644 shell/platform/tizen/flutter_tizen_ecore.cc diff --git a/shell/platform/tizen/BUILD.gn b/shell/platform/tizen/BUILD.gn index 98c447774f1df..7ba6921815728 100644 --- a/shell/platform/tizen/BUILD.gn +++ b/shell/platform/tizen/BUILD.gn @@ -85,20 +85,15 @@ config("rootstrap_include_dirs") { ] } -config("evas_gl_renderer") { - defines = [ "TIZEN_RENDERER_EVAS_GL" ] -} - # Template for the embedder build. Used to generate embedders for different # device profiles. # -# If use_evas_gl_renderer is provided as true, the Evas_GL renderer is used, -# otherwise the Ecore_Wl2 renderer is used. +# If the target profile is wearable, only the Evas GL renderer is supported. +# Otherwise, both the Evas GL and EGL renderers are supported. template("embedder") { forward_variables_from(invoker, [ "target_type", - "use_evas_gl_renderer", "defines", ]) @@ -120,10 +115,10 @@ template("embedder") { "channels/settings_channel.cc", "channels/text_input_channel.cc", "channels/window_channel.cc", - "external_texture_pixel_gl.cc", - "external_texture_surface_gl.cc", + "external_texture_surface_evas_gl.cc", "flutter_project_bundle.cc", "flutter_tizen.cc", + "flutter_tizen_elementary.cc", "flutter_tizen_engine.cc", "flutter_tizen_texture_registrar.cc", "flutter_tizen_view.cc", @@ -132,6 +127,9 @@ template("embedder") { "tizen_event_loop.cc", "tizen_input_method_context.cc", "tizen_renderer.cc", + "tizen_renderer_evas_gl.cc", + "tizen_view_elementary.cc", + "tizen_window_elementary.cc", ] if (target_name != "flutter_tizen_wearable") { @@ -152,12 +150,14 @@ template("embedder") { "capi-ui-efl-util", "dlog", "ecore", + "ecore_evas", "ecore_imf", "ecore_imf_evas", "ecore_input", "efl-extension", "eina", "elementary", + "evas", "feedback", "tbm", "tdm-client", @@ -187,24 +187,9 @@ template("embedder") { "//flutter:config", ] - if (use_evas_gl_renderer) { - sources += [ - "flutter_tizen_elementary.cc", - "tizen_renderer_evas_gl.cc", - "tizen_view_elementary.cc", - "tizen_window_elementary.cc", - ] - - libs += [ - "ecore_evas", - "elementary", - "evas", - ] - - public_configs += [ ":evas_gl_renderer" ] - } else { + if (target_name != "flutter_tizen_wearable") { sources += [ - "flutter_tizen_ecore.cc", + "external_texture_surface_egl.cc", "tizen_renderer_egl.cc", "tizen_vsync_waiter.cc", "tizen_window_ecore_wl2.cc", @@ -235,35 +220,30 @@ template("embedder") { embedder("flutter_tizen_mobile") { target_type = "shared_library" - use_evas_gl_renderer = false defines = [ "MOBILE_PROFILE" ] } embedder("flutter_tizen_wearable") { target_type = "shared_library" - use_evas_gl_renderer = true defines = [ "WEARABLE_PROFILE" ] } embedder("flutter_tizen_tv") { target_type = "shared_library" - use_evas_gl_renderer = false defines = [ "TV_PROFILE" ] } embedder("flutter_tizen_common") { target_type = "shared_library" - use_evas_gl_renderer = false defines = [ "COMMON_PROFILE" ] } embedder("flutter_tizen_source") { target_type = "source_set" - use_evas_gl_renderer = false defines = [] } diff --git a/shell/platform/tizen/channels/window_channel.cc b/shell/platform/tizen/channels/window_channel.cc index 3eeab011bbffd..705facb224720 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -43,10 +43,6 @@ void WindowChannel::HandleMethodCall( map[EncodableValue("height")] = EncodableValue(geometry.height); result->Success(EncodableValue(map)); } else if (method_name == "setWindowGeometry") { -#ifdef TIZEN_RENDERER_EVAS_GL - FT_LOG(Error) << "setWindowGeometry is not supported on Evas GL."; - result->NotImplemented(); -#else const auto* arguments = std::get_if(method_call.arguments()); if (!arguments) { result->Error("Invalid arguments"); @@ -58,14 +54,16 @@ void WindowChannel::HandleMethodCall( EncodableValueHolder height(arguments, "height"); TizenGeometry geometry = window_->GetGeometry(); - window_->SetGeometry({ - x ? *x : geometry.left, - y ? *y : geometry.top, - width ? *width : geometry.width, - height ? *height : geometry.height, - }); - result->Success(); -#endif + if (window_->SetGeometry({ + x ? *x : geometry.left, + y ? *y : geometry.top, + width ? *width : geometry.width, + height ? *height : geometry.height, + })) { + result->Success(); + } else { + result->NotImplemented(); + } } else if (method_name == "getScreenGeometry") { TizenGeometry geometry = window_->GetScreenGeometry(); EncodableMap map; diff --git a/shell/platform/tizen/external_texture.h b/shell/platform/tizen/external_texture.h index 53c77acaa8074..10477a499f4f9 100644 --- a/shell/platform/tizen/external_texture.h +++ b/shell/platform/tizen/external_texture.h @@ -11,24 +11,17 @@ #include "flutter/shell/platform/common/public/flutter_texture_registrar.h" #include "flutter/shell/platform/embedder/embedder.h" -#ifdef TIZEN_RENDERER_EVAS_GL -#include -#else -#include -#endif - namespace flutter { enum class ExternalTextureExtensionType { kNone, kNativeSurface, kDmaBuffer }; struct ExternalTextureGLState { - GLuint gl_texture; + uint32_t gl_texture; ExternalTextureExtensionType gl_extension; }; static std::atomic_long next_texture_id = {1}; -// An adaptation class of flutter engine and external texture interface. class ExternalTexture { public: ExternalTexture(ExternalTextureExtensionType gl_extension = diff --git a/shell/platform/tizen/external_texture_pixel_gl.cc b/shell/platform/tizen/external_texture_pixel_gl.cc deleted file mode 100644 index 340ccc8773fb7..0000000000000 --- a/shell/platform/tizen/external_texture_pixel_gl.cc +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2020 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 "external_texture_pixel_gl.h" - -#ifdef TIZEN_RENDERER_EVAS_GL -#include "tizen_evas_gl_helper.h" -extern Evas_GL* g_evas_gl; -EVAS_GL_GLOBAL_GLES2_DECLARE(); -#else -#include -#include -#include -#include -#endif - -namespace flutter { - -bool ExternalTexturePixelGL::PopulateTexture( - size_t width, - size_t height, - FlutterOpenGLTexture* opengl_texture) { - if (!CopyPixelBuffer(width, height)) { - return false; - } - - // Populate the texture object used by the engine. - opengl_texture->target = GL_TEXTURE_2D; - opengl_texture->name = state_->gl_texture; - opengl_texture->format = GL_RGBA8; - opengl_texture->destruction_callback = nullptr; - opengl_texture->user_data = nullptr; - opengl_texture->width = width; - opengl_texture->height = height; - return true; -} - -ExternalTexturePixelGL::ExternalTexturePixelGL( - FlutterDesktopPixelBufferTextureCallback texture_callback, - void* user_data) - : ExternalTexture(), - texture_callback_(texture_callback), - user_data_(user_data) {} - -bool ExternalTexturePixelGL::CopyPixelBuffer(size_t& width, size_t& height) { - if (!texture_callback_) { - return false; - } - - const FlutterDesktopPixelBuffer* pixel_buffer = - texture_callback_(width, height, user_data_); - - if (!pixel_buffer || !pixel_buffer->buffer) { - return false; - } - - width = pixel_buffer->width; - height = pixel_buffer->height; - - if (state_->gl_texture == 0) { - glGenTextures(1, &state_->gl_texture); - glBindTexture(GL_TEXTURE_2D, state_->gl_texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - } else { - glBindTexture(GL_TEXTURE_2D, state_->gl_texture); - } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixel_buffer->width, - pixel_buffer->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, - pixel_buffer->buffer); - return true; -} - -} // namespace flutter diff --git a/shell/platform/tizen/external_texture_pixel_gl.h b/shell/platform/tizen/external_texture_pixel_gl.h deleted file mode 100644 index f1c5180f847f1..0000000000000 --- a/shell/platform/tizen/external_texture_pixel_gl.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2020 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_EXTERNAL_TEXTURE_PIXEL_GL_H -#define EMBEDDER_EXTERNAL_TEXTURE_PIXEL_GL_H - -#include - -#include "flutter/shell/platform/common/public/flutter_texture_registrar.h" -#include "flutter/shell/platform/embedder/embedder.h" -#include "flutter/shell/platform/tizen/external_texture.h" - -namespace flutter { - -// An adaptation class of flutter engine and external texture interface. -class ExternalTexturePixelGL : public ExternalTexture { - public: - ExternalTexturePixelGL( - FlutterDesktopPixelBufferTextureCallback texture_callback, - void* user_data); - - ~ExternalTexturePixelGL() = default; - - bool PopulateTexture(size_t width, - size_t height, - FlutterOpenGLTexture* opengl_texture) override; - - bool CopyPixelBuffer(size_t& width, size_t& height); - - private: - FlutterDesktopPixelBufferTextureCallback texture_callback_ = nullptr; - void* user_data_ = nullptr; -}; - -} // namespace flutter - -#endif // EMBEDDER_EXTERNAL_TEXTURE_PIXEL_GL_H diff --git a/shell/platform/tizen/external_texture_surface_gl.cc b/shell/platform/tizen/external_texture_surface_egl.cc similarity index 73% rename from shell/platform/tizen/external_texture_surface_gl.cc rename to shell/platform/tizen/external_texture_surface_egl.cc index 99b6552269eba..081d37ab25205 100644 --- a/shell/platform/tizen/external_texture_surface_gl.cc +++ b/shell/platform/tizen/external_texture_surface_egl.cc @@ -2,21 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "external_texture_surface_gl.h" +#include "external_texture_surface_egl.h" -#include - -#ifdef TIZEN_RENDERER_EVAS_GL -#include "tizen_evas_gl_helper.h" -extern Evas_GL* g_evas_gl; -EVAS_GL_GLOBAL_GLES2_DECLARE(); -#else #include #include +#include #include #include - #include +#include #include #ifndef EGL_DMA_BUF_PLANE3_FD_EXT #define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440 @@ -27,13 +21,12 @@ EVAS_GL_GLOBAL_GLES2_DECLARE(); #ifndef EGL_DMA_BUF_PLANE3_PITCH_EXT #define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442 #endif -#endif #include "flutter/shell/platform/tizen/logger.h" namespace flutter { -ExternalTextureSurfaceGL::ExternalTextureSurfaceGL( +ExternalTextureSurfaceEGL::ExternalTextureSurfaceEGL( ExternalTextureExtensionType gl_extension, FlutterDesktopGpuBufferTextureCallback texture_callback, void* user_data) @@ -41,14 +34,14 @@ ExternalTextureSurfaceGL::ExternalTextureSurfaceGL( texture_callback_(texture_callback), user_data_(user_data) {} -ExternalTextureSurfaceGL::~ExternalTextureSurfaceGL() { +ExternalTextureSurfaceEGL::~ExternalTextureSurfaceEGL() { if (state_->gl_texture != 0) { - glDeleteTextures(1, &state_->gl_texture); + glDeleteTextures(1, static_cast(&state_->gl_texture)); } state_.release(); } -bool ExternalTextureSurfaceGL::PopulateTexture( +bool ExternalTextureSurfaceEGL::PopulateTexture( size_t width, size_t height, FlutterOpenGLTexture* opengl_texture) { @@ -81,46 +74,6 @@ bool ExternalTextureSurfaceGL::PopulateTexture( return false; } -#ifdef TIZEN_RENDERER_EVAS_GL - EvasGLImage egl_src_image = nullptr; - if (state_->gl_extension == ExternalTextureExtensionType::kNativeSurface) { - int attribs[] = {EVAS_GL_IMAGE_PRESERVED, GL_TRUE, 0}; - egl_src_image = evasglCreateImageForContext( - g_evas_gl, evas_gl_current_context_get(g_evas_gl), - EVAS_GL_NATIVE_SURFACE_TIZEN, tbm_surface, attribs); - } else if (state_->gl_extension == ExternalTextureExtensionType::kDmaBuffer) { - FT_LOG(Error) - << "EGL_EXT_image_dma_buf_import is not supported this renderer."; - if (gpu_buffer->release_callback) { - gpu_buffer->release_callback(gpu_buffer->release_context); - } - return false; - } - if (!egl_src_image) { - if (gpu_buffer->release_callback) { - gpu_buffer->release_callback(gpu_buffer->release_context); - } - return false; - } - if (state_->gl_texture == 0) { - glGenTextures(1, &state_->gl_texture); - glBindTexture(GL_TEXTURE_EXTERNAL_OES, state_->gl_texture); - // set the texture wrapping parameters - glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, - GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, - GL_CLAMP_TO_BORDER); - // set texture filtering parameters - glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - } else { - glBindTexture(GL_TEXTURE_EXTERNAL_OES, state_->gl_texture); - } - glEvasGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, egl_src_image); - if (egl_src_image) { - evasglDestroyImage(egl_src_image); - } -#else PFNEGLCREATEIMAGEKHRPROC n_eglCreateImageKHR = reinterpret_cast( eglGetProcAddress("eglCreateImageKHR")); @@ -184,8 +137,9 @@ bool ExternalTextureSurfaceGL::PopulateTexture( return false; } if (state_->gl_texture == 0) { - glGenTextures(1, &state_->gl_texture); - glBindTexture(GL_TEXTURE_EXTERNAL_OES, state_->gl_texture); + glGenTextures(1, static_cast(&state_->gl_texture)); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, + static_cast(state_->gl_texture)); // set the texture wrapping parameters glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); @@ -195,7 +149,8 @@ bool ExternalTextureSurfaceGL::PopulateTexture( glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } else { - glBindTexture(GL_TEXTURE_EXTERNAL_OES, state_->gl_texture); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, + static_cast(state_->gl_texture)); } PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES = reinterpret_cast( @@ -207,7 +162,6 @@ bool ExternalTextureSurfaceGL::PopulateTexture( eglGetProcAddress("eglDestroyImageKHR")); n_eglDestroyImageKHR(eglGetCurrentDisplay(), egl_src_image); } -#endif opengl_texture->target = GL_TEXTURE_EXTERNAL_OES; opengl_texture->name = state_->gl_texture; opengl_texture->format = GL_RGBA8; diff --git a/shell/platform/tizen/external_texture_surface_gl.h b/shell/platform/tizen/external_texture_surface_egl.h similarity index 77% rename from shell/platform/tizen/external_texture_surface_gl.h rename to shell/platform/tizen/external_texture_surface_egl.h index 2d66d43aa0208..ee9d0c17c8c8c 100644 --- a/shell/platform/tizen/external_texture_surface_gl.h +++ b/shell/platform/tizen/external_texture_surface_egl.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef EMBEDDER_EXTERNAL_TEXTURE_SURFACE_GL_H_ -#define EMBEDDER_EXTERNAL_TEXTURE_SURFACE_GL_H_ +#ifndef EMBEDDER_EXTERNAL_TEXTURE_SURFACE_EGL_H_ +#define EMBEDDER_EXTERNAL_TEXTURE_SURFACE_EGL_H_ #include "flutter/shell/platform/common/public/flutter_texture_registrar.h" #include "flutter/shell/platform/embedder/embedder.h" @@ -11,15 +11,14 @@ namespace flutter { -// An adaptation class of flutter engine and external texture interface. -class ExternalTextureSurfaceGL : public ExternalTexture { +class ExternalTextureSurfaceEGL : public ExternalTexture { public: - ExternalTextureSurfaceGL( + ExternalTextureSurfaceEGL( ExternalTextureExtensionType gl_extension, FlutterDesktopGpuBufferTextureCallback texture_callback, void* user_data); - virtual ~ExternalTextureSurfaceGL(); + virtual ~ExternalTextureSurfaceEGL(); // Accepts texture buffer copy request from the Flutter engine. // When the user side marks the texture_id as available, the Flutter engine @@ -39,4 +38,4 @@ class ExternalTextureSurfaceGL : public ExternalTexture { } // namespace flutter -#endif // EMBEDDER_EXTERNAL_TEXTURE_SURFACE_GL_H_ +#endif // EMBEDDER_EXTERNAL_TEXTURE_SURFACE_EGL_H_ diff --git a/shell/platform/tizen/external_texture_surface_evas_gl.cc b/shell/platform/tizen/external_texture_surface_evas_gl.cc new file mode 100644 index 0000000000000..8d56f40e09950 --- /dev/null +++ b/shell/platform/tizen/external_texture_surface_evas_gl.cc @@ -0,0 +1,119 @@ +// Copyright 2020 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 "external_texture_surface_evas_gl.h" + +#include + +#include "tizen_evas_gl_helper.h" +extern Evas_GL* g_evas_gl; +EVAS_GL_GLOBAL_GLES2_DECLARE(); + +#include "flutter/shell/platform/tizen/logger.h" + +namespace flutter { + +ExternalTextureSurfaceEvasGL::ExternalTextureSurfaceEvasGL( + ExternalTextureExtensionType gl_extension, + FlutterDesktopGpuBufferTextureCallback texture_callback, + void* user_data) + : ExternalTexture(gl_extension), + texture_callback_(texture_callback), + user_data_(user_data) {} + +ExternalTextureSurfaceEvasGL::~ExternalTextureSurfaceEvasGL() { + if (state_->gl_texture != 0) { + glDeleteTextures(1, static_cast(&state_->gl_texture)); + } + state_.release(); +} + +bool ExternalTextureSurfaceEvasGL::PopulateTexture( + size_t width, + size_t height, + FlutterOpenGLTexture* opengl_texture) { + if (!texture_callback_) { + return false; + } + const FlutterDesktopGpuBuffer* gpu_buffer = + texture_callback_(width, height, user_data_); + if (!gpu_buffer) { + FT_LOG(Info) << "gpu_buffer is null for texture ID: " << texture_id_; + return false; + } + + if (!gpu_buffer->buffer) { + FT_LOG(Info) << "tbm_surface is null for texture ID: " << texture_id_; + if (gpu_buffer->release_callback) { + gpu_buffer->release_callback(gpu_buffer->release_context); + } + return false; + } + const tbm_surface_h tbm_surface = + reinterpret_cast(const_cast(gpu_buffer->buffer)); + + tbm_surface_info_s info; + if (tbm_surface_get_info(tbm_surface, &info) != TBM_SURFACE_ERROR_NONE) { + FT_LOG(Info) << "tbm_surface is invalid for texture ID: " << texture_id_; + if (gpu_buffer->release_callback) { + gpu_buffer->release_callback(gpu_buffer->release_context); + } + return false; + } + + EvasGLImage evasgl_src_image = nullptr; + if (state_->gl_extension == ExternalTextureExtensionType::kNativeSurface) { + int attribs[] = {EVAS_GL_IMAGE_PRESERVED, GL_TRUE, 0}; + evasgl_src_image = evasglCreateImageForContext( + g_evas_gl, evas_gl_current_context_get(g_evas_gl), + EVAS_GL_NATIVE_SURFACE_TIZEN, tbm_surface, attribs); + } else if (state_->gl_extension == ExternalTextureExtensionType::kDmaBuffer) { + FT_LOG(Error) + << "EGL_EXT_image_dma_buf_import is not supported this renderer."; + if (gpu_buffer->release_callback) { + gpu_buffer->release_callback(gpu_buffer->release_context); + } + return false; + } + if (!evasgl_src_image) { + if (gpu_buffer->release_callback) { + gpu_buffer->release_callback(gpu_buffer->release_context); + } + return false; + } + if (state_->gl_texture == 0) { + glGenTextures(1, static_cast(&state_->gl_texture)); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, + static_cast(state_->gl_texture)); + // set the texture wrapping parameters + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, + GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, + GL_CLAMP_TO_BORDER); + // set texture filtering parameters + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else { + glBindTexture(GL_TEXTURE_EXTERNAL_OES, + static_cast(state_->gl_texture)); + } + glEvasGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, evasgl_src_image); + if (evasgl_src_image) { + evasglDestroyImage(evasgl_src_image); + } + + opengl_texture->target = GL_TEXTURE_EXTERNAL_OES; + opengl_texture->name = state_->gl_texture; + opengl_texture->format = GL_RGBA8; + opengl_texture->destruction_callback = nullptr; + opengl_texture->user_data = nullptr; + opengl_texture->width = width; + opengl_texture->height = height; + if (gpu_buffer->release_callback) { + gpu_buffer->release_callback(gpu_buffer->release_context); + } + return true; +} + +} // namespace flutter diff --git a/shell/platform/tizen/external_texture_surface_evas_gl.h b/shell/platform/tizen/external_texture_surface_evas_gl.h new file mode 100644 index 0000000000000..f604f0ebc9e30 --- /dev/null +++ b/shell/platform/tizen/external_texture_surface_evas_gl.h @@ -0,0 +1,41 @@ +// Copyright 2020 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_EXTERNAL_TEXTURE_SURFACE_EVAS_GL_H_ +#define EMBEDDER_EXTERNAL_TEXTURE_SURFACE_EVAS_GL_H_ + +#include "flutter/shell/platform/common/public/flutter_texture_registrar.h" +#include "flutter/shell/platform/embedder/embedder.h" +#include "flutter/shell/platform/tizen/external_texture.h" + +namespace flutter { + +class ExternalTextureSurfaceEvasGL : public ExternalTexture { + public: + ExternalTextureSurfaceEvasGL( + ExternalTextureExtensionType gl_extension, + FlutterDesktopGpuBufferTextureCallback texture_callback, + void* user_data); + + virtual ~ExternalTextureSurfaceEvasGL(); + + // Accepts texture buffer copy request from the Flutter engine. + // When the user side marks the texture_id as available, the Flutter engine + // will callback to this method and ask to populate the |opengl_texture| + // object, such as the texture type and the format of the pixel buffer and the + // texture object. + // + // Returns true on success, false on failure. + bool PopulateTexture(size_t width, + size_t height, + FlutterOpenGLTexture* opengl_texture) override; + + private: + FlutterDesktopGpuBufferTextureCallback texture_callback_ = nullptr; + void* user_data_ = nullptr; +}; + +} // namespace flutter + +#endif // EMBEDDER_EXTERNAL_TEXTURE_SURFACE_EVAS_GL_H_ diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index f0bc6c586f2a6..c1778f79df54a 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -14,6 +14,10 @@ #include "flutter/shell/platform/tizen/logger.h" #include "flutter/shell/platform/tizen/public/flutter_platform_view.h" #include "flutter/shell/platform/tizen/tizen_window.h" +#ifndef WEARABLE_PROFILE +#include "flutter/shell/platform/tizen/tizen_window_ecore_wl2.h" +#endif +#include "flutter/shell/platform/tizen/tizen_window_elementary.h" namespace { @@ -44,6 +48,10 @@ FlutterDesktopTextureRegistrarRef HandleForTextureRegistrar( return reinterpret_cast(registrar); } +FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) { + return reinterpret_cast(view); +} + } // namespace FlutterDesktopEngineRef FlutterDesktopEngineCreate( @@ -186,6 +194,45 @@ void FlutterDesktopViewDestroy(FlutterDesktopViewRef view_ref) { delete view; } +FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( + const FlutterDesktopWindowProperties& window_properties, + FlutterDesktopEngineRef engine) { + flutter::TizenGeometry window_geometry = { + window_properties.x, window_properties.y, window_properties.width, + window_properties.height}; + + std::unique_ptr window; + if (window_properties.renderer_type == FlutterDesktopRendererType::kEvasGL) { + window = std::make_unique( + window_geometry, window_properties.transparent, + window_properties.focusable, window_properties.top_level); + } else { +#ifndef WEARABLE_PROFILE + window = std::make_unique( + window_geometry, window_properties.transparent, + window_properties.focusable, window_properties.top_level); +#else + return nullptr; +#endif + } + + auto view = std::make_unique(std::move(window)); + + // 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; + } + } + + view->SendInitialGeometry(); + + return HandleForView(view.release()); +} + void FlutterDesktopViewResize(FlutterDesktopViewRef view, int32_t width, int32_t height) { diff --git a/shell/platform/tizen/flutter_tizen_ecore.cc b/shell/platform/tizen/flutter_tizen_ecore.cc deleted file mode 100644 index c6fecd069b1a8..0000000000000 --- a/shell/platform/tizen/flutter_tizen_ecore.cc +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2022 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 "public/flutter_tizen.h" - -#include "flutter/shell/platform/tizen/flutter_tizen_engine.h" -#include "flutter/shell/platform/tizen/flutter_tizen_view.h" -#include "flutter/shell/platform/tizen/logger.h" -#include "flutter/shell/platform/tizen/tizen_window_ecore_wl2.h" - -namespace { - -// Returns the engine corresponding to the given opaque API handle. -flutter::FlutterTizenEngine* EngineFromHandle(FlutterDesktopEngineRef ref) { - return reinterpret_cast(ref); -} - -FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) { - return reinterpret_cast(view); -} - -} // namespace - -FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( - const FlutterDesktopWindowProperties& window_properties, - FlutterDesktopEngineRef engine) { - flutter::TizenGeometry window_geometry = { - window_properties.x, window_properties.y, window_properties.width, - window_properties.height}; - - std::unique_ptr window = - std::make_unique( - window_geometry, window_properties.transparent, - window_properties.focusable, window_properties.top_level); - - auto view = std::make_unique(std::move(window)); - - // Take ownership of the engine, starting it if necessary. - view->SetEngine( - std::unique_ptr(EngineFromHandle(engine))); - view->CreateRenderSurface(); - if (!view->engine()->IsRunning()) { - if (!view->engine()->RunEngine()) { - return nullptr; - } - } - - view->SendInitialGeometry(); - - return HandleForView(view.release()); -} - -FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( - const FlutterDesktopViewProperties& view_properties, - FlutterDesktopEngineRef engine, - void* parent) { - FT_LOG(Warn) << "Not applicable!"; - return nullptr; -} - -void* FlutterDesktopViewGetEvasObject(FlutterDesktopViewRef view_ref) { - FT_LOG(Warn) << "Not applicable!"; - return nullptr; -} diff --git a/shell/platform/tizen/flutter_tizen_elementary.cc b/shell/platform/tizen/flutter_tizen_elementary.cc index ec408aec5ff93..187e1e7a4c665 100644 --- a/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/shell/platform/tizen/flutter_tizen_elementary.cc @@ -7,7 +7,6 @@ #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_elementary.h" -#include "flutter/shell/platform/tizen/tizen_window_elementary.h" namespace { @@ -22,35 +21,6 @@ FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) { } // namespace -FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( - const FlutterDesktopWindowProperties& window_properties, - FlutterDesktopEngineRef engine) { - flutter::TizenGeometry window_geometry = { - window_properties.x, window_properties.y, window_properties.width, - window_properties.height}; - - std::unique_ptr window = - std::make_unique( - window_geometry, window_properties.transparent, - window_properties.focusable, window_properties.top_level); - - auto view = std::make_unique(std::move(window)); - - // Take ownership of the engine, starting it if necessary. - view->SetEngine( - std::unique_ptr(EngineFromHandle(engine))); - view->CreateRenderSurface(); - if (!view->engine()->IsRunning()) { - if (!view->engine()->RunEngine()) { - return nullptr; - } - } - - view->SendInitialGeometry(); - - return HandleForView(view.release()); -} - FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( const FlutterDesktopViewProperties& view_properties, FlutterDesktopEngineRef engine, @@ -66,7 +36,7 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromElmParent( // Take ownership of the engine, starting it if necessary. view->SetEngine( std::unique_ptr(EngineFromHandle(engine))); - view->CreateRenderSurface(); + view->CreateRenderSurface(FlutterDesktopRendererType::kEvasGL); if (!view->engine()->IsRunning()) { if (!view->engine()->RunEngine()) { return nullptr; diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index 997a6015e957a..f92170f8c2ac7 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -12,11 +12,13 @@ #ifndef WEARABLE_PROFILE #include "flutter/shell/platform/tizen/accessibility_bridge_delegate_tizen.h" #include "flutter/shell/platform/tizen/flutter_platform_node_delegate_tizen.h" +#include "flutter/shell/platform/tizen/tizen_renderer_egl.h" #endif #include "flutter/shell/platform/tizen/flutter_tizen_view.h" #include "flutter/shell/platform/tizen/logger.h" #include "flutter/shell/platform/tizen/system_utils.h" #include "flutter/shell/platform/tizen/tizen_input_method_context.h" +#include "flutter/shell/platform/tizen/tizen_renderer_evas_gl.h" namespace flutter { @@ -24,9 +26,7 @@ namespace { // Unique number associated with platform tasks. constexpr size_t kPlatformTaskRunnerIdentifier = 1; -#ifdef TIZEN_RENDERER_EVAS_GL constexpr size_t kRenderTaskRunnerIdentifier = 2; -#endif // Converts a LanguageInfo struct to a FlutterLocale struct. |info| must outlive // the returned value, since the returned FlutterLocale has pointers into it. @@ -65,22 +65,6 @@ FlutterTizenEngine::FlutterTizenEngine(const FlutterProjectBundle& project) } }); -#ifdef TIZEN_RENDERER_EVAS_GL - renderer_ = std::make_unique(); - - 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 - renderer_ = std::make_unique(); -#endif - messenger_ = std::make_unique(); messenger_->engine = this; message_dispatcher_ = @@ -94,6 +78,28 @@ FlutterTizenEngine::~FlutterTizenEngine() { StopEngine(); } +void FlutterTizenEngine::CreateRenderer( + FlutterDesktopRendererType renderer_type) { + if (renderer_type == FlutterDesktopRendererType::kEvasGL) { + renderer_ = std::make_unique(); + + 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()); + } +#ifndef WEARABLE_PROFILE + else { + renderer_ = std::make_unique(); + } +#endif +} + bool FlutterTizenEngine::RunEngine() { if (engine_ != nullptr) { FT_LOG(Error) << "The engine has already started."; @@ -152,9 +158,9 @@ bool FlutterTizenEngine::RunEngine() { custom_task_runners.struct_size = sizeof(FlutterCustomTaskRunners); custom_task_runners.platform_task_runner = &platform_task_runner; -#ifdef TIZEN_RENDERER_EVAS_GL FlutterTaskRunnerDescription render_task_runner = {}; - if (IsHeaded()) { + + if (IsHeaded() && renderer_->type() == FlutterDesktopRendererType::kEvasGL) { render_task_runner.struct_size = sizeof(FlutterTaskRunnerDescription); render_task_runner.user_data = render_loop_.get(); render_task_runner.runs_task_on_current_thread_callback = @@ -168,7 +174,6 @@ bool FlutterTizenEngine::RunEngine() { render_task_runner.identifier = kRenderTaskRunnerIdentifier; custom_task_runners.render_task_runner = &render_task_runner; } -#endif FlutterProjectArgs args = {}; args.struct_size = sizeof(FlutterProjectArgs); @@ -198,8 +203,9 @@ bool FlutterTizenEngine::RunEngine() { args.update_semantics_node_callback = OnUpdateSemanticsNode; args.update_semantics_custom_action_callback = OnUpdateSemanticsCustomActions; #endif -#ifndef TIZEN_RENDERER_EVAS_GL - if (IsHeaded()) { + +#ifndef WEARABLE_PROFILE + if (IsHeaded() && renderer_->type() == FlutterDesktopRendererType::kEGL) { tizen_vsync_waiter_ = std::make_unique(this); args.vsync_callback = [](void* user_data, intptr_t baton) -> void { reinterpret_cast(user_data) @@ -263,8 +269,11 @@ bool FlutterTizenEngine::StopEngine() { plugin_registrar_destruction_callbacks_) { callback(registrar); } -#ifndef TIZEN_RENDERER_EVAS_GL - tizen_vsync_waiter_.reset(); + +#ifndef WEARABLE_PROFILE + if (IsHeaded() && renderer_->type() == FlutterDesktopRendererType::kEGL) { + tizen_vsync_waiter_.reset(); + } #endif FlutterEngineResult result = embedder_api_.Shutdown(engine_); view_ = nullptr; diff --git a/shell/platform/tizen/flutter_tizen_engine.h b/shell/platform/tizen/flutter_tizen_engine.h index 369a564085623..65dd970ca9a33 100644 --- a/shell/platform/tizen/flutter_tizen_engine.h +++ b/shell/platform/tizen/flutter_tizen_engine.h @@ -27,10 +27,7 @@ #include "flutter/shell/platform/tizen/public/flutter_tizen.h" #include "flutter/shell/platform/tizen/tizen_event_loop.h" #include "flutter/shell/platform/tizen/tizen_renderer.h" -#ifdef TIZEN_RENDERER_EVAS_GL -#include "flutter/shell/platform/tizen/tizen_renderer_evas_gl.h" -#else -#include "flutter/shell/platform/tizen/tizen_renderer_egl.h" +#ifndef WEARABLE_PROFILE #include "flutter/shell/platform/tizen/tizen_vsync_waiter.h" #endif @@ -62,6 +59,9 @@ class FlutterTizenEngine { FlutterTizenEngine(FlutterTizenEngine const&) = delete; FlutterTizenEngine& operator=(FlutterTizenEngine const&) = delete; + // Creates a GL renderer from the given type. + void CreateRenderer(FlutterDesktopRendererType renderer_type); + // Starts running the engine with the given entrypoint. If null, defaults to // main(). // @@ -279,14 +279,12 @@ class FlutterTizenEngine { // The event loop for the main thread that allows for delayed task execution. std::unique_ptr event_loop_; -#ifdef TIZEN_RENDERER_EVAS_GL std::unique_ptr render_loop_; -#endif // An interface between the Flutter rasterizer and the platform. std::unique_ptr renderer_; -#ifndef TIZEN_RENDERER_EVAS_GL +#ifndef WEARABLE_PROFILE // The vsync waiter for the embedder. std::unique_ptr tizen_vsync_waiter_; #endif diff --git a/shell/platform/tizen/flutter_tizen_texture_registrar.cc b/shell/platform/tizen/flutter_tizen_texture_registrar.cc index 928bcb52a3181..628af06ff597c 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -7,8 +7,10 @@ #include #include -#include "flutter/shell/platform/tizen/external_texture_pixel_gl.h" -#include "flutter/shell/platform/tizen/external_texture_surface_gl.h" +#ifndef WEARABLE_PROFILE +#include "flutter/shell/platform/tizen/external_texture_surface_egl.h" +#endif +#include "flutter/shell/platform/tizen/external_texture_surface_evas_gl.h" #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" #include "flutter/shell/platform/tizen/logger.h" @@ -39,8 +41,16 @@ int64_t FlutterTizenTextureRegistrar::RegisterTexture( return -1; } } + FlutterDesktopRendererType renderer_type = FlutterDesktopRendererType::kEGL; + if (engine_->renderer()) { + renderer_type = engine_->renderer()->type(); + } std::unique_ptr texture_gl = - CreateExternalTexture(texture_info); + CreateExternalTexture(texture_info, renderer_type); + if (!texture_gl) { + FT_LOG(Error) << "Failed to create ExternalTexture."; + return -1; + } int64_t texture_id = texture_gl->TextureId(); { @@ -88,27 +98,35 @@ bool FlutterTizenTextureRegistrar::PopulateTexture( std::unique_ptr FlutterTizenTextureRegistrar::CreateExternalTexture( - const FlutterDesktopTextureInfo* texture_info) { + const FlutterDesktopTextureInfo* texture_info, + FlutterDesktopRendererType renderer_type) { switch (texture_info->type) { case kFlutterDesktopPixelBufferTexture: - return std::make_unique( - texture_info->pixel_buffer_config.callback, - texture_info->pixel_buffer_config.user_data); - break; + FT_UNIMPLEMENTED(); + return nullptr; case kFlutterDesktopGpuBufferTexture: ExternalTextureExtensionType gl_extension = ExternalTextureExtensionType::kNone; - if (engine_->renderer()->IsSupportedExtension( - "EGL_TIZEN_image_native_surface")) { + if (engine_->renderer() && engine_->renderer()->IsSupportedExtension( + "EGL_TIZEN_image_native_surface")) { gl_extension = ExternalTextureExtensionType::kNativeSurface; - } else if (engine_->renderer()->IsSupportedExtension( + } else if (engine_->renderer() && + engine_->renderer()->IsSupportedExtension( "EGL_EXT_image_dma_buf_import")) { gl_extension = ExternalTextureExtensionType::kDmaBuffer; } - return std::make_unique( + if (FlutterDesktopRendererType::kEvasGL == renderer_type) { + return std::make_unique( + gl_extension, texture_info->gpu_buffer_config.callback, + texture_info->gpu_buffer_config.user_data); + } +#ifndef WEARABLE_PROFILE + return std::make_unique( gl_extension, texture_info->gpu_buffer_config.callback, texture_info->gpu_buffer_config.user_data); - break; +#else + return nullptr; +#endif } } diff --git a/shell/platform/tizen/flutter_tizen_texture_registrar.h b/shell/platform/tizen/flutter_tizen_texture_registrar.h index 2549bc07e30bc..4b7d1b3f9e05b 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar.h +++ b/shell/platform/tizen/flutter_tizen_texture_registrar.h @@ -10,6 +10,7 @@ #include #include "flutter/shell/platform/tizen/external_texture.h" +#include "flutter/shell/platform/tizen/public/flutter_tizen.h" namespace flutter { @@ -46,7 +47,8 @@ class FlutterTizenTextureRegistrar { FlutterOpenGLTexture* texture); std::unique_ptr CreateExternalTexture( - const FlutterDesktopTextureInfo* info); + const FlutterDesktopTextureInfo* info, + FlutterDesktopRendererType renderer_type); private: FlutterTizenEngine* engine_ = nullptr; diff --git a/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc b/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc index 2c72a93822529..1233bd5e324ac 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc +++ b/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc @@ -54,12 +54,10 @@ TEST_F(FlutterTizenTextureRegistrarTest, RegisterUnregisterTexture) { FlutterTizenTextureRegistrar registrar(engine_); FlutterDesktopTextureInfo texture_info = {}; - texture_info.type = kFlutterDesktopPixelBufferTexture; - texture_info.pixel_buffer_config.callback = + texture_info.type = kFlutterDesktopGpuBufferTexture; + texture_info.gpu_buffer_config.callback = [](size_t width, size_t height, - void* user_data) -> const FlutterDesktopPixelBuffer* { - return nullptr; - }; + void* user_data) -> const FlutterDesktopGpuBuffer* { return nullptr; }; int64_t registered_texture_id = 0; bool register_called = false; diff --git a/shell/platform/tizen/flutter_tizen_view.cc b/shell/platform/tizen/flutter_tizen_view.cc index 50cfb734fac4a..a552f35b89567 100644 --- a/shell/platform/tizen/flutter_tizen_view.cc +++ b/shell/platform/tizen/flutter_tizen_view.cc @@ -84,7 +84,12 @@ void FlutterTizenView::SetEngine(std::unique_ptr engine) { tizen_view_->input_method_context()); } -void FlutterTizenView::CreateRenderSurface() { +void FlutterTizenView::CreateRenderSurface( + FlutterDesktopRendererType renderer_type) { + if (engine_) { + engine_->CreateRenderer(renderer_type); + } + if (engine_ && engine_->renderer()) { TizenGeometry geometry = tizen_view_->GetGeometry(); if (tizen_view_->GetType() == TizenViewType::kWindow) { diff --git a/shell/platform/tizen/flutter_tizen_view.h b/shell/platform/tizen/flutter_tizen_view.h index 1860541c23fa7..2b1501a177939 100644 --- a/shell/platform/tizen/flutter_tizen_view.h +++ b/shell/platform/tizen/flutter_tizen_view.h @@ -36,7 +36,7 @@ class FlutterTizenView : public TizenViewEventHandlerDelegate { // Creates rendering surface for Flutter engine to draw into. // Should be called before calling FlutterEngineRun using this view. - void CreateRenderSurface(); + void CreateRenderSurface(FlutterDesktopRendererType renderer_type); // Destroys current rendering surface if one has been allocated. void DestroyRenderSurface(); diff --git a/shell/platform/tizen/public/flutter_tizen.h b/shell/platform/tizen/public/flutter_tizen.h index 1e7d41b934aa2..a00138439e5ba 100644 --- a/shell/platform/tizen/public/flutter_tizen.h +++ b/shell/platform/tizen/public/flutter_tizen.h @@ -25,6 +25,13 @@ typedef struct FlutterDesktopEngine* FlutterDesktopEngineRef; struct FlutterDesktopView; typedef struct FlutterDesktopView* FlutterDesktopViewRef; +typedef enum { + // The renderer based on EvasGL. + kEvasGL, + // The renderer based on EGL. + kEGL, +} FlutterDesktopRendererType; + // Properties for configuring the initial settings of a Flutter window. typedef struct { // The x-coordinate of the top left corner of the window. @@ -41,6 +48,8 @@ typedef struct { bool focusable; // Whether the window should be on top layer or not. bool top_level; + // The renderer type of the engine. + FlutterDesktopRendererType renderer_type; } FlutterDesktopWindowProperties; // Properties for configuring the initial settings of a Flutter view. diff --git a/shell/platform/tizen/tizen_event_loop.cc b/shell/platform/tizen/tizen_event_loop.cc index 8faba58b34ee3..ad3cf8bc407f7 100644 --- a/shell/platform/tizen/tizen_event_loop.cc +++ b/shell/platform/tizen/tizen_event_loop.cc @@ -7,9 +7,7 @@ #include -#ifdef TIZEN_RENDERER_EVAS_GL #include "flutter/shell/platform/tizen/tizen_renderer_evas_gl.h" -#endif namespace flutter { @@ -110,7 +108,6 @@ void TizenPlatformEventLoop::OnTaskExpired() { expired_tasks_.clear(); } -#ifdef TIZEN_RENDERER_EVAS_GL TizenRenderEventLoop::TizenRenderEventLoop(std::thread::id main_thread_id, CurrentTimeProc get_current_time, TaskExpiredCallback on_task_expired, @@ -138,6 +135,5 @@ void TizenRenderEventLoop::OnTaskExpired() { has_pending_renderer_callback_ = true; } } -#endif // TIZEN_RENDERER_EVAS_GL } // namespace flutter diff --git a/shell/platform/tizen/tizen_event_loop.h b/shell/platform/tizen/tizen_event_loop.h index dae7c3e2e3b53..66cead0341d32 100644 --- a/shell/platform/tizen/tizen_event_loop.h +++ b/shell/platform/tizen/tizen_event_loop.h @@ -88,7 +88,6 @@ class TizenPlatformEventLoop : public TizenEventLoop { virtual void OnTaskExpired() override; }; -#ifdef TIZEN_RENDERER_EVAS_GL class TizenRenderer; class TizenRenderEventLoop : public TizenEventLoop { @@ -105,7 +104,6 @@ class TizenRenderEventLoop : public TizenEventLoop { TizenRenderer* renderer_{nullptr}; std::atomic_bool has_pending_renderer_callback_{false}; }; -#endif // TIZEN_RENDERER_EVAS_GL } // namespace flutter diff --git a/shell/platform/tizen/tizen_renderer.h b/shell/platform/tizen/tizen_renderer.h index 1077b173d1927..0220f51111a12 100644 --- a/shell/platform/tizen/tizen_renderer.h +++ b/shell/platform/tizen/tizen_renderer.h @@ -7,6 +7,8 @@ #include +#include "public/flutter_tizen.h" + namespace flutter { class TizenRenderer { @@ -24,6 +26,8 @@ class TizenRenderer { bool IsValid() { return is_valid_; } + FlutterDesktopRendererType type() { return type_; } + virtual bool OnMakeCurrent() = 0; virtual bool OnClearCurrent() = 0; @@ -42,6 +46,8 @@ class TizenRenderer { protected: bool is_valid_ = false; + + FlutterDesktopRendererType type_; }; } // namespace flutter diff --git a/shell/platform/tizen/tizen_renderer_egl.cc b/shell/platform/tizen/tizen_renderer_egl.cc index 0cf59eca14791..af121664a6f8c 100644 --- a/shell/platform/tizen/tizen_renderer_egl.cc +++ b/shell/platform/tizen/tizen_renderer_egl.cc @@ -13,7 +13,9 @@ namespace flutter { -TizenRendererEgl::TizenRendererEgl() {} +TizenRendererEgl::TizenRendererEgl() { + type_ = FlutterDesktopRendererType::kEGL; +} TizenRendererEgl::~TizenRendererEgl() { DestroySurface(); diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.cc b/shell/platform/tizen/tizen_renderer_evas_gl.cc index ae94366454e83..14c73960a216d 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -6,7 +6,8 @@ #include "tizen_evas_gl_helper.h" -// g_evas_gl is shared with ExternalTexturePixelGL and ExternalTextureSurfaceGL. +// g_evas_gl is shared with ExternalTextureSurfaceEGL and +// ExternalTextureSurfaceEvasGL. Evas_GL* g_evas_gl = nullptr; EVAS_GL_GLOBAL_GLES2_DEFINE(); @@ -15,7 +16,9 @@ EVAS_GL_GLOBAL_GLES2_DEFINE(); namespace flutter { -TizenRendererEvasGL::TizenRendererEvasGL() {} +TizenRendererEvasGL::TizenRendererEvasGL() { + type_ = FlutterDesktopRendererType::kEvasGL; +} TizenRendererEvasGL::~TizenRendererEvasGL() { DestroySurface(); diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.h b/shell/platform/tizen/tizen_renderer_evas_gl.h index 48101f027b934..3e74627994a84 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.h +++ b/shell/platform/tizen/tizen_renderer_evas_gl.h @@ -8,7 +8,6 @@ #include #include -#include #include "flutter/shell/platform/tizen/tizen_renderer.h" diff --git a/shell/platform/tizen/tizen_view_base.h b/shell/platform/tizen/tizen_view_base.h index a66e3ae8d6d60..113121a6c7f68 100644 --- a/shell/platform/tizen/tizen_view_base.h +++ b/shell/platform/tizen/tizen_view_base.h @@ -36,7 +36,7 @@ class TizenViewBase { virtual TizenGeometry GetGeometry() = 0; // Set the geometry of the view. - virtual void SetGeometry(TizenGeometry geometry) = 0; + virtual bool SetGeometry(TizenGeometry geometry) = 0; // Returns the dpi of the screen. virtual int32_t GetDpi() = 0; diff --git a/shell/platform/tizen/tizen_view_elementary.cc b/shell/platform/tizen/tizen_view_elementary.cc index 2c2ab5c973bdb..63e200841058d 100644 --- a/shell/platform/tizen/tizen_view_elementary.cc +++ b/shell/platform/tizen/tizen_view_elementary.cc @@ -321,9 +321,10 @@ TizenGeometry TizenViewElementary::GetGeometry() { return result; } -void TizenViewElementary::SetGeometry(TizenGeometry geometry) { +bool TizenViewElementary::SetGeometry(TizenGeometry geometry) { EvasObjectResizeWithMinMaxHint(container_, geometry.width, geometry.height); evas_object_move(container_, geometry.left, geometry.top); + return true; } int32_t TizenViewElementary::GetDpi() { diff --git a/shell/platform/tizen/tizen_view_elementary.h b/shell/platform/tizen/tizen_view_elementary.h index 479dbbbcc15de..74e58cb994313 100644 --- a/shell/platform/tizen/tizen_view_elementary.h +++ b/shell/platform/tizen/tizen_view_elementary.h @@ -26,7 +26,7 @@ class TizenViewElementary : public TizenView { TizenGeometry GetGeometry() override; - void SetGeometry(TizenGeometry geometry) override; + bool SetGeometry(TizenGeometry geometry) override; void* GetRenderTarget() override { return image_; } diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.cc b/shell/platform/tizen/tizen_window_ecore_wl2.cc index 06964a9546ec4..f38cf86def19e 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.cc +++ b/shell/platform/tizen/tizen_window_ecore_wl2.cc @@ -392,7 +392,7 @@ TizenGeometry TizenWindowEcoreWl2::GetGeometry() { return result; } -void TizenWindowEcoreWl2::SetGeometry(TizenGeometry geometry) { +bool TizenWindowEcoreWl2::SetGeometry(TizenGeometry geometry) { ecore_wl2_window_rotation_geometry_set(ecore_wl2_window_, GetRotation(), geometry.left, geometry.top, geometry.width, geometry.height); @@ -400,6 +400,7 @@ void TizenWindowEcoreWl2::SetGeometry(TizenGeometry geometry) { // only after calling `ecore_wl2_window_position_set`. Call a more appropriate // API that flushes geometry settings to the compositor. ecore_wl2_window_position_set(ecore_wl2_window_, geometry.left, geometry.top); + return true; } TizenGeometry TizenWindowEcoreWl2::GetScreenGeometry() { diff --git a/shell/platform/tizen/tizen_window_ecore_wl2.h b/shell/platform/tizen/tizen_window_ecore_wl2.h index c44b114454805..ecf77a52fc8e7 100644 --- a/shell/platform/tizen/tizen_window_ecore_wl2.h +++ b/shell/platform/tizen/tizen_window_ecore_wl2.h @@ -28,7 +28,7 @@ class TizenWindowEcoreWl2 : public TizenWindow { TizenGeometry GetGeometry() override; - void SetGeometry(TizenGeometry geometry) override; + bool SetGeometry(TizenGeometry geometry) override; TizenGeometry GetScreenGeometry() override; diff --git a/shell/platform/tizen/tizen_window_elementary.cc b/shell/platform/tizen/tizen_window_elementary.cc index a5c9e4055a815..927b3eea7913c 100644 --- a/shell/platform/tizen/tizen_window_elementary.cc +++ b/shell/platform/tizen/tizen_window_elementary.cc @@ -332,9 +332,9 @@ TizenGeometry TizenWindowElementary::GetGeometry() { return result; } -void TizenWindowElementary::SetGeometry(TizenGeometry geometry) { - evas_object_resize(elm_win_, geometry.width, geometry.height); - evas_object_move(elm_win_, geometry.left, geometry.top); +bool TizenWindowElementary::SetGeometry(TizenGeometry geometry) { + FT_LOG(Error) << "SetGeometry is not supported."; + return false; } TizenGeometry TizenWindowElementary::GetScreenGeometry() { diff --git a/shell/platform/tizen/tizen_window_elementary.h b/shell/platform/tizen/tizen_window_elementary.h index cf2d0aa7c8a01..ceb5f1fb05892 100644 --- a/shell/platform/tizen/tizen_window_elementary.h +++ b/shell/platform/tizen/tizen_window_elementary.h @@ -27,7 +27,7 @@ class TizenWindowElementary : public TizenWindow { TizenGeometry GetGeometry() override; - void SetGeometry(TizenGeometry geometry) override; + bool SetGeometry(TizenGeometry geometry) override; TizenGeometry GetScreenGeometry() override;