Skip to content

Commit 7c39f5f

Browse files
authored
Restore support for pixel buffer textures (#322)
* Organize build dependencies * Support pixel type external textures
1 parent 1ca5867 commit 7c39f5f

File tree

6 files changed

+230
-5
lines changed

6 files changed

+230
-5
lines changed

shell/platform/tizen/BUILD.gn

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ template("embedder") {
115115
"channels/settings_channel.cc",
116116
"channels/text_input_channel.cc",
117117
"channels/window_channel.cc",
118+
"external_texture_pixel_evas_gl.cc",
118119
"external_texture_surface_evas_gl.cc",
119120
"flutter_project_bundle.cc",
120121
"flutter_tizen.cc",
@@ -160,10 +161,7 @@ template("embedder") {
160161
"evas",
161162
"feedback",
162163
"tbm",
163-
"tdm-client",
164164
"wayland-client",
165-
"EGL",
166-
"GLESv2",
167165
]
168166

169167
if (target_name == "flutter_tizen_common") {
@@ -189,6 +187,7 @@ template("embedder") {
189187

190188
if (target_name != "flutter_tizen_wearable") {
191189
sources += [
190+
"external_texture_pixel_egl.cc",
192191
"external_texture_surface_egl.cc",
193192
"tizen_renderer_egl.cc",
194193
"tizen_vsync_waiter.cc",
@@ -197,7 +196,10 @@ template("embedder") {
197196

198197
libs += [
199198
"ecore_wl2",
199+
"tdm-client",
200200
"tizen-extension-client",
201+
"EGL",
202+
"GLESv2",
201203
]
202204
}
203205

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#include "external_texture_pixel_egl.h"
6+
7+
#include <EGL/egl.h>
8+
#include <EGL/eglext.h>
9+
#include <GLES3/gl32.h>
10+
11+
namespace flutter {
12+
13+
bool ExternalTexturePixelEGL::PopulateTexture(
14+
size_t width,
15+
size_t height,
16+
FlutterOpenGLTexture* opengl_texture) {
17+
if (!CopyPixelBuffer(width, height)) {
18+
return false;
19+
}
20+
21+
// Populate the texture object used by the engine.
22+
opengl_texture->target = GL_TEXTURE_2D;
23+
opengl_texture->name = state_->gl_texture;
24+
opengl_texture->format = GL_RGBA8;
25+
opengl_texture->destruction_callback = nullptr;
26+
opengl_texture->user_data = nullptr;
27+
opengl_texture->width = width;
28+
opengl_texture->height = height;
29+
return true;
30+
}
31+
32+
ExternalTexturePixelEGL::ExternalTexturePixelEGL(
33+
FlutterDesktopPixelBufferTextureCallback texture_callback,
34+
void* user_data)
35+
: ExternalTexture(),
36+
texture_callback_(texture_callback),
37+
user_data_(user_data) {}
38+
39+
bool ExternalTexturePixelEGL::CopyPixelBuffer(size_t& width, size_t& height) {
40+
if (!texture_callback_) {
41+
return false;
42+
}
43+
44+
const FlutterDesktopPixelBuffer* pixel_buffer =
45+
texture_callback_(width, height, user_data_);
46+
47+
if (!pixel_buffer || !pixel_buffer->buffer) {
48+
return false;
49+
}
50+
51+
width = pixel_buffer->width;
52+
height = pixel_buffer->height;
53+
54+
if (state_->gl_texture == 0) {
55+
glGenTextures(1, static_cast<GLuint*>(&state_->gl_texture));
56+
glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(state_->gl_texture));
57+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
58+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
59+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
60+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
61+
} else {
62+
glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(state_->gl_texture));
63+
}
64+
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixel_buffer->width,
65+
pixel_buffer->height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
66+
pixel_buffer->buffer);
67+
return true;
68+
}
69+
70+
} // namespace flutter
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#ifndef EMBEDDER_EXTERNAL_TEXTURE_PIXEL_EGL_H
6+
#define EMBEDDER_EXTERNAL_TEXTURE_PIXEL_EGL_H
7+
8+
#include "flutter/shell/platform/common/public/flutter_texture_registrar.h"
9+
#include "flutter/shell/platform/embedder/embedder.h"
10+
#include "flutter/shell/platform/tizen/external_texture.h"
11+
12+
namespace flutter {
13+
14+
class ExternalTexturePixelEGL : public ExternalTexture {
15+
public:
16+
ExternalTexturePixelEGL(
17+
FlutterDesktopPixelBufferTextureCallback texture_callback,
18+
void* user_data);
19+
20+
~ExternalTexturePixelEGL() = default;
21+
22+
bool PopulateTexture(size_t width,
23+
size_t height,
24+
FlutterOpenGLTexture* opengl_texture) override;
25+
26+
bool CopyPixelBuffer(size_t& width, size_t& height);
27+
28+
private:
29+
FlutterDesktopPixelBufferTextureCallback texture_callback_ = nullptr;
30+
void* user_data_ = nullptr;
31+
};
32+
33+
} // namespace flutter
34+
35+
#endif // EMBEDDER_EXTERNAL_TEXTURE_PIXEL_EGL_H
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#include "external_texture_pixel_evas_gl.h"
6+
7+
#include "tizen_evas_gl_helper.h"
8+
extern Evas_GL* g_evas_gl;
9+
EVAS_GL_GLOBAL_GLES2_DECLARE();
10+
11+
namespace flutter {
12+
13+
bool ExternalTexturePixelEvasGL::PopulateTexture(
14+
size_t width,
15+
size_t height,
16+
FlutterOpenGLTexture* opengl_texture) {
17+
if (!CopyPixelBuffer(width, height)) {
18+
return false;
19+
}
20+
21+
// Populate the texture object used by the engine.
22+
opengl_texture->target = GL_TEXTURE_2D;
23+
opengl_texture->name = state_->gl_texture;
24+
opengl_texture->format = GL_RGBA8;
25+
opengl_texture->destruction_callback = nullptr;
26+
opengl_texture->user_data = nullptr;
27+
opengl_texture->width = width;
28+
opengl_texture->height = height;
29+
return true;
30+
}
31+
32+
ExternalTexturePixelEvasGL::ExternalTexturePixelEvasGL(
33+
FlutterDesktopPixelBufferTextureCallback texture_callback,
34+
void* user_data)
35+
: ExternalTexture(),
36+
texture_callback_(texture_callback),
37+
user_data_(user_data) {}
38+
39+
bool ExternalTexturePixelEvasGL::CopyPixelBuffer(size_t& width,
40+
size_t& height) {
41+
if (!texture_callback_) {
42+
return false;
43+
}
44+
45+
const FlutterDesktopPixelBuffer* pixel_buffer =
46+
texture_callback_(width, height, user_data_);
47+
48+
if (!pixel_buffer || !pixel_buffer->buffer) {
49+
return false;
50+
}
51+
52+
width = pixel_buffer->width;
53+
height = pixel_buffer->height;
54+
55+
if (state_->gl_texture == 0) {
56+
glGenTextures(1, static_cast<GLuint*>(&state_->gl_texture));
57+
glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(state_->gl_texture));
58+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
59+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
60+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
61+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
62+
} else {
63+
glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(state_->gl_texture));
64+
}
65+
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixel_buffer->width,
66+
pixel_buffer->height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
67+
pixel_buffer->buffer);
68+
return true;
69+
}
70+
71+
} // namespace flutter
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#ifndef EMBEDDER_EXTERNAL_TEXTURE_PIXEL_EVAS_GL_H
6+
#define EMBEDDER_EXTERNAL_TEXTURE_PIXEL_EVAS_GL_H
7+
8+
#include "flutter/shell/platform/common/public/flutter_texture_registrar.h"
9+
#include "flutter/shell/platform/embedder/embedder.h"
10+
#include "flutter/shell/platform/tizen/external_texture.h"
11+
12+
namespace flutter {
13+
14+
class ExternalTexturePixelEvasGL : public ExternalTexture {
15+
public:
16+
ExternalTexturePixelEvasGL(
17+
FlutterDesktopPixelBufferTextureCallback texture_callback,
18+
void* user_data);
19+
20+
~ExternalTexturePixelEvasGL() = default;
21+
22+
bool PopulateTexture(size_t width,
23+
size_t height,
24+
FlutterOpenGLTexture* opengl_texture) override;
25+
26+
bool CopyPixelBuffer(size_t& width, size_t& height);
27+
28+
private:
29+
FlutterDesktopPixelBufferTextureCallback texture_callback_ = nullptr;
30+
void* user_data_ = nullptr;
31+
};
32+
33+
} // namespace flutter
34+
35+
#endif // EMBEDDER_EXTERNAL_TEXTURE_PIXEL_EVAS_GL_H

shell/platform/tizen/flutter_tizen_texture_registrar.cc

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
#include <mutex>
99

1010
#ifndef WEARABLE_PROFILE
11+
#include "flutter/shell/platform/tizen/external_texture_pixel_egl.h"
1112
#include "flutter/shell/platform/tizen/external_texture_surface_egl.h"
1213
#endif
14+
#include "flutter/shell/platform/tizen/external_texture_pixel_evas_gl.h"
1315
#include "flutter/shell/platform/tizen/external_texture_surface_evas_gl.h"
1416
#include "flutter/shell/platform/tizen/flutter_tizen_engine.h"
1517
#include "flutter/shell/platform/tizen/logger.h"
@@ -102,8 +104,18 @@ FlutterTizenTextureRegistrar::CreateExternalTexture(
102104
FlutterDesktopRendererType renderer_type) {
103105
switch (texture_info->type) {
104106
case kFlutterDesktopPixelBufferTexture:
105-
FT_UNIMPLEMENTED();
107+
if (renderer_type == FlutterDesktopRendererType::kEvasGL) {
108+
return std::make_unique<ExternalTexturePixelEvasGL>(
109+
texture_info->pixel_buffer_config.callback,
110+
texture_info->pixel_buffer_config.user_data);
111+
}
112+
#ifndef WEARABLE_PROFILE
113+
return std::make_unique<ExternalTexturePixelEGL>(
114+
texture_info->pixel_buffer_config.callback,
115+
texture_info->pixel_buffer_config.user_data);
116+
#else
106117
return nullptr;
118+
#endif
107119
case kFlutterDesktopGpuBufferTexture:
108120
ExternalTextureExtensionType gl_extension =
109121
ExternalTextureExtensionType::kNone;
@@ -115,7 +127,7 @@ FlutterTizenTextureRegistrar::CreateExternalTexture(
115127
"EGL_EXT_image_dma_buf_import")) {
116128
gl_extension = ExternalTextureExtensionType::kDmaBuffer;
117129
}
118-
if (FlutterDesktopRendererType::kEvasGL == renderer_type) {
130+
if (renderer_type == FlutterDesktopRendererType::kEvasGL) {
119131
return std::make_unique<ExternalTextureSurfaceEvasGL>(
120132
gl_extension, texture_info->gpu_buffer_config.callback,
121133
texture_info->gpu_buffer_config.user_data);

0 commit comments

Comments
 (0)