Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitde491a2

Browse files
committed
Split engine handler into opengl and task runner
1 parent2c9d208 commitde491a2

File tree

9 files changed

+98
-133
lines changed

9 files changed

+98
-133
lines changed

‎Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎flutter-engine/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ parking_lot = "0.10.0"
1818
priority-queue ="0.7.0"
1919
serde = {version ="1.0.104",features = ["derive"] }
2020
serde_json ="1.0.44"
21+
async-std ="1.2"
22+
futures-task ="0.3.1"
2123

2224
[features]
2325
gl-helpers = ["gl","image"]

‎flutter-engine/src/builder.rs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
usecrate::{CreateError,FlutterEngine,FlutterEngineHandler};
1+
usecrate::tasks::TaskRunnerHandler;
2+
usecrate::{CreateError,FlutterEngine,FlutterOpenGLHandler};
23
use std::path::PathBuf;
3-
use std::sync::Weak;
4+
use std::sync::Arc;
45

56
pubstructFlutterEngineBuilder{
6-
pub(crate)handler:Option<Weak<dynFlutterEngineHandler>>,
7+
pub(crate)platform_handler:Option<Arc<dynTaskRunnerHandler +Send +Sync>>,
8+
pub(crate)opengl_handler:Option<Box<dynFlutterOpenGLHandler +Send>>,
79
pub(crate)assets:PathBuf,
810
pub(crate)args:Vec<String>,
911
}
@@ -12,14 +14,26 @@ impl FlutterEngineBuilder {
1214
#[allow(clippy::new_without_default)]
1315
pubfnnew() ->Self{
1416
Self{
15-
handler:None,
17+
platform_handler:None,
18+
opengl_handler:None,
1619
assets:Default::default(),
1720
args:vec![],
1821
}
1922
}
2023

21-
pubfnwith_handler(mutself,handler:Weak<dynFlutterEngineHandler>) ->Self{
22-
self.handler =Some(handler);
24+
pubfnwith_platform_handler(
25+
mutself,
26+
handler:Arc<dynTaskRunnerHandler +Send +Sync>,
27+
) ->Self{
28+
self.platform_handler =Some(handler);
29+
self
30+
}
31+
32+
pubfnwith_opengl<H>(mutself,handler:H) ->Self
33+
where
34+
H:FlutterOpenGLHandler +Send +'static,
35+
{
36+
self.opengl_handler =Some(Box::new(handler));
2337
self
2438
}
2539

‎flutter-engine/src/flutter_callbacks.rs

Lines changed: 13 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,54 @@
11
usecrate::tasks::{TaskRunner,TaskRunnerInner};
2-
usecrate::{FlutterEngineHandler,FlutterEngineInner};
2+
usecrate::FlutterEngineInner;
33
use log::trace;
44
use parking_lot::Mutex;
55
use std::os::raw::{c_char, c_uint, c_void};
6-
use std::sync::Arc;
7-
8-
#[inline]
9-
unsafefnget_handler(user_data:*mutc_void) ->Option<Arc<dynFlutterEngineHandler>>{
10-
let engine =&*(user_dataas*constFlutterEngineInner);
11-
engine.handler.upgrade()
12-
}
136

147
pubextern"C"fnpresent(user_data:*mutc_void) ->bool{
158
trace!("present");
169
unsafe{
17-
ifletSome(handler) =get_handler(user_data){
18-
handler.swap_buffers()
19-
}else{
20-
false
21-
}
10+
let engine =&*(user_dataas*constFlutterEngineInner);
11+
engine.opengl_handler.swap_buffers()
2212
}
2313
}
2414

2515
pubextern"C"fnmake_current(user_data:*mutc_void) ->bool{
2616
trace!("make_current");
2717
unsafe{
28-
ifletSome(handler) =get_handler(user_data){
29-
handler.make_current()
30-
}else{
31-
false
32-
}
18+
let engine =&*(user_dataas*constFlutterEngineInner);
19+
engine.opengl_handler.make_current()
3320
}
3421
}
3522

3623
pubextern"C"fnclear_current(user_data:*mutc_void) ->bool{
3724
trace!("clear_current");
3825
unsafe{
39-
ifletSome(handler) =get_handler(user_data){
40-
handler.clear_current()
41-
}else{
42-
false
43-
}
26+
let engine =&*(user_dataas*constFlutterEngineInner);
27+
engine.opengl_handler.clear_current()
4428
}
4529
}
4630

4731
pubextern"C"fnfbo_callback(user_data:*mutc_void) ->c_uint{
4832
trace!("fbo_callback");
4933
unsafe{
50-
ifletSome(handler) =get_handler(user_data){
51-
handler.fbo_callback()
52-
}else{
53-
0
54-
}
34+
let engine =&*(user_dataas*constFlutterEngineInner);
35+
engine.opengl_handler.fbo_callback()
5536
}
5637
}
5738

5839
pubextern"C"fnmake_resource_current(user_data:*mutc_void) ->bool{
5940
trace!("make_resource_current");
6041
unsafe{
61-
ifletSome(handler) =get_handler(user_data){
62-
handler.make_resource_current()
63-
}else{
64-
false
65-
}
42+
let engine =&*(user_dataas*constFlutterEngineInner);
43+
engine.opengl_handler.make_resource_current()
6644
}
6745
}
6846

6947
pubextern"C"fngl_proc_resolver(user_data:*mutc_void,proc:*constc_char) ->*mutc_void{
7048
trace!("gl_proc_resolver");
7149
unsafe{
72-
ifletSome(handler) =get_handler(user_data){
73-
handler.gl_proc_resolver(proc)
74-
}else{
75-
std::ptr::null_mut()
76-
}
50+
let engine =&*(user_dataas*constFlutterEngineInner);
51+
engine.opengl_handler.gl_proc_resolver(proc)
7752
}
7853
}
7954

‎flutter-engine/src/lib.rs

Lines changed: 19 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ pub mod ffi;
99
mod flutter_callbacks;
1010
pubmod plugins;
1111
pubmod tasks;
12+
13+
use futures_task::FutureObj;
14+
1215
pubmod texture_registry;
1316
pubmod utils;
1417

@@ -19,8 +22,9 @@ use crate::ffi::{
1922
FlutterPointerSignalKind,PlatformMessage,PlatformMessageResponseHandle,
2023
};
2124
usecrate::plugins::{Plugin,PluginRegistrar};
22-
usecrate::tasks::{TaskRunner,TaskRunnerHandler};
25+
usecrate::tasks::TaskRunner;
2326
usecrate::texture_registry::{Texture,TextureRegistry};
27+
use async_std::task;
2428
use crossbeam_channel::{unbounded,Receiver,Sender};
2529
use flutter_engine_sys::{FlutterEngineResult,FlutterTask};
2630
use log::trace;
@@ -44,11 +48,10 @@ pub(crate) enum MainThreadCallback {
4448
}
4549

4650
structFlutterEngineInner{
47-
handler:Weak<dynFlutterEngineHandler>,
51+
opengl_handler:Box<dynFlutterOpenGLHandler +Send>,
4852
engine_ptr: flutter_engine_sys::FlutterEngine,
4953
plugins:RwLock<PluginRegistrar>,
5054
platform_runner:TaskRunner,
51-
_platform_runner_handler:Arc<PlatformRunnerHandler>,
5255
platform_receiver:Receiver<MainThreadCallback>,
5356
platform_sender:Sender<MainThreadCallback>,
5457
texture_registry:TextureRegistry,
@@ -111,7 +114,7 @@ impl Clone for FlutterEngine {
111114
}
112115
}
113116

114-
pubtraitFlutterEngineHandler{
117+
pubtraitFlutterOpenGLHandler{
115118
fnswap_buffers(&self) ->bool;
116119

117120
fnmake_current(&self) ->bool;
@@ -123,22 +126,6 @@ pub trait FlutterEngineHandler {
123126
fnmake_resource_current(&self) ->bool;
124127

125128
fngl_proc_resolver(&self,proc:*constc_char) ->*mutc_void;
126-
127-
fnwake_platform_thread(&self);
128-
129-
fnrun_in_background(&self,func:Box<dynFuture<Output =()> +Send +'static>);
130-
}
131-
132-
structPlatformRunnerHandler{
133-
handler:Weak<dynFlutterEngineHandler>,
134-
}
135-
136-
implTaskRunnerHandlerforPlatformRunnerHandler{
137-
fnwake(&self){
138-
ifletSome(handler) =self.handler.upgrade(){
139-
handler.wake_platform_thread();
140-
}
141-
}
142129
}
143130

144131
implFlutterEngine{
@@ -155,27 +142,18 @@ impl FlutterEngine {
155142
args.push(CString::new(arg.as_str()).unwrap().into_raw());
156143
}
157144

158-
// Extract handler
159-
let handler = builder.handler.expect("No handler set");
160-
if handler.upgrade().is_none(){
161-
returnErr(CreateError::NoHandler);
162-
}
163-
164-
let platform_handler =Arc::new(PlatformRunnerHandler{
165-
handler: handler.clone(),
166-
});
167-
168145
let(main_tx, main_rx) =unbounded();
169146

170147
let engine =Self{
171148
inner:Arc::new(FlutterEngineInner{
172-
handler,
149+
opengl_handler: builder
150+
.opengl_handler
151+
.expect("Only opengl is supported (for now)"),
173152
engine_ptr: ptr::null_mut(),
174153
plugins:RwLock::new(PluginRegistrar::new()),
175154
platform_runner:TaskRunner::new(
176-
Arc::downgrade(&platform_handler)asWeak<dynTaskRunnerHandler>
155+
builder.platform_handler.expect("No platform runner set"),
177156
),
178-
_platform_runner_handler: platform_handler,
179157
platform_receiver: main_rx,
180158
platform_sender: main_tx,
181159
texture_registry:TextureRegistry::new(),
@@ -400,17 +378,17 @@ impl FlutterEngine {
400378
where
401379
F:FnOnce(&FlutterEngine) ->() +'static +Send,
402380
{
403-
ifself.is_platform_thread(){
404-
f(self);
405-
}else{
406-
self.post_platform_callback(MainThreadCallback::RenderThread(Box::new(f)));
407-
}
381+
// TODO: Reimplement render thread
382+
// if self.is_platform_thread() {
383+
// f(self);
384+
// } else {
385+
self.post_platform_callback(MainThreadCallback::RenderThread(Box::new(f)));
386+
// }
408387
}
409388

389+
#[deprecated(note ="Soon to be removed: Unclear use cases")]
410390
pubfnrun_in_background(&self,future:implFuture<Output =()> +Send +'static){
411-
ifletSome(handler) =self.inner.handler.upgrade(){
412-
handler.run_in_background(Box::new(future));
413-
}
391+
task::spawn(FutureObj::new(Box::new(future)));
414392
}
415393

416394
pubfnsend_window_metrics_event(&self,width:usize,height:usize,pixel_ratio:f64){

‎flutter-engine/src/tasks.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use priority_queue::PriorityQueue;
66
use std::cmp::Ordering;
77
use std::hash::{Hash,Hasher};
88
use std::sync::atomic::AtomicU64;
9-
use std::sync::{Arc,Weak};
9+
use std::sync::Arc;
1010
use std::thread;
1111
use std::thread::ThreadId;
1212
use std::time::{Duration,Instant};
@@ -17,7 +17,7 @@ pub trait TaskRunnerHandler {
1717

1818
pub(crate)structTaskRunnerInner{
1919
engine:FlutterEngineWeakRef,
20-
pub(crate)handler:Weak<dynTaskRunnerHandler>,
20+
pub(crate)handler:Arc<dynTaskRunnerHandler +Send +Sync>,
2121
thread_id:ThreadId,
2222
tasks:PriorityQueue<Task,TaskPriority>,
2323
}
@@ -41,7 +41,7 @@ impl TaskRunnerInner {
4141
}
4242

4343
implTaskRunner{
44-
pubfnnew(handler:Weak<dynTaskRunnerHandler>) ->Self{
44+
pubfnnew(handler:Arc<dynTaskRunnerHandler +Send +Sync>) ->Self{
4545
let thread_id = thread::current().id();
4646
debug!("task runner created on thread {:?}", thread_id);
4747
Self{
@@ -117,7 +117,7 @@ impl TaskRunner {
117117
let tasks =&mut guard.tasks;
118118
tasks.push(task, task_priority);
119119

120-
let handler = guard.handler.upgrade().unwrap();
120+
let handler = guard.handler.clone();
121121

122122
// make sure to unlock the mutex before posting an event because the event handler may read the queue
123123
MutexGuard::unlocked(guard,move ||{
@@ -130,10 +130,8 @@ impl TaskRunner {
130130
}
131131

132132
pub(crate)fnwake(&self){
133-
let handler ={self.inner.lock().handler.upgrade()};
134-
ifletSome(handler) = handler{
135-
handler.wake();
136-
}
133+
let handler ={self.inner.lock().handler.clone()};
134+
handler.wake();
137135
}
138136
}
139137

‎flutter-winit/Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,10 @@ repository = "https://github.com/flutter-rs/flutter-rs"
99
license ="MIT"
1010

1111
[dependencies]
12-
async-std ="1.4.0"
1312
copypasta ="0.6.2"
1413
flutter-engine-sys = {path ="../flutter-engine-sys" }
1514
flutter-engine = {path ="../flutter-engine" }
1615
flutter-plugins = {path ="../flutter-plugins" }
17-
futures-task ="0.3.1"
1816
gl ="0.14.0"
1917
glutin = {git ="https://github.com/dvc94ch/glutin",branch ="android" }
2018
locale_config ="0.3.0"

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp