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;