Experimental wgpu WebGL backend support

- Added missing `draw_cache_align_4x4` call for `brush_glyph` on wasm32 target
- Added WebGL support to `integratio_wgpu` example
- Fixed test.yml CI workflow
- Removed spir-v shader in `integration_wgpu`; Fixed formatting
- Removed redundant `BoxStream` typedef
This commit is contained in:
Vladyslav Nikonov 2021-10-21 22:42:14 +03:00 committed by Héctor Ramón Jiménez
parent c75ed37148
commit bdca20fc4a
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
21 changed files with 414 additions and 86 deletions

View file

@ -14,7 +14,6 @@ categories = ["gui"]
debug = ["iced_native/debug"]
[dependencies]
window_clipboard = "0.2"
log = "0.4"
thiserror = "1.0"
@ -37,3 +36,6 @@ path = "../futures"
[target.'cfg(target_os = "windows")'.dependencies.winapi]
version = "0.3.6"
[target.'cfg(not(target_arch = "wasm32"))'.dependencies.window_clipboard]
version = "0.2"

View file

@ -115,12 +115,16 @@ where
use futures::task;
use futures::Future;
use winit::event_loop::EventLoop;
#[cfg(not(target_arch = "wasm32"))]
use winit::platform::run_return::EventLoopExtRunReturn;
let mut debug = Debug::new();
debug.startup_started();
#[cfg(not(target_arch = "wasm32"))]
let mut event_loop = EventLoop::with_user_event();
#[cfg(target_arch = "wasm32")]
let event_loop = EventLoop::with_user_event();
let mut proxy = event_loop.create_proxy();
let mut runtime = {
@ -179,41 +183,81 @@ where
let mut context = task::Context::from_waker(task::noop_waker_ref());
event_loop.run_return(move |event, _, control_flow| {
use winit::event_loop::ControlFlow;
#[cfg(not(target_arch = "wasm32"))]
{
event_loop.run_return(move |event, _, control_flow| {
use winit::event_loop::ControlFlow;
if let ControlFlow::Exit = control_flow {
return;
}
if let ControlFlow::Exit = control_flow {
return;
}
let event = match event {
winit::event::Event::WindowEvent {
event:
winit::event::WindowEvent::ScaleFactorChanged {
new_inner_size,
..
},
window_id,
} => Some(winit::event::Event::WindowEvent {
event: winit::event::WindowEvent::Resized(*new_inner_size),
window_id,
}),
_ => event.to_static(),
};
if let Some(event) = event {
sender.start_send(event).expect("Send event");
let poll = instance.as_mut().poll(&mut context);
*control_flow = match poll {
task::Poll::Pending => ControlFlow::Wait,
task::Poll::Ready(_) => ControlFlow::Exit,
let event = match event {
winit::event::Event::WindowEvent {
event:
winit::event::WindowEvent::ScaleFactorChanged {
new_inner_size,
..
},
window_id,
} => Some(winit::event::Event::WindowEvent {
event: winit::event::WindowEvent::Resized(*new_inner_size),
window_id,
}),
_ => event.to_static(),
};
}
});
Ok(())
if let Some(event) = event {
sender.start_send(event).expect("Send event");
let poll = instance.as_mut().poll(&mut context);
*control_flow = match poll {
task::Poll::Pending => ControlFlow::Wait,
task::Poll::Ready(_) => ControlFlow::Exit,
};
}
});
Ok(())
}
#[cfg(target_arch = "wasm32")]
{
event_loop.run(move |event, _, control_flow| {
use winit::event_loop::ControlFlow;
if let ControlFlow::Exit = control_flow {
return;
}
let event = match event {
winit::event::Event::WindowEvent {
event:
winit::event::WindowEvent::ScaleFactorChanged {
new_inner_size,
..
},
window_id,
} => Some(winit::event::Event::WindowEvent {
event: winit::event::WindowEvent::Resized(*new_inner_size),
window_id,
}),
_ => event.to_static(),
};
if let Some(event) = event {
sender.start_send(event).expect("Send event");
let poll = instance.as_mut().poll(&mut context);
*control_flow = match poll {
task::Poll::Pending => ControlFlow::Wait,
task::Poll::Ready(_) => ControlFlow::Exit,
};
}
});
}
}
async fn run_instance<A, E, C>(

View file

@ -6,15 +6,40 @@ use crate::command::{self, Command};
/// A buffer for short-term storage and transfer within and between
/// applications.
#[allow(missing_debug_implementations)]
#[cfg(target_arch = "wasm32")]
pub struct Clipboard;
#[cfg(target_arch = "wasm32")]
impl Clipboard {
/// Creates a new [`Clipboard`] for the given window.
pub fn connect(_window: &winit::window::Window) -> Clipboard {
Clipboard
}
/// Reads the current content of the [`Clipboard`] as text.
pub fn read(&self) -> Option<String> {
None
}
/// Writes the given text contents to the [`Clipboard`].
pub fn write(&mut self, _contents: String) {}
}
/// A buffer for short-term storage and transfer within and between
/// applications.
#[allow(missing_debug_implementations)]
#[cfg(not(target_arch = "wasm32"))]
pub struct Clipboard {
state: State,
}
#[cfg(not(target_arch = "wasm32"))]
enum State {
Connected(window_clipboard::Clipboard),
Unavailable,
}
#[cfg(not(target_arch = "wasm32"))]
impl Clipboard {
/// Creates a new [`Clipboard`] for the given window.
pub fn connect(window: &winit::window::Window) -> Clipboard {