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

Commit1516fa8

Browse files
committed
Rewrite external texture handling.
1 parent3881f0e commit1516fa8

File tree

4 files changed

+73
-134
lines changed

4 files changed

+73
-134
lines changed

‎flutter-engine/src/ffi.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ impl From<FlutterPointerMouseButtons> for flutter_engine_sys::FlutterPointerMous
178178

179179
pubtypeTextureId =i64;
180180

181-
#[derive(Debug)]
181+
#[derive(Clone,Debug)]
182182
pubstructExternalTexture{
183183
engine_ptr: flutter_engine_sys::FlutterEngine,
184184
texture_id:TextureId,

‎flutter-engine/src/lib.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::ffi::{
1818
};
1919
usecrate::plugins::{Plugin,PluginRegistrar};
2020
usecrate::tasks::{TaskRunner,TaskRunnerHandler};
21-
usecrate::texture_registry::{GlTexture,Texture,TextureRegistry};
21+
usecrate::texture_registry::{Texture,TextureRegistry};
2222
use flutter_engine_sys::FlutterTask;
2323
use log::trace;
2424
use parking_lot::RwLock;
@@ -541,10 +541,8 @@ impl FlutterEngine {
541541
}
542542
}
543543

544-
pubfncreate_texture<T:GlTexture +'static>(&self,texture:T) ->Texture{
545-
self.inner
546-
.texture_registry
547-
.create_texture(self,Box::new(texture))
544+
pubfncreate_texture(&self) ->Texture{
545+
Texture::new(self.clone())
548546
}
549547
}
550548

‎flutter-engine/src/texture_registry.rs

Lines changed: 66 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -2,150 +2,86 @@ use crate::ffi::{ExternalTexture, ExternalTextureFrame, TextureId};
22
usecrate::FlutterEngine;
33
#[cfg(feature ="image")]
44
use image::RgbaImage;
5-
#[cfg(feature ="image")]
6-
use parking_lot::Mutex;
75
use parking_lot::RwLock;
86
use std::collections::HashMap;
9-
use std::sync::Arc;
10-
11-
pubstructTexture{
12-
texture_id:TextureId,
13-
registry:TextureRegistry,
14-
}
15-
16-
implTexture{
17-
pubfnid(&self) ->TextureId{
18-
self.texture_id
19-
}
20-
21-
pubfnmark_frame_available(&self){
22-
self.registry.mark_frame_available(self.texture_id)
23-
}
24-
}
25-
26-
implDropforTexture{
27-
fndrop(&mutself){
28-
log::trace!("dropping Texture");
29-
self.registry.drop_texture(self.texture_id);
30-
}
31-
}
7+
use std::sync::{Arc,Barrier};
8+
use std::sync::atomic::{AtomicU32,Ordering};
329

3310
#[derive(Clone,Default)]
3411
pubstructTextureRegistry{
35-
textures:Arc<RwLock<HashMap<TextureId,FlutterTexture>>>,
12+
textures:Arc<RwLock<HashMap<TextureId,u32>>>,
3613
}
3714

3815
implTextureRegistry{
39-
pubfnnew() ->Self{
40-
Default::default()
16+
pubfnregister(&self,texture_id:TextureId,glid:u32){
17+
self.textures.write().insert(texture_id, glid);
4118
}
4219

43-
pubfncreate_texture(&self,engine:&FlutterEngine,gl:Box<dynGlTexture>) ->Texture{
44-
let texture =ExternalTexture::new(engine.engine_ptr());
45-
let texture_id = texture.id();
46-
let texture =FlutterTexture::new(texture, gl);
47-
self.textures.write().insert(texture_id, texture);
48-
49-
let textures =self.textures.clone();
50-
engine.run_on_platform_thread(move |_engine|{
51-
ifletSome(texture) = textures.read().get(&texture_id){
52-
texture.register();
53-
}
54-
});
55-
56-
Texture{
57-
texture_id,
58-
registry:self.clone(),
59-
}
60-
}
61-
62-
pub(crate)fnget_texture_frame(
63-
&self,
64-
texture_id:TextureId,
65-
_size:(usize,usize),
66-
) ->Option<ExternalTextureFrame>{
67-
letmut textures =self.textures.write();
68-
textures
69-
.get_mut(&texture_id)
70-
.map(|texture| texture.get_texture_frame())
71-
}
72-
73-
fnmark_frame_available(&self,texture_id:TextureId){
20+
pubfnget_texture_frame(&self,texture_id:TextureId,_size:(usize,usize)) ->Option<ExternalTextureFrame>{
7421
let textures =self.textures.read();
75-
ifletSome(texture) = textures.get(&texture_id){
76-
texture.mark_frame_available();
22+
ifletSome(glid) = textures.get(&texture_id){
23+
log::trace!("returning external texture frame with glid {}", glid);
24+
returnSome(ExternalTextureFrame::new(gl::TEXTURE_2D,*glid, gl::RGBA8, ||{}))
7725
}
78-
}
79-
80-
fndrop_texture(&self,texture_id:TextureId){
81-
letmut textures =self.textures.write();
82-
textures.remove(&texture_id);
26+
None
8327
}
8428
}
8529

86-
structFlutterTexture{
30+
pubstructTexture{
31+
engine:FlutterEngine,
8732
texture:ExternalTexture,
88-
gl:Box<dynGlTexture>,
89-
}
90-
91-
implFlutterTexture{
92-
fnnew(texture:ExternalTexture,gl:Box<dynGlTexture>) ->Self{
93-
Self{ texture, gl}
94-
}
95-
96-
fnregister(&self){
97-
self.texture.register();
98-
}
99-
100-
fnmark_frame_available(&self){
101-
self.texture.mark_frame_available();
102-
}
103-
104-
fnget_texture_frame(&mutself) ->ExternalTextureFrame{
105-
self.gl.get_texture_frame()
106-
}
107-
}
108-
109-
implDropforFlutterTexture{
110-
fndrop(&mutself){
111-
log::trace!("dropping FlutterTexture");
112-
self.texture.unregister();
113-
}
114-
}
115-
116-
pubtraitGlTexture:Send +Sync{
117-
fnget_texture_frame(&mutself) ->ExternalTextureFrame;
33+
glid:Arc<AtomicU32>,
11834
}
11935

120-
#[cfg(feature ="image")]
121-
#[derive(Clone)]
122-
pubstructRgbaTexture{
123-
data:Arc<Mutex<Option<RgbaImage>>>,
124-
id:u32,
125-
}
36+
implTexture{
37+
pub(crate)fnnew(engine:FlutterEngine) ->Self{
38+
let texture =ExternalTexture::new(engine.engine_ptr());
39+
let texture2 = texture.clone();
40+
let glid =Arc::new(AtomicU32::new(0));
41+
let glid2 = glid.clone();
42+
let barrier =Arc::new(Barrier::new(2));
43+
let barrier2 = barrier.clone();
44+
engine.run_on_render_thread(move |engine|{
45+
letmut id:u32 =0;
46+
unsafe{
47+
gl::GenTextures(1,&mut idas*mut_);
48+
}
49+
glid2.store(id,Ordering::SeqCst);
50+
engine.inner.texture_registry.register(texture2.id(), id);
51+
barrier2.wait();
12652

127-
#[cfg(feature ="image")]
128-
implRgbaTexture{
129-
pubfnnew(img:RgbaImage) ->Self{
53+
engine.run_on_platform_thread(move |_engine|{
54+
texture2.register();
55+
});
56+
});
57+
barrier.wait();
13058
Self{
131-
data:Arc::new(Mutex::new(Some(img))),
132-
id:0,
59+
engine, texture, glid
13360
}
13461
}
13562

136-
pubfnpost_frame_rgba(&mutself,img:RgbaImage){
137-
*self.data.lock() =Some(img);
63+
pubfnid(&self) ->TextureId{
64+
self.texture.id()
65+
}
66+
67+
pubfnpost_frame<F:FnOnce() +Send +'static>(&self,render:F){
68+
let glid =self.glid.load(Ordering::SeqCst);
69+
let texture =self.texture.clone();
70+
self.engine.run_on_render_thread(move |engine|{
71+
log::trace!("bound texture with glid {}", glid);
72+
unsafe{ gl::BindTexture(gl::TEXTURE_2D, glid)};
73+
render();
74+
engine.run_on_platform_thread(move |_engine|{
75+
texture.mark_frame_available();
76+
});
77+
});
13878
}
139-
}
14079

141-
#[cfg(feature ="image")]
142-
implGlTextureforRgbaTexture{
143-
fnget_texture_frame(&mutself) ->ExternalTextureFrame{
144-
ifletSome(img) =self.data.lock().take(){
80+
#[cfg(feature ="image")]
81+
pubfnpost_frame_rgba(&self,img:RgbaImage){
82+
self.post_frame(move ||{
14583
let(width, height) = img.dimensions();
14684
unsafe{
147-
gl::GenTextures(1,&mutself.idas*mut_);
148-
gl::BindTexture(gl::TEXTURE_2D,self.id);
14985
gl::PixelStorei(gl::UNPACK_ALIGNMENT,1);
15086
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::LINEARas_);
15187
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::LINEARas_);
@@ -160,18 +96,23 @@ impl GlTexture for RgbaTexture {
16096
gl::UNSIGNED_BYTE,// data type of the pixel data
16197
(&img).as_ptr()as*const_,// pixel data
16298
);
163-
log::debug!("created gl texture with id {}",self.id);
16499
}
165-
}
166-
ExternalTextureFrame::new(gl::TEXTURE_2D,self.id, gl::RGBA8, ||{})
100+
});
167101
}
168102
}
169103

170-
#[cfg(feature ="image")]
171-
implDropforRgbaTexture{
104+
implDropforTexture{
172105
fndrop(&mutself){
173-
unsafe{
174-
gl::DeleteTextures(1,&self.idas*const_);
175-
}
106+
let id =self.glid.load(Ordering::SeqCst);
107+
log::trace!("dropping Texture with id {}", id);
108+
let texture =self.texture.clone();
109+
self.engine.run_on_platform_thread(move |_engine|{
110+
texture.unregister();
111+
});
112+
self.engine.run_on_render_thread(move |_engine|{
113+
unsafe{
114+
gl::DeleteTextures(1,&idas*const_);
115+
}
116+
});
176117
}
177118
}

‎flutter-winit/src/window.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::keyboard::raw_key;
44
usecrate::pointer::Pointers;
55
use flutter_engine::channel::Channel;
66
use flutter_engine::plugins::Plugin;
7-
use flutter_engine::texture_registry::{GlTexture,Texture};
7+
use flutter_engine::texture_registry::Texture;
88
use flutter_engine::{FlutterEngine,FlutterEngineHandler};
99
use flutter_plugins::dialog::DialogPlugin;
1010
use flutter_plugins::isolate::IsolatePlugin;
@@ -124,8 +124,8 @@ impl FlutterWindow {
124124
self.resource_context.clone()
125125
}
126126

127-
pubfncreate_texture<T:GlTexture +'static>(&self,texture:T) ->Texture{
128-
self.engine.create_texture(texture)
127+
pubfncreate_texture(&self) ->Texture{
128+
self.engine.create_texture()
129129
}
130130

131131
pubfnadd_plugin<P>(&self,plugin:P) ->&Self

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp