Skip to content

Commit b12b8d4

Browse files
swift-kimbbrto21bwikbs
committed
Cherry-pick "Enable Evas GL direct mode (#54)"
- Cherry-pick the commit from flutter-2.0.1-tizen-dev - Rename FLUTTER_TIZEN_EVASGL with TIZEN_RENDERER_EVAS_GL - Add missing switches and fix build errors Co-authored-by: Boram Bae <[email protected]> Co-authored-by: MuHong Byun <[email protected]>
1 parent 4a4181a commit b12b8d4

12 files changed

+1065
-103
lines changed

shell/common/animator.cc

+8-5
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,14 @@ Animator::Animator(Delegate& delegate,
3535
// TODO(dnfield): We should remove this logic and set the pipeline depth
3636
// back to 2 in this case. See
3737
// https://github.com/flutter/engine/pull/9132 for discussion.
38-
layer_tree_pipeline_(fml::MakeRefCounted<LayerTreePipeline>(
39-
task_runners.GetPlatformTaskRunner() ==
40-
task_runners.GetRasterTaskRunner()
41-
? 1
42-
: 2)),
38+
// layer_tree_pipeline_(fml::MakeRefCounted<LayerTreePipeline>(
39+
// task_runners.GetPlatformTaskRunner() ==
40+
// task_runners.GetRasterTaskRunner()
41+
// ? 1
42+
// : 2)),
43+
// FIXME(bbrto21): This is a workaround to avoid flickering that occurs
44+
// in evas gl direct mode.
45+
layer_tree_pipeline_(fml::MakeRefCounted<LayerTreePipeline>(1)),
4346
#endif // SHELL_ENABLE_METAL
4447
pending_frame_semaphore_(1),
4548
frame_number_(1),

shell/platform/tizen/BUILD.gn

+42-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
22
# Use of this source code is governed by a BSD-style license that can be
33
# found in the LICENSE file.
4+
45
import("//flutter/shell/platform/common/cpp/client_wrapper/publish.gni")
56
import("//flutter/shell/platform/tizen/config.gni")
67

@@ -52,15 +53,34 @@ config("tizen_rootstrap_include_dirs") {
5253
"$custom_sysroot/usr/include/eo-1",
5354
"$custom_sysroot/usr/include/evas-1",
5455
"$custom_sysroot/usr/include/system",
55-
"$custom_sysroot/usr/include/wayland-extension"
56+
"$custom_sysroot/usr/include/wayland-extension",
57+
# For Evas_GL.
58+
"$custom_sysroot/usr/include/ecore-con-1",
59+
"$custom_sysroot/usr/include/ecore-file-1",
60+
"$custom_sysroot/usr/include/edje-1",
61+
"$custom_sysroot/usr/include/eet-1",
62+
"$custom_sysroot/usr/include/efl-1/interfaces",
63+
"$custom_sysroot/usr/include/efreet-1",
64+
"$custom_sysroot/usr/include/elementary-1",
65+
"$custom_sysroot/usr/include/ethumb-1",
66+
"$custom_sysroot/usr/include/ethumb-client-1",
5667
]
5768

5869
lib_dirs = [ "$custom_sysroot/usr/lib" ]
5970
}
6071

6172
# Template for the embedder build. Used to generate embedders for different
6273
# device profiles. The output library name is "flutter_tizen_[profile]".
74+
#
75+
# If use_evas_gl_renderer is provided as true, the Evas_GL renderer is used,
76+
# otherwise the Ecore_Wl2 renderer is used.
6377
template("embedder_for_profile") {
78+
forward_variables_from(invoker, [ "use_evas_gl_renderer" ])
79+
80+
if (!defined(use_evas_gl_renderer)) {
81+
use_evas_gl_renderer = false
82+
}
83+
6484
shared_library("flutter_tizen_${target_name}") {
6585
public = _public_headers
6686

@@ -80,7 +100,6 @@ template("embedder_for_profile") {
80100
"tizen_event_loop.cc",
81101
"tizen_log.cc",
82102
"tizen_renderer.cc",
83-
"tizen_vsync_waiter.cc",
84103
"touch_event_handler.cc",
85104
]
86105

@@ -104,6 +123,24 @@ template("embedder_for_profile") {
104123

105124
defines = invoker.defines
106125

126+
if (use_evas_gl_renderer) {
127+
sources += [ "tizen_renderer_evas_gl.cc" ]
128+
129+
libs += [
130+
"ecore_evas",
131+
"elementary",
132+
]
133+
134+
defines += [ "TIZEN_RENDERER_EVAS_GL" ]
135+
} else {
136+
sources += [
137+
"tizen_renderer_ecore_wl2.cc",
138+
"tizen_vsync_waiter.cc",
139+
]
140+
141+
libs += [ "ecore_wl2" ]
142+
}
143+
107144
cflags_cc = [
108145
"-Wno-newline-eof",
109146
"-Wno-macro-redefined",
@@ -125,10 +162,6 @@ template("embedder_for_profile") {
125162
"//flutter/shell/platform/common/cpp/client_wrapper:client_wrapper",
126163
"//third_party/rapidjson",
127164
]
128-
129-
sources += [ "tizen_renderer_ecore_wl2.cc" ]
130-
131-
libs += [ "ecore_wl2" ]
132165
}
133166
}
134167

@@ -138,6 +171,8 @@ embedder_for_profile("mobile") {
138171

139172
embedder_for_profile("wearable") {
140173
defines = [ "WEARABLE_PROFILE" ]
174+
175+
use_evas_gl_renderer = true
141176
}
142177

143178
embedder_for_profile("tv") {
@@ -181,6 +216,6 @@ group("tizen") {
181216
":flutter_tizen_common",
182217
":publish_cpp_client_wrapper",
183218
":publish_headers_tizen",
184-
":copy_icu"
219+
":copy_icu",
185220
]
186221
}

shell/platform/tizen/channels/text_input_channel.cc

+7-63
Original file line numberDiff line numberDiff line change
@@ -202,61 +202,6 @@ Ecore_IMF_Keyboard_Locks EcoreInputModifierToEcoreIMFLock(
202202
return static_cast<Ecore_IMF_Keyboard_Locks>(lock);
203203
}
204204

205-
Ecore_IMF_Device_Class EoreDeviceClassToEcoreIMFDeviceClass(
206-
Ecore_Device_Class ecoreDeviceClass) {
207-
switch (ecoreDeviceClass) {
208-
case ECORE_DEVICE_CLASS_SEAT:
209-
return ECORE_IMF_DEVICE_CLASS_SEAT;
210-
case ECORE_DEVICE_CLASS_KEYBOARD:
211-
return ECORE_IMF_DEVICE_CLASS_KEYBOARD;
212-
case ECORE_DEVICE_CLASS_MOUSE:
213-
return ECORE_IMF_DEVICE_CLASS_MOUSE;
214-
case ECORE_DEVICE_CLASS_TOUCH:
215-
return ECORE_IMF_DEVICE_CLASS_TOUCH;
216-
case ECORE_DEVICE_CLASS_PEN:
217-
return ECORE_IMF_DEVICE_CLASS_PEN;
218-
case ECORE_DEVICE_CLASS_POINTER:
219-
return ECORE_IMF_DEVICE_CLASS_POINTER;
220-
case ECORE_DEVICE_CLASS_GAMEPAD:
221-
return ECORE_IMF_DEVICE_CLASS_GAMEPAD;
222-
case ECORE_DEVICE_CLASS_NONE:
223-
default:
224-
return ECORE_IMF_DEVICE_CLASS_NONE;
225-
}
226-
}
227-
228-
Ecore_IMF_Device_Subclass EoreDeviceSubClassToEcoreIMFDeviceSubClass(
229-
Ecore_Device_Subclass ecoreDeviceSubclass) {
230-
switch (ecoreDeviceSubclass) {
231-
case ECORE_DEVICE_SUBCLASS_FINGER:
232-
return ECORE_IMF_DEVICE_SUBCLASS_FINGER;
233-
case ECORE_DEVICE_SUBCLASS_FINGERNAIL:
234-
return ECORE_IMF_DEVICE_SUBCLASS_FINGERNAIL;
235-
case ECORE_DEVICE_SUBCLASS_KNUCKLE:
236-
return ECORE_IMF_DEVICE_SUBCLASS_KNUCKLE;
237-
case ECORE_DEVICE_SUBCLASS_PALM:
238-
return ECORE_IMF_DEVICE_SUBCLASS_PALM;
239-
case ECORE_DEVICE_SUBCLASS_HAND_SIZE:
240-
return ECORE_IMF_DEVICE_SUBCLASS_HAND_SIZE;
241-
case ECORE_DEVICE_SUBCLASS_HAND_FLAT:
242-
return ECORE_IMF_DEVICE_SUBCLASS_HAND_FLAT;
243-
case ECORE_DEVICE_SUBCLASS_PEN_TIP:
244-
return ECORE_IMF_DEVICE_SUBCLASS_PEN_TIP;
245-
case ECORE_DEVICE_SUBCLASS_TRACKPAD:
246-
return ECORE_IMF_DEVICE_SUBCLASS_TRACKPAD;
247-
case ECORE_DEVICE_SUBCLASS_TRACKPOINT:
248-
return ECORE_IMF_DEVICE_SUBCLASS_TRACKPOINT;
249-
case ECORE_DEVICE_SUBCLASS_TRACKBALL:
250-
return ECORE_IMF_DEVICE_SUBCLASS_TRACKBALL;
251-
case ECORE_DEVICE_SUBCLASS_REMOCON:
252-
case ECORE_DEVICE_SUBCLASS_VIRTUAL_KEYBOARD:
253-
// FT_LOGW("There is no corresponding type");
254-
case ECORE_DEVICE_SUBCLASS_NONE:
255-
default:
256-
return ECORE_IMF_DEVICE_SUBCLASS_NONE;
257-
}
258-
}
259-
260205
TextInputChannel::TextInputChannel(flutter::BinaryMessenger* messenger,
261206
TizenEmbedderEngine* engine)
262207
: channel_(std::make_unique<flutter::MethodChannel<rapidjson::Document>>(
@@ -418,7 +363,8 @@ void TextInputChannel::SendStateUpdate(const flutter::TextInputModel& model) {
418363

419364
bool TextInputChannel::FilterEvent(Ecore_Event_Key* keyDownEvent) {
420365
bool handled = false;
421-
const char* device = ecore_device_name_get(keyDownEvent->dev);
366+
bool isIME = ecore_imf_context_keyboard_mode_get(imf_context_) ==
367+
ECORE_IMF_INPUT_PANEL_SW_KEYBOARD_MODE;
422368

423369
Ecore_IMF_Event_Key_Down ecoreKeyDownEvent;
424370
ecoreKeyDownEvent.keyname = keyDownEvent->keyname;
@@ -430,15 +376,13 @@ bool TextInputChannel::FilterEvent(Ecore_Event_Key* keyDownEvent) {
430376
EcoreInputModifierToEcoreIMFModifier(keyDownEvent->modifiers);
431377
ecoreKeyDownEvent.locks =
432378
EcoreInputModifierToEcoreIMFLock(keyDownEvent->modifiers);
433-
ecoreKeyDownEvent.dev_name = device;
434-
ecoreKeyDownEvent.dev_class = EoreDeviceClassToEcoreIMFDeviceClass(
435-
ecore_device_class_get(keyDownEvent->dev));
436-
ecoreKeyDownEvent.dev_subclass = EoreDeviceSubClassToEcoreIMFDeviceSubClass(
437-
ecore_device_subclass_get(keyDownEvent->dev));
379+
if (isIME) {
380+
ecoreKeyDownEvent.dev_name = "ime";
381+
} else {
382+
ecoreKeyDownEvent.dev_name = "";
383+
}
438384
ecoreKeyDownEvent.keycode = keyDownEvent->keycode;
439385

440-
bool isIME = strcmp(device, "ime") == 0;
441-
442386
if (isIME && strcmp(keyDownEvent->key, "Select") == 0) {
443387
if (engine_->device_profile == DeviceProfile::kWearable) {
444388
// FIXME: for wearable

shell/platform/tizen/external_texture_gl.cc

+53-10
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,20 @@
44

55
#include "external_texture_gl.h"
66

7+
#ifdef TIZEN_RENDERER_EVAS_GL
8+
#undef EFL_BETA_API_SUPPORT
9+
#include <Ecore.h>
10+
#include <Elementary.h>
11+
#include <Evas_GL_GLES3_Helpers.h>
12+
extern Evas_GL* g_evas_gl;
13+
EVAS_GL_GLOBAL_GLES3_DECLARE();
14+
#else
715
#include <EGL/egl.h>
816
#include <EGL/eglext.h>
917
#include <GLES2/gl2.h>
1018
#include <GLES2/gl2ext.h>
1119
#include <GLES3/gl32.h>
20+
#endif
1221

1322
#include <atomic>
1423
#include <iostream>
@@ -48,13 +57,13 @@ bool ExternalTextureGL::OnFrameAvailable(tbm_surface_h tbm_surface) {
4857
mutex_.unlock();
4958
return false;
5059
}
51-
if (!tbm_surface_internal_is_valid(tbm_surface)) {
60+
tbm_surface_info_s info;
61+
if (tbm_surface_get_info(tbm_surface, &info) != TBM_SURFACE_ERROR_NONE) {
5262
FT_LOGD("tbm_surface not valid, pass");
5363
mutex_.unlock();
5464
return false;
5565
}
5666
texture_tbm_surface_ = tbm_surface;
57-
tbm_surface_internal_ref(texture_tbm_surface_);
5867
mutex_.unlock();
5968
return true;
6069
}
@@ -67,22 +76,54 @@ bool ExternalTextureGL::PopulateTextureWithIdentifier(
6776
mutex_.unlock();
6877
return false;
6978
}
70-
if (!tbm_surface_internal_is_valid(texture_tbm_surface_)) {
79+
tbm_surface_info_s info;
80+
if (tbm_surface_get_info(texture_tbm_surface_, &info) !=
81+
TBM_SURFACE_ERROR_NONE) {
7182
FT_LOGD("tbm_surface not valid");
7283
DestructionTbmSurface();
7384
mutex_.unlock();
7485
return false;
7586
}
7687

88+
#ifdef TIZEN_RENDERER_EVAS_GL
89+
int eglImgAttr[] = {EVAS_GL_IMAGE_PRESERVED, GL_TRUE, 0};
90+
EvasGLImage egl_src_image = evasglCreateImageForContext(
91+
g_evas_gl, evas_gl_current_context_get(g_evas_gl),
92+
EVAS_GL_NATIVE_SURFACE_TIZEN, (void*)(intptr_t)texture_tbm_surface_,
93+
eglImgAttr);
94+
if (!egl_src_image) {
95+
// FT_LOGE("egl_src_image create fail!!, errorcode == %d", eglGetError());
96+
mutex_.unlock();
97+
return false;
98+
}
99+
if (state_->gl_texture == 0) {
100+
glGenTextures(1, &state_->gl_texture);
101+
glBindTexture(GL_TEXTURE_EXTERNAL_OES, state_->gl_texture);
102+
// set the texture wrapping parameters
103+
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S,
104+
GL_CLAMP_TO_BORDER);
105+
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T,
106+
GL_CLAMP_TO_BORDER);
107+
// set texture filtering parameters
108+
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
109+
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
110+
} else {
111+
glBindTexture(GL_TEXTURE_EXTERNAL_OES, state_->gl_texture);
112+
}
113+
glEvasGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, egl_src_image);
114+
if (egl_src_image) {
115+
evasglDestroyImage(egl_src_image);
116+
}
117+
#else
77118
PFNEGLCREATEIMAGEKHRPROC n_eglCreateImageKHR =
78119
(PFNEGLCREATEIMAGEKHRPROC)eglGetProcAddress("eglCreateImageKHR");
79120
const EGLint attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE,
80121
EGL_NONE};
81-
EGLImageKHR eglSrcImage = n_eglCreateImageKHR(
122+
EGLImageKHR egl_src_image = n_eglCreateImageKHR(
82123
eglGetCurrentDisplay(), EGL_NO_CONTEXT, EGL_NATIVE_SURFACE_TIZEN,
83124
(EGLClientBuffer)texture_tbm_surface_, attrs);
84-
if (!eglSrcImage) {
85-
FT_LOGE("eglSrcImage create fail!!, errorcode == %d", eglGetError());
125+
if (!egl_src_image) {
126+
FT_LOGE("egl_src_image create fail!!, errorcode == %d", eglGetError());
86127
mutex_.unlock();
87128
return false;
88129
}
@@ -103,12 +144,14 @@ bool ExternalTextureGL::PopulateTextureWithIdentifier(
103144
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES =
104145
(PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress(
105146
"glEGLImageTargetTexture2DOES");
106-
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, eglSrcImage);
107-
if (eglSrcImage) {
147+
glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, egl_src_image);
148+
if (egl_src_image) {
108149
PFNEGLDESTROYIMAGEKHRPROC n_eglDestoryImageKHR =
109150
(PFNEGLDESTROYIMAGEKHRPROC)eglGetProcAddress("eglDestroyImageKHR");
110-
n_eglDestoryImageKHR(eglGetCurrentDisplay(), eglSrcImage);
151+
n_eglDestoryImageKHR(eglGetCurrentDisplay(), egl_src_image);
111152
}
153+
#endif
154+
112155
opengl_texture->target = GL_TEXTURE_EXTERNAL_OES;
113156
opengl_texture->name = state_->gl_texture;
114157
opengl_texture->format = GL_RGBA8;
@@ -131,7 +174,7 @@ void ExternalTextureGL::DestructionTbmSurface() {
131174
FT_LOGE("tbm_surface_h is NULL");
132175
return;
133176
}
134-
tbm_surface_internal_unref(texture_tbm_surface_);
177+
tbm_surface_destroy(texture_tbm_surface_);
135178
texture_tbm_surface_ = NULL;
136179
}
137180

0 commit comments

Comments
 (0)