From 8a1955f5fc182b39ef7bbbb575f302cbb7a4bb19 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 30 Jun 2022 14:50:38 +0900 Subject: [PATCH 1/8] Enable Evas GL renderer for all profile For devices other than wearable, we can either use ElmFlutterView or EcoreWl2Window, depending on apps. This commit is to avoid being device dependent. Remove the build flag for evas_gl only and use the WEARABLE_PROFILE macro if necessary. Before creating the engine, the embedding can select the renderer type in the engine property. On runtime, it selects an appropriate renderer and external texture according to the renderer type and renders it. related issue : https://github.com/flutter-tizen/engine/issues/301 --- shell/platform/tizen/BUILD.gn | 43 ++----- .../platform/tizen/channels/window_channel.cc | 3 +- shell/platform/tizen/external_texture.h | 8 +- .../tizen/external_texture_pixel_egl.cc | 70 +++++++++++ ...ixel_gl.h => external_texture_pixel_egl.h} | 14 +-- ...l.cc => external_texture_pixel_evas_gl.cc} | 22 ++-- .../tizen/external_texture_pixel_evas_gl.h | 36 ++++++ ..._gl.cc => external_texture_surface_egl.cc} | 68 ++-------- ...ce_gl.h => external_texture_surface_egl.h} | 12 +- .../tizen/external_texture_surface_evas_gl.cc | 117 ++++++++++++++++++ .../tizen/external_texture_surface_evas_gl.h | 42 +++++++ .../platform/tizen/flutter_project_bundle.cc | 2 + shell/platform/tizen/flutter_project_bundle.h | 5 + shell/platform/tizen/flutter_tizen.cc | 46 +++++++ shell/platform/tizen/flutter_tizen_ecore.cc | 55 +------- .../tizen/flutter_tizen_elementary.cc | 30 ----- shell/platform/tizen/flutter_tizen_engine.cc | 92 ++++++++------ shell/platform/tizen/flutter_tizen_engine.h | 11 +- .../tizen/flutter_tizen_texture_registrar.cc | 37 +++++- .../tizen/flutter_tizen_texture_registrar.h | 4 +- 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_evas_gl.h | 1 - 24 files changed, 462 insertions(+), 271 deletions(-) create mode 100644 shell/platform/tizen/external_texture_pixel_egl.cc rename shell/platform/tizen/{external_texture_pixel_gl.h => external_texture_pixel_egl.h} (76%) rename shell/platform/tizen/{external_texture_pixel_gl.cc => external_texture_pixel_evas_gl.cc} (78%) create mode 100644 shell/platform/tizen/external_texture_pixel_evas_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} (81%) create mode 100644 shell/platform/tizen/external_texture_surface_evas_gl.cc create mode 100644 shell/platform/tizen/external_texture_surface_evas_gl.h diff --git a/shell/platform/tizen/BUILD.gn b/shell/platform/tizen/BUILD.gn index 98c447774f1df..9056ec8c9d3ea 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 target profile is wearable, only the Evas_GL renderer is used, +# otherwise the Evas_GL and the Ecore_Wl2 renderers are used. template("embedder") { forward_variables_from(invoker, [ "target_type", - "use_evas_gl_renderer", "defines", ]) @@ -120,10 +115,11 @@ 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_pixel_evas_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 +128,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 +151,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,23 +188,10 @@ 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 += [ + "external_texture_pixel_egl.cc", + "external_texture_surface_egl.cc", "flutter_tizen_ecore.cc", "tizen_renderer_egl.cc", "tizen_vsync_waiter.cc", @@ -235,35 +223,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..806591dfa1e1f 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -43,10 +43,9 @@ 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 +#ifndef WEARABLE_PROFILE const auto* arguments = std::get_if(method_call.arguments()); if (!arguments) { result->Error("Invalid arguments"); diff --git a/shell/platform/tizen/external_texture.h b/shell/platform/tizen/external_texture.h index 53c77acaa8074..39c23bbc70269 100644 --- a/shell/platform/tizen/external_texture.h +++ b/shell/platform/tizen/external_texture.h @@ -11,18 +11,12 @@ #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; }; diff --git a/shell/platform/tizen/external_texture_pixel_egl.cc b/shell/platform/tizen/external_texture_pixel_egl.cc new file mode 100644 index 0000000000000..2e1eb4a0b1637 --- /dev/null +++ b/shell/platform/tizen/external_texture_pixel_egl.cc @@ -0,0 +1,70 @@ +// 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_egl.h" + +#include +#include +#include + +namespace flutter { + +bool ExternalTexturePixelEGL::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; +} + +ExternalTexturePixelEGL::ExternalTexturePixelEGL( + FlutterDesktopPixelBufferTextureCallback texture_callback, + void* user_data) + : ExternalTexture(), + texture_callback_(texture_callback), + user_data_(user_data) {} + +bool ExternalTexturePixelEGL::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, (GLuint*)&state_->gl_texture); + glBindTexture(GL_TEXTURE_2D, (GLuint)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, (GLuint)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_egl.h similarity index 76% rename from shell/platform/tizen/external_texture_pixel_gl.h rename to shell/platform/tizen/external_texture_pixel_egl.h index f1c5180f847f1..c8c35a2fbb4d6 100644 --- a/shell/platform/tizen/external_texture_pixel_gl.h +++ b/shell/platform/tizen/external_texture_pixel_egl.h @@ -2,10 +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_PIXEL_GL_H -#define EMBEDDER_EXTERNAL_TEXTURE_PIXEL_GL_H - -#include +#ifndef EMBEDDER_EXTERNAL_TEXTURE_PIXEL_EGL_H +#define EMBEDDER_EXTERNAL_TEXTURE_PIXEL_EGL_H #include "flutter/shell/platform/common/public/flutter_texture_registrar.h" #include "flutter/shell/platform/embedder/embedder.h" @@ -14,13 +12,13 @@ namespace flutter { // An adaptation class of flutter engine and external texture interface. -class ExternalTexturePixelGL : public ExternalTexture { +class ExternalTexturePixelEGL : public ExternalTexture { public: - ExternalTexturePixelGL( + ExternalTexturePixelEGL( FlutterDesktopPixelBufferTextureCallback texture_callback, void* user_data); - ~ExternalTexturePixelGL() = default; + ~ExternalTexturePixelEGL() = default; bool PopulateTexture(size_t width, size_t height, @@ -35,4 +33,4 @@ class ExternalTexturePixelGL : public ExternalTexture { } // namespace flutter -#endif // EMBEDDER_EXTERNAL_TEXTURE_PIXEL_GL_H +#endif // EMBEDDER_EXTERNAL_TEXTURE_PIXEL_EGL_H diff --git a/shell/platform/tizen/external_texture_pixel_gl.cc b/shell/platform/tizen/external_texture_pixel_evas_gl.cc similarity index 78% rename from shell/platform/tizen/external_texture_pixel_gl.cc rename to shell/platform/tizen/external_texture_pixel_evas_gl.cc index 340ccc8773fb7..6aa345af51820 100644 --- a/shell/platform/tizen/external_texture_pixel_gl.cc +++ b/shell/platform/tizen/external_texture_pixel_evas_gl.cc @@ -2,22 +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_pixel_gl.h" +#include "external_texture_pixel_evas_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( +bool ExternalTexturePixelEvasGL::PopulateTexture( size_t width, size_t height, FlutterOpenGLTexture* opengl_texture) { @@ -36,14 +29,15 @@ bool ExternalTexturePixelGL::PopulateTexture( return true; } -ExternalTexturePixelGL::ExternalTexturePixelGL( +ExternalTexturePixelEvasGL::ExternalTexturePixelEvasGL( FlutterDesktopPixelBufferTextureCallback texture_callback, void* user_data) : ExternalTexture(), texture_callback_(texture_callback), user_data_(user_data) {} -bool ExternalTexturePixelGL::CopyPixelBuffer(size_t& width, size_t& height) { +bool ExternalTexturePixelEvasGL::CopyPixelBuffer(size_t& width, + size_t& height) { if (!texture_callback_) { return false; } @@ -59,14 +53,14 @@ bool ExternalTexturePixelGL::CopyPixelBuffer(size_t& width, size_t& height) { height = pixel_buffer->height; if (state_->gl_texture == 0) { - glGenTextures(1, &state_->gl_texture); - glBindTexture(GL_TEXTURE_2D, state_->gl_texture); + glGenTextures(1, (GLuint*)&state_->gl_texture); + glBindTexture(GL_TEXTURE_2D, (GLuint)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); + glBindTexture(GL_TEXTURE_2D, (GLuint)state_->gl_texture); } glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixel_buffer->width, pixel_buffer->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, diff --git a/shell/platform/tizen/external_texture_pixel_evas_gl.h b/shell/platform/tizen/external_texture_pixel_evas_gl.h new file mode 100644 index 0000000000000..c4614beb4bc96 --- /dev/null +++ b/shell/platform/tizen/external_texture_pixel_evas_gl.h @@ -0,0 +1,36 @@ +// 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_EVAS_GL_H +#define EMBEDDER_EXTERNAL_TEXTURE_PIXEL_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 { + +// An adaptation class of flutter engine and external texture interface. +class ExternalTexturePixelEvasGL : public ExternalTexture { + public: + ExternalTexturePixelEvasGL( + FlutterDesktopPixelBufferTextureCallback texture_callback, + void* user_data); + + ~ExternalTexturePixelEvasGL() = 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_EVAS_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..4cbde19ad9c64 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, (GLuint*)&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,8 @@ 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, (GLuint*)&state_->gl_texture); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, (GLuint)state_->gl_texture); // set the texture wrapping parameters glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); @@ -195,7 +148,7 @@ 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, (GLuint)state_->gl_texture); } PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES = reinterpret_cast( @@ -207,7 +160,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 81% rename from shell/platform/tizen/external_texture_surface_gl.h rename to shell/platform/tizen/external_texture_surface_egl.h index 2d66d43aa0208..ba90e002784ad 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" @@ -12,14 +12,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 +39,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..8ebc213c1ef78 --- /dev/null +++ b/shell/platform/tizen/external_texture_surface_evas_gl.cc @@ -0,0 +1,117 @@ +// 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, (GLuint*)&(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, (GLuint*)&state_->gl_texture); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, (GLuint)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, (GLuint)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..4473caaf793e2 --- /dev/null +++ b/shell/platform/tizen/external_texture_surface_evas_gl.h @@ -0,0 +1,42 @@ +// 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 { + +// An adaptation class of flutter engine and external texture interface. +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_project_bundle.cc b/shell/platform/tizen/flutter_project_bundle.cc index 23ef6d2153b93..e013cc5a7d863 100644 --- a/shell/platform/tizen/flutter_project_bundle.cc +++ b/shell/platform/tizen/flutter_project_bundle.cc @@ -70,6 +70,8 @@ FlutterProjectBundle::FlutterProjectBundle( engine_arguments_.insert(engine_arguments_.end(), properties.switches, properties.switches + properties.switches_count); + + renderer_type_ = properties.renderer_type; } bool FlutterProjectBundle::HasValidPaths() { diff --git a/shell/platform/tizen/flutter_project_bundle.h b/shell/platform/tizen/flutter_project_bundle.h index c167357af5768..5a14f14b4581b 100644 --- a/shell/platform/tizen/flutter_project_bundle.h +++ b/shell/platform/tizen/flutter_project_bundle.h @@ -67,6 +67,9 @@ class FlutterProjectBundle { return dart_entrypoint_arguments_; } + // Returns the renderer type. + FlutterDesktopRendererType renderer_type() { return renderer_type_; } + private: std::filesystem::path assets_path_; std::filesystem::path icu_path_; @@ -80,6 +83,8 @@ class FlutterProjectBundle { // Dart entrypoint arguments. std::vector dart_entrypoint_arguments_; + + FlutterDesktopRendererType renderer_type_; }; } // namespace flutter diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index f0bc6c586f2a6..4a9c67898eb01 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -14,6 +14,8 @@ #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" +#include "flutter/shell/platform/tizen/tizen_window_ecore_wl2.h" +#include "flutter/shell/platform/tizen/tizen_window_elementary.h" namespace { @@ -44,6 +46,10 @@ FlutterDesktopTextureRegistrarRef HandleForTextureRegistrar( return reinterpret_cast(registrar); } +FlutterDesktopViewRef HandleForView(flutter::FlutterTizenView* view) { + return reinterpret_cast(view); +} + } // namespace FlutterDesktopEngineRef FlutterDesktopEngineCreate( @@ -186,6 +192,46 @@ 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 = nullptr; + if (EngineFromHandle(engine)->project()->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(); + 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 index c6fecd069b1a8..b43d510bfc7c0 100644 --- a/shell/platform/tizen/flutter_tizen_ecore.cc +++ b/shell/platform/tizen/flutter_tizen_ecore.cc @@ -9,57 +9,4 @@ #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; -} +namespace {} // namespace diff --git a/shell/platform/tizen/flutter_tizen_elementary.cc b/shell/platform/tizen/flutter_tizen_elementary.cc index ec408aec5ff93..044674057ba5a 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, diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index 997a6015e957a..f0e08deabdf1c 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. @@ -53,7 +53,6 @@ FlutterTizenEngine::FlutterTizenEngine(const FlutterProjectBundle& project) aot_data_(nullptr, nullptr) { embedder_api_.struct_size = sizeof(FlutterEngineProcTable); FlutterEngineGetProcAddresses(&embedder_api_); - // Run flutter task on Tizen main loop. // Tizen engine has four threads (GPU thread, UI thread, IO thread, platform // thread). UI threads need to send flutter task to platform thread. @@ -65,22 +64,27 @@ 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(); + if (project_->renderer_type() == FlutterDesktopRendererType::kEvasGL) { + renderer_ = std::make_unique(); + } +#ifndef WEARABLE_PROFILE + else { + renderer_ = std::make_unique(); + } #endif + if (project_->renderer_type() == FlutterDesktopRendererType::kEvasGL) { + render_loop_ = std::make_unique( + std::this_thread::get_id(), // main thread + embedder_api_.GetCurrentTime, + [this](const auto* task) { + if (embedder_api_.RunTask(this->engine_, task) != kSuccess) { + FT_LOG(Error) << "Could not post an engine task."; + } + }, + renderer_.get()); + } + messenger_ = std::make_unique(); messenger_->engine = this; message_dispatcher_ = @@ -152,23 +156,23 @@ 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()) { - render_task_runner.struct_size = sizeof(FlutterTaskRunnerDescription); - render_task_runner.user_data = render_loop_.get(); - render_task_runner.runs_task_on_current_thread_callback = - [](void* data) -> bool { - return static_cast(data)->RunsTasksOnCurrentThread(); - }; - render_task_runner.post_task_callback = - [](FlutterTask task, uint64_t target_time_nanos, void* data) -> void { - static_cast(data)->PostTask(task, target_time_nanos); - }; - render_task_runner.identifier = kRenderTaskRunnerIdentifier; - custom_task_runners.render_task_runner = &render_task_runner; + if (project_->renderer_type() == FlutterDesktopRendererType::kEvasGL) { + if (IsHeaded()) { + render_task_runner.struct_size = sizeof(FlutterTaskRunnerDescription); + render_task_runner.user_data = render_loop_.get(); + render_task_runner.runs_task_on_current_thread_callback = + [](void* data) -> bool { + return static_cast(data)->RunsTasksOnCurrentThread(); + }; + render_task_runner.post_task_callback = + [](FlutterTask task, uint64_t target_time_nanos, void* data) -> void { + static_cast(data)->PostTask(task, target_time_nanos); + }; + render_task_runner.identifier = kRenderTaskRunnerIdentifier; + custom_task_runners.render_task_runner = &render_task_runner; + } } -#endif FlutterProjectArgs args = {}; args.struct_size = sizeof(FlutterProjectArgs); @@ -198,13 +202,16 @@ bool FlutterTizenEngine::RunEngine() { args.update_semantics_node_callback = OnUpdateSemanticsNode; args.update_semantics_custom_action_callback = OnUpdateSemanticsCustomActions; #endif -#ifndef TIZEN_RENDERER_EVAS_GL - if (IsHeaded()) { - tizen_vsync_waiter_ = std::make_unique(this); - args.vsync_callback = [](void* user_data, intptr_t baton) -> void { - reinterpret_cast(user_data) - ->tizen_vsync_waiter_->AsyncWaitForVsync(baton); - }; + +#ifndef WEARABLE_PROFILE + if (project_->renderer_type() == FlutterDesktopRendererType::kEGL) { + if (IsHeaded()) { + tizen_vsync_waiter_ = std::make_unique(this); + args.vsync_callback = [](void* user_data, intptr_t baton) -> void { + reinterpret_cast(user_data) + ->tizen_vsync_waiter_->AsyncWaitForVsync(baton); + }; + } } #endif if (aot_data_) { @@ -263,8 +270,11 @@ bool FlutterTizenEngine::StopEngine() { plugin_registrar_destruction_callbacks_) { callback(registrar); } -#ifndef TIZEN_RENDERER_EVAS_GL - tizen_vsync_waiter_.reset(); + +#ifndef WEARABLE_PROFILE + if (project_->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..f862013e73742 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 @@ -97,6 +94,8 @@ class FlutterTizenEngine { TizenRenderer* renderer() { return renderer_.get(); } + FlutterProjectBundle* project() { return project_.get(); } + AppControlChannel* app_control_channel() { return app_control_channel_.get(); } @@ -279,14 +278,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..fccb9038edbd2 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -7,8 +7,12 @@ #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_pixel_egl.h" +#include "flutter/shell/platform/tizen/external_texture_surface_egl.h" +#endif +#include "flutter/shell/platform/tizen/external_texture_pixel_evas_gl.h" +#include "flutter/shell/platform/tizen/external_texture_surface_evas_gl.h" #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" #include "flutter/shell/platform/tizen/logger.h" @@ -40,7 +44,7 @@ int64_t FlutterTizenTextureRegistrar::RegisterTexture( } } std::unique_ptr texture_gl = - CreateExternalTexture(texture_info); + CreateExternalTexture(texture_info, engine_->project()->renderer_type()); int64_t texture_id = texture_gl->TextureId(); { @@ -88,13 +92,25 @@ 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( + if (FlutterDesktopRendererType::kEvasGL == renderer_type) { + return std::make_unique( + texture_info->pixel_buffer_config.callback, + texture_info->pixel_buffer_config.user_data); + break; + } +#ifndef WEARABLE_PROFILE + return std::make_unique( texture_info->pixel_buffer_config.callback, texture_info->pixel_buffer_config.user_data); break; +#else + return nullptr; +#endif + break; case kFlutterDesktopGpuBufferTexture: ExternalTextureExtensionType gl_extension = ExternalTextureExtensionType::kNone; @@ -105,9 +121,18 @@ FlutterTizenTextureRegistrar::CreateExternalTexture( "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); +#else + return nullptr; +#endif break; } } 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/public/flutter_tizen.h b/shell/platform/tizen/public/flutter_tizen.h index 1e7d41b934aa2..6be5e0cc5adb6 100644 --- a/shell/platform/tizen/public/flutter_tizen.h +++ b/shell/platform/tizen/public/flutter_tizen.h @@ -51,6 +51,13 @@ typedef struct { int32_t height; } FlutterDesktopViewProperties; +typedef enum { + // The renderer based on EvasGL. + kEvasGL, + // The renderer based on EGL. + kEGL, +} FlutterDesktopRendererType; + // Properties for configuring a Flutter engine instance. typedef struct { // The path to the flutter_assets folder for the application to be run. @@ -74,6 +81,8 @@ typedef struct { // Array of Dart entrypoint arguments. This is deep copied during the call // to FlutterDesktopRunEngine. const char** dart_entrypoint_argv; + // The renderer type of the engine. + FlutterDesktopRendererType renderer_type; } FlutterDesktopEngineProperties; // ========== Engine ========== 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_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" From 822170fb44444f7ac1cb808616b860b0b2cf5b13 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Wed, 13 Jul 2022 18:13:59 +0900 Subject: [PATCH 2/8] Move renderer create to view --- .../platform/tizen/flutter_project_bundle.cc | 2 - shell/platform/tizen/flutter_project_bundle.h | 5 --- shell/platform/tizen/flutter_tizen.cc | 5 +-- .../tizen/flutter_tizen_elementary.cc | 2 +- shell/platform/tizen/flutter_tizen_engine.cc | 37 ++++++++++--------- shell/platform/tizen/flutter_tizen_engine.h | 3 ++ .../tizen/flutter_tizen_texture_registrar.cc | 2 +- shell/platform/tizen/flutter_tizen_view.cc | 7 +++- shell/platform/tizen/flutter_tizen_view.h | 2 +- shell/platform/tizen/public/flutter_tizen.h | 18 ++++----- shell/platform/tizen/tizen_renderer.h | 6 +++ shell/platform/tizen/tizen_renderer_egl.cc | 4 +- .../platform/tizen/tizen_renderer_evas_gl.cc | 4 +- 13 files changed, 55 insertions(+), 42 deletions(-) diff --git a/shell/platform/tizen/flutter_project_bundle.cc b/shell/platform/tizen/flutter_project_bundle.cc index e013cc5a7d863..23ef6d2153b93 100644 --- a/shell/platform/tizen/flutter_project_bundle.cc +++ b/shell/platform/tizen/flutter_project_bundle.cc @@ -70,8 +70,6 @@ FlutterProjectBundle::FlutterProjectBundle( engine_arguments_.insert(engine_arguments_.end(), properties.switches, properties.switches + properties.switches_count); - - renderer_type_ = properties.renderer_type; } bool FlutterProjectBundle::HasValidPaths() { diff --git a/shell/platform/tizen/flutter_project_bundle.h b/shell/platform/tizen/flutter_project_bundle.h index 5a14f14b4581b..c167357af5768 100644 --- a/shell/platform/tizen/flutter_project_bundle.h +++ b/shell/platform/tizen/flutter_project_bundle.h @@ -67,9 +67,6 @@ class FlutterProjectBundle { return dart_entrypoint_arguments_; } - // Returns the renderer type. - FlutterDesktopRendererType renderer_type() { return renderer_type_; } - private: std::filesystem::path assets_path_; std::filesystem::path icu_path_; @@ -83,8 +80,6 @@ class FlutterProjectBundle { // Dart entrypoint arguments. std::vector dart_entrypoint_arguments_; - - FlutterDesktopRendererType renderer_type_; }; } // namespace flutter diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index 4a9c67898eb01..0f5a45ca8093b 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -200,8 +200,7 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( window_properties.height}; std::unique_ptr window = nullptr; - if (EngineFromHandle(engine)->project()->renderer_type() == - FlutterDesktopRendererType::kEvasGL) { + if (window_properties.renderer_type == FlutterDesktopRendererType::kEvasGL) { window = std::make_unique( window_geometry, window_properties.transparent, window_properties.focusable, window_properties.top_level); @@ -220,7 +219,7 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( // Take ownership of the engine, starting it if necessary. view->SetEngine( std::unique_ptr(EngineFromHandle(engine))); - view->CreateRenderSurface(); + view->CreateRenderSurface(window_properties.renderer_type); if (!view->engine()->IsRunning()) { if (!view->engine()->RunEngine()) { return nullptr; diff --git a/shell/platform/tizen/flutter_tizen_elementary.cc b/shell/platform/tizen/flutter_tizen_elementary.cc index 044674057ba5a..187e1e7a4c665 100644 --- a/shell/platform/tizen/flutter_tizen_elementary.cc +++ b/shell/platform/tizen/flutter_tizen_elementary.cc @@ -36,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 f0e08deabdf1c..7bd13cdda0288 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -64,7 +64,22 @@ FlutterTizenEngine::FlutterTizenEngine(const FlutterProjectBundle& project) } }); - if (project_->renderer_type() == FlutterDesktopRendererType::kEvasGL) { + messenger_ = std::make_unique(); + messenger_->engine = this; + message_dispatcher_ = + std::make_unique(messenger_.get()); + + plugin_registrar_ = std::make_unique(); + plugin_registrar_->engine = this; +} + +FlutterTizenEngine::~FlutterTizenEngine() { + StopEngine(); +} + +void FlutterTizenEngine::CreateRenderer( + FlutterDesktopRendererType renderer_type) { + if (renderer_type == FlutterDesktopRendererType::kEvasGL) { renderer_ = std::make_unique(); } #ifndef WEARABLE_PROFILE @@ -73,7 +88,7 @@ FlutterTizenEngine::FlutterTizenEngine(const FlutterProjectBundle& project) } #endif - if (project_->renderer_type() == FlutterDesktopRendererType::kEvasGL) { + if (renderer_type == FlutterDesktopRendererType::kEvasGL) { render_loop_ = std::make_unique( std::this_thread::get_id(), // main thread embedder_api_.GetCurrentTime, @@ -84,18 +99,6 @@ FlutterTizenEngine::FlutterTizenEngine(const FlutterProjectBundle& project) }, renderer_.get()); } - - messenger_ = std::make_unique(); - messenger_->engine = this; - message_dispatcher_ = - std::make_unique(messenger_.get()); - - plugin_registrar_ = std::make_unique(); - plugin_registrar_->engine = this; -} - -FlutterTizenEngine::~FlutterTizenEngine() { - StopEngine(); } bool FlutterTizenEngine::RunEngine() { @@ -157,7 +160,7 @@ bool FlutterTizenEngine::RunEngine() { custom_task_runners.platform_task_runner = &platform_task_runner; FlutterTaskRunnerDescription render_task_runner = {}; - if (project_->renderer_type() == FlutterDesktopRendererType::kEvasGL) { + if (renderer_->type() == FlutterDesktopRendererType::kEvasGL) { if (IsHeaded()) { render_task_runner.struct_size = sizeof(FlutterTaskRunnerDescription); render_task_runner.user_data = render_loop_.get(); @@ -204,7 +207,7 @@ bool FlutterTizenEngine::RunEngine() { #endif #ifndef WEARABLE_PROFILE - if (project_->renderer_type() == FlutterDesktopRendererType::kEGL) { + if (renderer_->type() == FlutterDesktopRendererType::kEGL) { if (IsHeaded()) { tizen_vsync_waiter_ = std::make_unique(this); args.vsync_callback = [](void* user_data, intptr_t baton) -> void { @@ -272,7 +275,7 @@ bool FlutterTizenEngine::StopEngine() { } #ifndef WEARABLE_PROFILE - if (project_->renderer_type() == FlutterDesktopRendererType::kEGL) { + if (renderer_->type() == FlutterDesktopRendererType::kEGL) { tizen_vsync_waiter_.reset(); } #endif diff --git a/shell/platform/tizen/flutter_tizen_engine.h b/shell/platform/tizen/flutter_tizen_engine.h index f862013e73742..90d9ae3afc5c4 100644 --- a/shell/platform/tizen/flutter_tizen_engine.h +++ b/shell/platform/tizen/flutter_tizen_engine.h @@ -59,6 +59,9 @@ class FlutterTizenEngine { FlutterTizenEngine(FlutterTizenEngine const&) = delete; FlutterTizenEngine& operator=(FlutterTizenEngine const&) = delete; + // Creates a gl renderer from the given types. + void CreateRenderer(FlutterDesktopRendererType renderer_type); + // Starts running the engine with the given entrypoint. If null, defaults to // main(). // diff --git a/shell/platform/tizen/flutter_tizen_texture_registrar.cc b/shell/platform/tizen/flutter_tizen_texture_registrar.cc index fccb9038edbd2..fb95102422f0d 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -44,7 +44,7 @@ int64_t FlutterTizenTextureRegistrar::RegisterTexture( } } std::unique_ptr texture_gl = - CreateExternalTexture(texture_info, engine_->project()->renderer_type()); + CreateExternalTexture(texture_info, engine_->renderer()->type()); int64_t texture_id = texture_gl->TextureId(); { 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 6be5e0cc5adb6..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. @@ -51,13 +60,6 @@ typedef struct { int32_t height; } FlutterDesktopViewProperties; -typedef enum { - // The renderer based on EvasGL. - kEvasGL, - // The renderer based on EGL. - kEGL, -} FlutterDesktopRendererType; - // Properties for configuring a Flutter engine instance. typedef struct { // The path to the flutter_assets folder for the application to be run. @@ -81,8 +83,6 @@ typedef struct { // Array of Dart entrypoint arguments. This is deep copied during the call // to FlutterDesktopRunEngine. const char** dart_entrypoint_argv; - // The renderer type of the engine. - FlutterDesktopRendererType renderer_type; } FlutterDesktopEngineProperties; // ========== Engine ========== 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..3eb3822c6ddd4 100644 --- a/shell/platform/tizen/tizen_renderer_evas_gl.cc +++ b/shell/platform/tizen/tizen_renderer_evas_gl.cc @@ -15,7 +15,9 @@ EVAS_GL_GLOBAL_GLES2_DEFINE(); namespace flutter { -TizenRendererEvasGL::TizenRendererEvasGL() {} +TizenRendererEvasGL::TizenRendererEvasGL() { + type_ = FlutterDesktopRendererType::kEvasGL; +} TizenRendererEvasGL::~TizenRendererEvasGL() { DestroySurface(); From 6153c0c8d3df0d83afaa5cb996a70f0b6b6ba894 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 14 Jul 2022 14:15:58 +0900 Subject: [PATCH 3/8] Remove flutter_tizen_ecore.cc and use c++ cast --- shell/platform/tizen/BUILD.gn | 5 ++--- shell/platform/tizen/channels/window_channel.cc | 2 -- shell/platform/tizen/external_texture_pixel_egl.cc | 6 +++--- .../platform/tizen/external_texture_pixel_evas_gl.cc | 6 +++--- shell/platform/tizen/external_texture_surface_egl.cc | 10 ++++++---- .../tizen/external_texture_surface_evas_gl.cc | 10 ++++++---- shell/platform/tizen/flutter_tizen_ecore.cc | 12 ------------ shell/platform/tizen/flutter_tizen_engine.h | 2 -- .../tizen/flutter_tizen_texture_registrar.cc | 2 +- 9 files changed, 21 insertions(+), 34 deletions(-) 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 9056ec8c9d3ea..b3f44de680aac 100644 --- a/shell/platform/tizen/BUILD.gn +++ b/shell/platform/tizen/BUILD.gn @@ -88,8 +88,8 @@ config("rootstrap_include_dirs") { # Template for the embedder build. Used to generate embedders for different # device profiles. # -# If target profile is wearable, only the Evas_GL renderer is used, -# otherwise the Evas_GL and the Ecore_Wl2 renderers are 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, [ @@ -192,7 +192,6 @@ template("embedder") { sources += [ "external_texture_pixel_egl.cc", "external_texture_surface_egl.cc", - "flutter_tizen_ecore.cc", "tizen_renderer_egl.cc", "tizen_vsync_waiter.cc", "tizen_window_ecore_wl2.cc", diff --git a/shell/platform/tizen/channels/window_channel.cc b/shell/platform/tizen/channels/window_channel.cc index 806591dfa1e1f..0eacdfc8d2d91 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -43,8 +43,6 @@ void WindowChannel::HandleMethodCall( map[EncodableValue("height")] = EncodableValue(geometry.height); result->Success(EncodableValue(map)); } else if (method_name == "setWindowGeometry") { - FT_LOG(Error) << "setWindowGeometry is not supported on Evas GL."; - result->NotImplemented(); #ifndef WEARABLE_PROFILE const auto* arguments = std::get_if(method_call.arguments()); if (!arguments) { diff --git a/shell/platform/tizen/external_texture_pixel_egl.cc b/shell/platform/tizen/external_texture_pixel_egl.cc index 2e1eb4a0b1637..997c5cb3d2b54 100644 --- a/shell/platform/tizen/external_texture_pixel_egl.cc +++ b/shell/platform/tizen/external_texture_pixel_egl.cc @@ -52,14 +52,14 @@ bool ExternalTexturePixelEGL::CopyPixelBuffer(size_t& width, size_t& height) { height = pixel_buffer->height; if (state_->gl_texture == 0) { - glGenTextures(1, (GLuint*)&state_->gl_texture); - glBindTexture(GL_TEXTURE_2D, (GLuint)state_->gl_texture); + glGenTextures(1, static_cast(&state_->gl_texture)); + glBindTexture(GL_TEXTURE_2D, static_cast(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, (GLuint)state_->gl_texture); + glBindTexture(GL_TEXTURE_2D, static_cast(state_->gl_texture)); } glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixel_buffer->width, pixel_buffer->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, diff --git a/shell/platform/tizen/external_texture_pixel_evas_gl.cc b/shell/platform/tizen/external_texture_pixel_evas_gl.cc index 6aa345af51820..10a68a0080c3f 100644 --- a/shell/platform/tizen/external_texture_pixel_evas_gl.cc +++ b/shell/platform/tizen/external_texture_pixel_evas_gl.cc @@ -53,14 +53,14 @@ bool ExternalTexturePixelEvasGL::CopyPixelBuffer(size_t& width, height = pixel_buffer->height; if (state_->gl_texture == 0) { - glGenTextures(1, (GLuint*)&state_->gl_texture); - glBindTexture(GL_TEXTURE_2D, (GLuint)state_->gl_texture); + glGenTextures(1, static_cast(&state_->gl_texture)); + glBindTexture(GL_TEXTURE_2D, static_cast(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, (GLuint)state_->gl_texture); + glBindTexture(GL_TEXTURE_2D, static_cast(state_->gl_texture)); } glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixel_buffer->width, pixel_buffer->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, diff --git a/shell/platform/tizen/external_texture_surface_egl.cc b/shell/platform/tizen/external_texture_surface_egl.cc index 4cbde19ad9c64..081d37ab25205 100644 --- a/shell/platform/tizen/external_texture_surface_egl.cc +++ b/shell/platform/tizen/external_texture_surface_egl.cc @@ -36,7 +36,7 @@ ExternalTextureSurfaceEGL::ExternalTextureSurfaceEGL( ExternalTextureSurfaceEGL::~ExternalTextureSurfaceEGL() { if (state_->gl_texture != 0) { - glDeleteTextures(1, (GLuint*)&state_->gl_texture); + glDeleteTextures(1, static_cast(&state_->gl_texture)); } state_.release(); } @@ -137,8 +137,9 @@ bool ExternalTextureSurfaceEGL::PopulateTexture( return false; } if (state_->gl_texture == 0) { - glGenTextures(1, (GLuint*)&state_->gl_texture); - glBindTexture(GL_TEXTURE_EXTERNAL_OES, (GLuint)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); @@ -148,7 +149,8 @@ bool ExternalTextureSurfaceEGL::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, (GLuint)state_->gl_texture); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, + static_cast(state_->gl_texture)); } PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES = reinterpret_cast( diff --git a/shell/platform/tizen/external_texture_surface_evas_gl.cc b/shell/platform/tizen/external_texture_surface_evas_gl.cc index 8ebc213c1ef78..8d56f40e09950 100644 --- a/shell/platform/tizen/external_texture_surface_evas_gl.cc +++ b/shell/platform/tizen/external_texture_surface_evas_gl.cc @@ -24,7 +24,7 @@ ExternalTextureSurfaceEvasGL::ExternalTextureSurfaceEvasGL( ExternalTextureSurfaceEvasGL::~ExternalTextureSurfaceEvasGL() { if (state_->gl_texture != 0) { - glDeleteTextures(1, (GLuint*)&(state_->gl_texture)); + glDeleteTextures(1, static_cast(&state_->gl_texture)); } state_.release(); } @@ -83,8 +83,9 @@ bool ExternalTextureSurfaceEvasGL::PopulateTexture( return false; } if (state_->gl_texture == 0) { - glGenTextures(1, (GLuint*)&state_->gl_texture); - glBindTexture(GL_TEXTURE_EXTERNAL_OES, (GLuint)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); @@ -94,7 +95,8 @@ bool ExternalTextureSurfaceEvasGL::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, (GLuint)state_->gl_texture); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, + static_cast(state_->gl_texture)); } glEvasGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, evasgl_src_image); if (evasgl_src_image) { diff --git a/shell/platform/tizen/flutter_tizen_ecore.cc b/shell/platform/tizen/flutter_tizen_ecore.cc deleted file mode 100644 index b43d510bfc7c0..0000000000000 --- a/shell/platform/tizen/flutter_tizen_ecore.cc +++ /dev/null @@ -1,12 +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 {} // namespace diff --git a/shell/platform/tizen/flutter_tizen_engine.h b/shell/platform/tizen/flutter_tizen_engine.h index 90d9ae3afc5c4..357d7a29c0a65 100644 --- a/shell/platform/tizen/flutter_tizen_engine.h +++ b/shell/platform/tizen/flutter_tizen_engine.h @@ -97,8 +97,6 @@ class FlutterTizenEngine { TizenRenderer* renderer() { return renderer_.get(); } - FlutterProjectBundle* project() { return project_.get(); } - AppControlChannel* app_control_channel() { return app_control_channel_.get(); } diff --git a/shell/platform/tizen/flutter_tizen_texture_registrar.cc b/shell/platform/tizen/flutter_tizen_texture_registrar.cc index fb95102422f0d..768f47e403e5c 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -103,7 +103,7 @@ FlutterTizenTextureRegistrar::CreateExternalTexture( break; } #ifndef WEARABLE_PROFILE - return std::make_unique( + return std::make_unique( texture_info->pixel_buffer_config.callback, texture_info->pixel_buffer_config.user_data); break; From 91cc7d1c1ea22eb9da87af0eb0c84529ac232881 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 14 Jul 2022 14:54:10 +0900 Subject: [PATCH 4/8] Add CreateRenderer call to engine unittest --- shell/platform/tizen/flutter_tizen_engine_unittest.cc | 4 ++++ .../tizen/flutter_tizen_texture_registrar_unittests.cc | 2 ++ 2 files changed, 6 insertions(+) diff --git a/shell/platform/tizen/flutter_tizen_engine_unittest.cc b/shell/platform/tizen/flutter_tizen_engine_unittest.cc index a6d6deea48284..53ddc6fba874f 100644 --- a/shell/platform/tizen/flutter_tizen_engine_unittest.cc +++ b/shell/platform/tizen/flutter_tizen_engine_unittest.cc @@ -94,6 +94,8 @@ TEST_F(FlutterTizenEngineTest, RunDoesExpectedInitialization) { return kSuccess; })); + engine_->CreateRenderer(FlutterDesktopRendererType::kEvasGL); + engine_->RunEngine(); EXPECT_TRUE(run_called); @@ -207,6 +209,8 @@ TEST_F(FlutterTizenEngineTest, AddPluginRegistrarDestructionCallback) { MOCK_ENGINE_PROC(SendPlatformMessage, ([](auto engine, auto message) { return kSuccess; })); + engine_->CreateRenderer(FlutterDesktopRendererType::kEvasGL); + engine_->RunEngine(); // Verify that destruction handlers don't overwrite each other. diff --git a/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc b/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc index 2c72a93822529..f7a9c2ade5219 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc +++ b/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc @@ -90,6 +90,8 @@ TEST_F(FlutterTizenTextureRegistrarTest, RegisterUnregisterTexture) { return kSuccess; })); + engine_->CreateRenderer(FlutterDesktopRendererType::kEvasGL); + int64_t texture_id = registrar.RegisterTexture(&texture_info); EXPECT_TRUE(register_called); EXPECT_NE(texture_id, -1); From 77c11fb117715776abb3b199a5e6cfb567209f2c Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Wed, 20 Jul 2022 13:42:56 +0900 Subject: [PATCH 5/8] Remove CreateRenderer in unittest --- .../platform/tizen/channels/window_channel.cc | 2 - shell/platform/tizen/external_texture.h | 1 - .../tizen/external_texture_pixel_egl.h | 1 - .../tizen/external_texture_pixel_evas_gl.h | 1 - .../tizen/external_texture_surface_egl.h | 1 - .../tizen/external_texture_surface_evas_gl.h | 1 - shell/platform/tizen/flutter_tizen.cc | 4 +- shell/platform/tizen/flutter_tizen_engine.cc | 58 +++++++++---------- shell/platform/tizen/flutter_tizen_engine.h | 2 +- .../tizen/flutter_tizen_engine_unittest.cc | 4 -- .../tizen/flutter_tizen_texture_registrar.cc | 6 +- ...utter_tizen_texture_registrar_unittests.cc | 2 - 12 files changed, 36 insertions(+), 47 deletions(-) diff --git a/shell/platform/tizen/channels/window_channel.cc b/shell/platform/tizen/channels/window_channel.cc index 0eacdfc8d2d91..a616a9630fc5b 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -43,7 +43,6 @@ void WindowChannel::HandleMethodCall( map[EncodableValue("height")] = EncodableValue(geometry.height); result->Success(EncodableValue(map)); } else if (method_name == "setWindowGeometry") { -#ifndef WEARABLE_PROFILE const auto* arguments = std::get_if(method_call.arguments()); if (!arguments) { result->Error("Invalid arguments"); @@ -62,7 +61,6 @@ void WindowChannel::HandleMethodCall( height ? *height : geometry.height, }); result->Success(); -#endif } 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 39c23bbc70269..10477a499f4f9 100644 --- a/shell/platform/tizen/external_texture.h +++ b/shell/platform/tizen/external_texture.h @@ -22,7 +22,6 @@ struct ExternalTextureGLState { 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_egl.h b/shell/platform/tizen/external_texture_pixel_egl.h index c8c35a2fbb4d6..16260b4190a80 100644 --- a/shell/platform/tizen/external_texture_pixel_egl.h +++ b/shell/platform/tizen/external_texture_pixel_egl.h @@ -11,7 +11,6 @@ namespace flutter { -// An adaptation class of flutter engine and external texture interface. class ExternalTexturePixelEGL : public ExternalTexture { public: ExternalTexturePixelEGL( diff --git a/shell/platform/tizen/external_texture_pixel_evas_gl.h b/shell/platform/tizen/external_texture_pixel_evas_gl.h index c4614beb4bc96..49fd2460df094 100644 --- a/shell/platform/tizen/external_texture_pixel_evas_gl.h +++ b/shell/platform/tizen/external_texture_pixel_evas_gl.h @@ -11,7 +11,6 @@ namespace flutter { -// An adaptation class of flutter engine and external texture interface. class ExternalTexturePixelEvasGL : public ExternalTexture { public: ExternalTexturePixelEvasGL( diff --git a/shell/platform/tizen/external_texture_surface_egl.h b/shell/platform/tizen/external_texture_surface_egl.h index ba90e002784ad..ee9d0c17c8c8c 100644 --- a/shell/platform/tizen/external_texture_surface_egl.h +++ b/shell/platform/tizen/external_texture_surface_egl.h @@ -11,7 +11,6 @@ namespace flutter { -// An adaptation class of flutter engine and external texture interface. class ExternalTextureSurfaceEGL : public ExternalTexture { public: ExternalTextureSurfaceEGL( diff --git a/shell/platform/tizen/external_texture_surface_evas_gl.h b/shell/platform/tizen/external_texture_surface_evas_gl.h index 4473caaf793e2..f604f0ebc9e30 100644 --- a/shell/platform/tizen/external_texture_surface_evas_gl.h +++ b/shell/platform/tizen/external_texture_surface_evas_gl.h @@ -11,7 +11,6 @@ namespace flutter { -// An adaptation class of flutter engine and external texture interface. class ExternalTextureSurfaceEvasGL : public ExternalTexture { public: ExternalTextureSurfaceEvasGL( diff --git a/shell/platform/tizen/flutter_tizen.cc b/shell/platform/tizen/flutter_tizen.cc index 0f5a45ca8093b..c1778f79df54a 100644 --- a/shell/platform/tizen/flutter_tizen.cc +++ b/shell/platform/tizen/flutter_tizen.cc @@ -14,7 +14,9 @@ #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 { @@ -199,7 +201,7 @@ FlutterDesktopViewRef FlutterDesktopViewCreateFromNewWindow( window_properties.x, window_properties.y, window_properties.width, window_properties.height}; - std::unique_ptr window = nullptr; + std::unique_ptr window; if (window_properties.renderer_type == FlutterDesktopRendererType::kEvasGL) { window = std::make_unique( window_geometry, window_properties.transparent, diff --git a/shell/platform/tizen/flutter_tizen_engine.cc b/shell/platform/tizen/flutter_tizen_engine.cc index 7bd13cdda0288..f92170f8c2ac7 100644 --- a/shell/platform/tizen/flutter_tizen_engine.cc +++ b/shell/platform/tizen/flutter_tizen_engine.cc @@ -53,6 +53,7 @@ FlutterTizenEngine::FlutterTizenEngine(const FlutterProjectBundle& project) aot_data_(nullptr, nullptr) { embedder_api_.struct_size = sizeof(FlutterEngineProcTable); FlutterEngineGetProcAddresses(&embedder_api_); + // Run flutter task on Tizen main loop. // Tizen engine has four threads (GPU thread, UI thread, IO thread, platform // thread). UI threads need to send flutter task to platform thread. @@ -81,14 +82,7 @@ void FlutterTizenEngine::CreateRenderer( FlutterDesktopRendererType renderer_type) { if (renderer_type == FlutterDesktopRendererType::kEvasGL) { renderer_ = std::make_unique(); - } -#ifndef WEARABLE_PROFILE - else { - renderer_ = std::make_unique(); - } -#endif - if (renderer_type == FlutterDesktopRendererType::kEvasGL) { render_loop_ = std::make_unique( std::this_thread::get_id(), // main thread embedder_api_.GetCurrentTime, @@ -99,6 +93,11 @@ void FlutterTizenEngine::CreateRenderer( }, renderer_.get()); } +#ifndef WEARABLE_PROFILE + else { + renderer_ = std::make_unique(); + } +#endif } bool FlutterTizenEngine::RunEngine() { @@ -160,21 +159,20 @@ bool FlutterTizenEngine::RunEngine() { custom_task_runners.platform_task_runner = &platform_task_runner; FlutterTaskRunnerDescription render_task_runner = {}; - if (renderer_->type() == FlutterDesktopRendererType::kEvasGL) { - if (IsHeaded()) { - render_task_runner.struct_size = sizeof(FlutterTaskRunnerDescription); - render_task_runner.user_data = render_loop_.get(); - render_task_runner.runs_task_on_current_thread_callback = - [](void* data) -> bool { - return static_cast(data)->RunsTasksOnCurrentThread(); - }; - render_task_runner.post_task_callback = - [](FlutterTask task, uint64_t target_time_nanos, void* data) -> void { - static_cast(data)->PostTask(task, target_time_nanos); - }; - render_task_runner.identifier = kRenderTaskRunnerIdentifier; - custom_task_runners.render_task_runner = &render_task_runner; - } + + 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 = + [](void* data) -> bool { + return static_cast(data)->RunsTasksOnCurrentThread(); + }; + render_task_runner.post_task_callback = + [](FlutterTask task, uint64_t target_time_nanos, void* data) -> void { + static_cast(data)->PostTask(task, target_time_nanos); + }; + render_task_runner.identifier = kRenderTaskRunnerIdentifier; + custom_task_runners.render_task_runner = &render_task_runner; } FlutterProjectArgs args = {}; @@ -207,14 +205,12 @@ bool FlutterTizenEngine::RunEngine() { #endif #ifndef WEARABLE_PROFILE - if (renderer_->type() == FlutterDesktopRendererType::kEGL) { - if (IsHeaded()) { - tizen_vsync_waiter_ = std::make_unique(this); - args.vsync_callback = [](void* user_data, intptr_t baton) -> void { - reinterpret_cast(user_data) - ->tizen_vsync_waiter_->AsyncWaitForVsync(baton); - }; - } + 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) + ->tizen_vsync_waiter_->AsyncWaitForVsync(baton); + }; } #endif if (aot_data_) { @@ -275,7 +271,7 @@ bool FlutterTizenEngine::StopEngine() { } #ifndef WEARABLE_PROFILE - if (renderer_->type() == FlutterDesktopRendererType::kEGL) { + if (IsHeaded() && renderer_->type() == FlutterDesktopRendererType::kEGL) { tizen_vsync_waiter_.reset(); } #endif diff --git a/shell/platform/tizen/flutter_tizen_engine.h b/shell/platform/tizen/flutter_tizen_engine.h index 357d7a29c0a65..65dd970ca9a33 100644 --- a/shell/platform/tizen/flutter_tizen_engine.h +++ b/shell/platform/tizen/flutter_tizen_engine.h @@ -59,7 +59,7 @@ class FlutterTizenEngine { FlutterTizenEngine(FlutterTizenEngine const&) = delete; FlutterTizenEngine& operator=(FlutterTizenEngine const&) = delete; - // Creates a gl renderer from the given types. + // 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 diff --git a/shell/platform/tizen/flutter_tizen_engine_unittest.cc b/shell/platform/tizen/flutter_tizen_engine_unittest.cc index 53ddc6fba874f..a6d6deea48284 100644 --- a/shell/platform/tizen/flutter_tizen_engine_unittest.cc +++ b/shell/platform/tizen/flutter_tizen_engine_unittest.cc @@ -94,8 +94,6 @@ TEST_F(FlutterTizenEngineTest, RunDoesExpectedInitialization) { return kSuccess; })); - engine_->CreateRenderer(FlutterDesktopRendererType::kEvasGL); - engine_->RunEngine(); EXPECT_TRUE(run_called); @@ -209,8 +207,6 @@ TEST_F(FlutterTizenEngineTest, AddPluginRegistrarDestructionCallback) { MOCK_ENGINE_PROC(SendPlatformMessage, ([](auto engine, auto message) { return kSuccess; })); - engine_->CreateRenderer(FlutterDesktopRendererType::kEvasGL); - engine_->RunEngine(); // Verify that destruction handlers don't overwrite each other. diff --git a/shell/platform/tizen/flutter_tizen_texture_registrar.cc b/shell/platform/tizen/flutter_tizen_texture_registrar.cc index 768f47e403e5c..a5782fd1f730a 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -43,8 +43,12 @@ 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, engine_->renderer()->type()); + CreateExternalTexture(texture_info, renderer_type); int64_t texture_id = texture_gl->TextureId(); { diff --git a/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc b/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc index f7a9c2ade5219..2c72a93822529 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc +++ b/shell/platform/tizen/flutter_tizen_texture_registrar_unittests.cc @@ -90,8 +90,6 @@ TEST_F(FlutterTizenTextureRegistrarTest, RegisterUnregisterTexture) { return kSuccess; })); - engine_->CreateRenderer(FlutterDesktopRendererType::kEvasGL); - int64_t texture_id = registrar.RegisterTexture(&texture_info); EXPECT_TRUE(register_called); EXPECT_NE(texture_id, -1); From d06b6fa2db953e62fcd8b2f01b3fb27414db8082 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Wed, 20 Jul 2022 15:26:48 +0900 Subject: [PATCH 6/8] Remove texture pixel --- shell/platform/tizen/BUILD.gn | 2 - .../tizen/external_texture_pixel_egl.cc | 70 ------------------ .../tizen/external_texture_pixel_egl.h | 35 --------- .../tizen/external_texture_pixel_evas_gl.cc | 71 ------------------- .../tizen/external_texture_pixel_evas_gl.h | 35 --------- .../tizen/flutter_tizen_texture_registrar.cc | 27 +++---- ...utter_tizen_texture_registrar_unittests.cc | 8 +-- 7 files changed, 12 insertions(+), 236 deletions(-) delete mode 100644 shell/platform/tizen/external_texture_pixel_egl.cc delete mode 100644 shell/platform/tizen/external_texture_pixel_egl.h delete mode 100644 shell/platform/tizen/external_texture_pixel_evas_gl.cc delete mode 100644 shell/platform/tizen/external_texture_pixel_evas_gl.h diff --git a/shell/platform/tizen/BUILD.gn b/shell/platform/tizen/BUILD.gn index b3f44de680aac..7ba6921815728 100644 --- a/shell/platform/tizen/BUILD.gn +++ b/shell/platform/tizen/BUILD.gn @@ -115,7 +115,6 @@ template("embedder") { "channels/settings_channel.cc", "channels/text_input_channel.cc", "channels/window_channel.cc", - "external_texture_pixel_evas_gl.cc", "external_texture_surface_evas_gl.cc", "flutter_project_bundle.cc", "flutter_tizen.cc", @@ -190,7 +189,6 @@ template("embedder") { if (target_name != "flutter_tizen_wearable") { sources += [ - "external_texture_pixel_egl.cc", "external_texture_surface_egl.cc", "tizen_renderer_egl.cc", "tizen_vsync_waiter.cc", diff --git a/shell/platform/tizen/external_texture_pixel_egl.cc b/shell/platform/tizen/external_texture_pixel_egl.cc deleted file mode 100644 index 997c5cb3d2b54..0000000000000 --- a/shell/platform/tizen/external_texture_pixel_egl.cc +++ /dev/null @@ -1,70 +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_egl.h" - -#include -#include -#include - -namespace flutter { - -bool ExternalTexturePixelEGL::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; -} - -ExternalTexturePixelEGL::ExternalTexturePixelEGL( - FlutterDesktopPixelBufferTextureCallback texture_callback, - void* user_data) - : ExternalTexture(), - texture_callback_(texture_callback), - user_data_(user_data) {} - -bool ExternalTexturePixelEGL::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, static_cast(&state_->gl_texture)); - glBindTexture(GL_TEXTURE_2D, static_cast(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, static_cast(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_egl.h b/shell/platform/tizen/external_texture_pixel_egl.h deleted file mode 100644 index 16260b4190a80..0000000000000 --- a/shell/platform/tizen/external_texture_pixel_egl.h +++ /dev/null @@ -1,35 +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_EGL_H -#define EMBEDDER_EXTERNAL_TEXTURE_PIXEL_EGL_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 ExternalTexturePixelEGL : public ExternalTexture { - public: - ExternalTexturePixelEGL( - FlutterDesktopPixelBufferTextureCallback texture_callback, - void* user_data); - - ~ExternalTexturePixelEGL() = 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_EGL_H diff --git a/shell/platform/tizen/external_texture_pixel_evas_gl.cc b/shell/platform/tizen/external_texture_pixel_evas_gl.cc deleted file mode 100644 index 10a68a0080c3f..0000000000000 --- a/shell/platform/tizen/external_texture_pixel_evas_gl.cc +++ /dev/null @@ -1,71 +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_evas_gl.h" - -#include "tizen_evas_gl_helper.h" -extern Evas_GL* g_evas_gl; -EVAS_GL_GLOBAL_GLES2_DECLARE(); - -namespace flutter { - -bool ExternalTexturePixelEvasGL::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; -} - -ExternalTexturePixelEvasGL::ExternalTexturePixelEvasGL( - FlutterDesktopPixelBufferTextureCallback texture_callback, - void* user_data) - : ExternalTexture(), - texture_callback_(texture_callback), - user_data_(user_data) {} - -bool ExternalTexturePixelEvasGL::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, static_cast(&state_->gl_texture)); - glBindTexture(GL_TEXTURE_2D, static_cast(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, static_cast(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_evas_gl.h b/shell/platform/tizen/external_texture_pixel_evas_gl.h deleted file mode 100644 index 49fd2460df094..0000000000000 --- a/shell/platform/tizen/external_texture_pixel_evas_gl.h +++ /dev/null @@ -1,35 +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_EVAS_GL_H -#define EMBEDDER_EXTERNAL_TEXTURE_PIXEL_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 ExternalTexturePixelEvasGL : public ExternalTexture { - public: - ExternalTexturePixelEvasGL( - FlutterDesktopPixelBufferTextureCallback texture_callback, - void* user_data); - - ~ExternalTexturePixelEvasGL() = 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_EVAS_GL_H diff --git a/shell/platform/tizen/flutter_tizen_texture_registrar.cc b/shell/platform/tizen/flutter_tizen_texture_registrar.cc index a5782fd1f730a..0535c94b7a9a7 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -8,10 +8,8 @@ #include #ifndef WEARABLE_PROFILE -#include "flutter/shell/platform/tizen/external_texture_pixel_egl.h" #include "flutter/shell/platform/tizen/external_texture_surface_egl.h" #endif -#include "flutter/shell/platform/tizen/external_texture_pixel_evas_gl.h" #include "flutter/shell/platform/tizen/external_texture_surface_evas_gl.h" #include "flutter/shell/platform/tizen/flutter_tizen_engine.h" #include "flutter/shell/platform/tizen/logger.h" @@ -49,6 +47,10 @@ int64_t FlutterTizenTextureRegistrar::RegisterTexture( } std::unique_ptr texture_gl = CreateExternalTexture(texture_info, renderer_type); + if (!texture_gl) { + FT_LOG(Error) << "Failed to create ExternalTexture."; + return -1; + } int64_t texture_id = texture_gl->TextureId(); { @@ -100,28 +102,17 @@ FlutterTizenTextureRegistrar::CreateExternalTexture( FlutterDesktopRendererType renderer_type) { switch (texture_info->type) { case kFlutterDesktopPixelBufferTexture: - if (FlutterDesktopRendererType::kEvasGL == renderer_type) { - return std::make_unique( - texture_info->pixel_buffer_config.callback, - texture_info->pixel_buffer_config.user_data); - break; - } -#ifndef WEARABLE_PROFILE - return std::make_unique( - texture_info->pixel_buffer_config.callback, - texture_info->pixel_buffer_config.user_data); - break; -#else + FT_UNIMPLEMENTED(); return nullptr; -#endif break; 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; } 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; From e66fddcbdb01b7defeed3bee688870a70911dd23 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Wed, 20 Jul 2022 19:12:42 +0900 Subject: [PATCH 7/8] Change SetGeometry return type to bool --- shell/platform/tizen/channels/window_channel.cc | 17 ++++++++++------- .../tizen/flutter_tizen_texture_registrar.cc | 2 -- shell/platform/tizen/tizen_view_base.h | 2 +- shell/platform/tizen/tizen_view_elementary.cc | 3 ++- shell/platform/tizen/tizen_view_elementary.h | 2 +- shell/platform/tizen/tizen_window_ecore_wl2.cc | 3 ++- shell/platform/tizen/tizen_window_ecore_wl2.h | 2 +- shell/platform/tizen/tizen_window_elementary.cc | 6 +++--- shell/platform/tizen/tizen_window_elementary.h | 2 +- 9 files changed, 21 insertions(+), 18 deletions(-) diff --git a/shell/platform/tizen/channels/window_channel.cc b/shell/platform/tizen/channels/window_channel.cc index a616a9630fc5b..705facb224720 100644 --- a/shell/platform/tizen/channels/window_channel.cc +++ b/shell/platform/tizen/channels/window_channel.cc @@ -54,13 +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(); + 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/flutter_tizen_texture_registrar.cc b/shell/platform/tizen/flutter_tizen_texture_registrar.cc index 0535c94b7a9a7..628af06ff597c 100644 --- a/shell/platform/tizen/flutter_tizen_texture_registrar.cc +++ b/shell/platform/tizen/flutter_tizen_texture_registrar.cc @@ -104,7 +104,6 @@ FlutterTizenTextureRegistrar::CreateExternalTexture( case kFlutterDesktopPixelBufferTexture: FT_UNIMPLEMENTED(); return nullptr; - break; case kFlutterDesktopGpuBufferTexture: ExternalTextureExtensionType gl_extension = ExternalTextureExtensionType::kNone; @@ -128,7 +127,6 @@ FlutterTizenTextureRegistrar::CreateExternalTexture( #else return nullptr; #endif - break; } } 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; From af2e89b73f2f7c0bd9d4af89277720bfe6704137 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 22 Jul 2022 10:01:33 +0900 Subject: [PATCH 8/8] update g_evas_gl comment --- shell/platform/tizen/tizen_renderer_evas_gl.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shell/platform/tizen/tizen_renderer_evas_gl.cc b/shell/platform/tizen/tizen_renderer_evas_gl.cc index 3eb3822c6ddd4..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();