Skip to content

Commit 0a9ca71

Browse files
committed
[webview_flutter] Apply texture api change
Signed-off-by: MuHong Byun <[email protected]>
1 parent 866afb9 commit 0a9ca71

File tree

5 files changed

+57
-18
lines changed

5 files changed

+57
-18
lines changed

packages/webview_flutter/tizen/src/webview.cc

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
#include <Ecore_IMF_Evas.h>
88
#include <Ecore_Input_Evas.h>
99
#include <flutter_platform_view.h>
10-
#include <flutter_tizen_texture_registrar.h>
10+
#include <flutter_texture_registrar.h>
11+
#include <texture_registrar.h>
1112

1213
#include <map>
1314
#include <memory>
15+
#include <mutex>
1416
#include <sstream>
1517
#include <string>
1618

@@ -154,7 +156,7 @@ double ExtractDoubleFromMap(const flutter::EncodableValue& arguments,
154156
}
155157

156158
WebView::WebView(flutter::PluginRegistrar* registrar, int viewId,
157-
FlutterTextureRegistrar* texture_registrar, double width,
159+
flutter::TextureRegistrar* texture_registrar, double width,
158160
double height, flutter::EncodableMap& params)
159161
: PlatformView(registrar, viewId),
160162
texture_registrar_(texture_registrar),
@@ -166,7 +168,14 @@ WebView::WebView(flutter::PluginRegistrar* registrar, int viewId,
166168
has_navigation_delegate_(false),
167169
has_progress_tracking_(false),
168170
context_(nullptr) {
169-
SetTextureId(FlutterRegisterExternalTexture(texture_registrar_));
171+
flutter::TextureVariant* textureVariant_ =
172+
new flutter::TextureVariant(flutter::GpuBufferTexture(
173+
[this](size_t width,
174+
size_t height) -> const FlutterDesktopGpuBuffer* {
175+
return this->CopyGpuBuffer(width, height);
176+
},
177+
[this]() -> void { this->Destruction(); }));
178+
SetTextureId(texture_registrar_->RegisterTexture(textureVariant_));
170179
InitWebView();
171180

172181
channel_ = std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>(
@@ -375,7 +384,8 @@ std::string WebView::GetChannelName() {
375384
}
376385

377386
void WebView::Dispose() {
378-
FlutterUnregisterExternalTexture(texture_registrar_, GetTextureId());
387+
// FlutterUnregisterExternalTexture(texture_registrar_, GetTextureId());
388+
texture_registrar_->UnregisterTexture(GetTextureId());
379389

380390
if (webview_instance_) {
381391
webview_instance_->Destroy();
@@ -754,19 +764,17 @@ void WebView::InitWebView() {
754764
"Asia/Seoul",
755765
[this]() -> LWE::WebContainer::ExternalImageInfo {
756766
LWE::WebContainer::ExternalImageInfo result;
757-
if (!tbm_surface_) {
758-
tbm_surface_ =
767+
if (candidate_surfaces_.size() < 2) {
768+
tbm_surface_h tbm_surface =
759769
tbm_surface_create(width_, height_, TBM_FORMAT_ARGB8888);
770+
candidate_surfaces_.push(tbm_surface);
760771
}
761-
result.imageAddress = (void*)tbm_surface_;
772+
result.imageAddress = (void*)candidate_surfaces_.top();
762773
return result;
763774
},
764775
[this](LWE::WebContainer* c, bool isRendered) {
765776
if (isRendered) {
766-
FlutterMarkExternalTextureFrameAvailable(
767-
texture_registrar_, GetTextureId(), tbm_surface_);
768-
tbm_surface_destroy(tbm_surface_);
769-
tbm_surface_ = nullptr;
777+
texture_registrar_->MarkTextureFrameAvailable(GetTextureId());
770778
}
771779
});
772780
#ifndef TV_PROFILE
@@ -834,6 +842,7 @@ void WebView::HandleMethodCall(
834842
});
835843
} else {
836844
result->Error("Invalid Arguments", "Invalid Arguments");
845+
// result->Success();
837846
}
838847
} else if (method_name.compare("addJavascriptChannels") == 0) {
839848
if (std::holds_alternative<flutter::EncodableList>(arguments)) {
@@ -900,3 +909,26 @@ void WebView::HandleCookieMethodCall(
900909
result->NotImplemented();
901910
}
902911
}
912+
913+
FlutterDesktopGpuBuffer* WebView::CopyGpuBuffer(size_t width, size_t height) {
914+
if (candidate_surfaces_.size() == 0) {
915+
return nullptr;
916+
}
917+
std::lock_guard<std::mutex> lock(mutex_);
918+
tbm_surface_ = candidate_surfaces_.top();
919+
candidate_surfaces_.pop();
920+
921+
FlutterDesktopGpuBuffer* gpuBuffer = new FlutterDesktopGpuBuffer();
922+
gpuBuffer->buffer = tbm_surface_;
923+
gpuBuffer->width = width;
924+
gpuBuffer->height = height;
925+
return gpuBuffer;
926+
}
927+
928+
void WebView::Destruction() {
929+
if (tbm_surface_) {
930+
std::lock_guard<std::mutex> lock(mutex_);
931+
tbm_surface_destroy(tbm_surface_);
932+
tbm_surface_ = nullptr;
933+
}
934+
}

packages/webview_flutter/tizen/src/webview.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
#include <flutter/standard_message_codec.h>
1111
#include <flutter/standard_method_codec.h>
1212
#include <flutter_platform_view.h>
13-
#include <flutter_tizen_texture_registrar.h>
1413
#include <tbm_surface.h>
1514

15+
#include <mutex>
16+
#include <stack>
17+
1618
namespace LWE {
1719
class WebContainer;
1820
}
@@ -22,7 +24,7 @@ class TextInputChannel;
2224
class WebView : public PlatformView {
2325
public:
2426
WebView(flutter::PluginRegistrar* registrar, int viewId,
25-
FlutterTextureRegistrar* textureRegistrar, double width,
27+
flutter::TextureRegistrar* textureRegistrar, double width,
2628
double height, flutter::EncodableMap& params);
2729
~WebView();
2830
virtual void Dispose() override;
@@ -46,6 +48,9 @@ class WebView : public PlatformView {
4648
void HidePanel();
4749
void ShowPanel();
4850

51+
FlutterDesktopGpuBuffer* CopyGpuBuffer(size_t width, size_t height);
52+
void Destruction();
53+
4954
private:
5055
void HandleMethodCall(
5156
const flutter::MethodCall<flutter::EncodableValue>& method_call,
@@ -59,16 +64,18 @@ class WebView : public PlatformView {
5964
void RegisterJavaScriptChannelName(const std::string& name);
6065
void ApplySettings(flutter::EncodableMap);
6166

62-
FlutterTextureRegistrar* texture_registrar_;
67+
flutter::TextureRegistrar* texture_registrar_;
6368
LWE::WebContainer* webview_instance_;
6469
double width_;
6570
double height_;
71+
std::stack<tbm_surface_h> candidate_surfaces_;
6672
tbm_surface_h tbm_surface_;
6773
bool is_mouse_lbutton_down_;
6874
bool has_navigation_delegate_;
6975
bool has_progress_tracking_;
7076
std::unique_ptr<flutter::MethodChannel<flutter::EncodableValue>> channel_;
7177
Ecore_IMF_Context* context_;
78+
std::mutex mutex_;
7279
};
7380

7481
#endif // FLUTTER_PLUGIN_WEBVIEW_FLUTTER_TIZEN_WEVIEW_H_

packages/webview_flutter/tizen/src/webview_factory.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#include "webview_flutter_tizen_plugin.h"
2323

2424
WebViewFactory::WebViewFactory(flutter::PluginRegistrar* registrar,
25-
FlutterTextureRegistrar* textureRegistrar)
25+
flutter::TextureRegistrar* textureRegistrar)
2626
: PlatformViewFactory(registrar), textureRegistrar_(textureRegistrar) {
2727
char* path = app_get_data_path();
2828
if (!path || strlen(path) == 0) {

packages/webview_flutter/tizen/src/webview_factory.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
class WebViewFactory : public PlatformViewFactory {
1010
public:
1111
WebViewFactory(flutter::PluginRegistrar* registrar,
12-
FlutterTextureRegistrar* textureRegistrar);
12+
flutter::TextureRegistrar* textureRegistrar);
1313
virtual void Dispose() override;
1414
virtual PlatformView* Create(
1515
int viewId, double width, double height,
1616
const std::vector<uint8_t>& createParams) override;
1717

1818
private:
19-
FlutterTextureRegistrar* textureRegistrar_;
19+
flutter::TextureRegistrar* textureRegistrar_;
2020
};
2121

2222
#endif // FLUTTER_PLUGIN_WEBVIEW_FLUTTER_TIZEN_WEVIEW_FACTORY_H_

packages/webview_flutter/tizen/src/webview_flutter_tizen_plugin.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void WebviewFlutterTizenPluginRegisterWithRegistrar(
3838
flutter::PluginRegistrarManager::GetInstance()
3939
->GetRegistrar<flutter::PluginRegistrar>(registrar);
4040
auto factory = std::make_unique<WebViewFactory>(
41-
core_registrar, FlutterPluginRegistrarGetTexture(registrar));
41+
core_registrar, core_registrar->texture_registrar());
4242
FlutterRegisterViewFactory(registrar, kViewType, std::move(factory));
4343
WebviewFlutterTizenPlugin::RegisterWithRegistrar(core_registrar);
4444
}

0 commit comments

Comments
 (0)