Make egui_wgpu::winit::Painter::set_window
async (#2434)
* Make `egui_wgpu::winit::Painter::set_window` async * Fix changelog link
This commit is contained in:
parent
7a658e3ddb
commit
6c4fc50fdf
6 changed files with 17 additions and 14 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -1321,6 +1321,7 @@ dependencies = [
|
|||
"image",
|
||||
"js-sys",
|
||||
"percent-encoding",
|
||||
"pollster",
|
||||
"puffin",
|
||||
"raw-window-handle 0.5.0",
|
||||
"ron",
|
||||
|
@ -1356,7 +1357,6 @@ dependencies = [
|
|||
"bytemuck",
|
||||
"document-features",
|
||||
"egui",
|
||||
"pollster",
|
||||
"puffin",
|
||||
"tracing",
|
||||
"type-map",
|
||||
|
|
|
@ -64,7 +64,7 @@ __screenshot = ["dep:image"]
|
|||
|
||||
## Use [`wgpu`](https://docs.rs/wgpu) for painting (via [`egui-wgpu`](https://github.com/emilk/egui/tree/master/crates/egui-wgpu)).
|
||||
## This overrides the `glow` feature.
|
||||
wgpu = ["dep:wgpu", "dep:egui-wgpu"]
|
||||
wgpu = ["dep:wgpu", "dep:egui-wgpu", "dep:pollster"]
|
||||
|
||||
|
||||
[dependencies]
|
||||
|
@ -100,6 +100,7 @@ directories-next = { version = "2", optional = true }
|
|||
egui-wgpu = { version = "0.20.0", path = "../egui-wgpu", optional = true, features = [
|
||||
"winit",
|
||||
] } # if wgpu is used, use it with winit
|
||||
pollster = { version = "0.2", optional = true } # needed for wgpu
|
||||
|
||||
# we can expose these to user so that they can select which backends they want to enable to avoid compiling useless deps.
|
||||
# this can be done at the same time we expose x11/wayland features of winit crate.
|
||||
|
|
|
@ -950,7 +950,7 @@ mod wgpu_integration {
|
|||
self.window = Some(window);
|
||||
if let Some(running) = &mut self.running {
|
||||
unsafe {
|
||||
running.painter.set_window(self.window.as_ref())?;
|
||||
pollster::block_on(running.painter.set_window(self.window.as_ref()))?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
@ -962,7 +962,7 @@ mod wgpu_integration {
|
|||
self.window = None;
|
||||
if let Some(running) = &mut self.running {
|
||||
unsafe {
|
||||
running.painter.set_window(None)?;
|
||||
pollster::block_on(running.painter.set_window(None))?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
@ -981,7 +981,7 @@ mod wgpu_integration {
|
|||
self.native_options.multisampling.max(1) as _,
|
||||
self.native_options.depth_buffer,
|
||||
);
|
||||
painter.set_window(Some(&window))?;
|
||||
pollster::block_on(painter.set_window(Some(&window)))?;
|
||||
painter
|
||||
};
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ All notable changes to the `egui-wgpu` integration will be noted in this file.
|
|||
|
||||
## Unreleased
|
||||
* Return `Err` instead of panic if we can't find a device ([#2428](https://github.com/emilk/egui/pull/2428)).
|
||||
* `winit::Painter::set_window` is now `async` ([#2434](https://github.com/emilk/egui/pull/2434)).
|
||||
|
||||
|
||||
## 0.20.0 - 2022-12-08 - web support
|
||||
|
|
|
@ -32,7 +32,7 @@ all-features = true
|
|||
puffin = ["dep:puffin"]
|
||||
|
||||
## Enable [`winit`](https://docs.rs/winit) integration.
|
||||
winit = ["dep:pollster", "dep:winit"]
|
||||
winit = ["dep:winit"]
|
||||
|
||||
|
||||
[dependencies]
|
||||
|
@ -49,7 +49,6 @@ wgpu = "0.14"
|
|||
## Enable this when generating docs.
|
||||
document-features = { version = "0.2", optional = true }
|
||||
|
||||
pollster = { version = "0.2", optional = true }
|
||||
winit = { version = "0.27.2", optional = true }
|
||||
|
||||
# Native:
|
||||
|
|
|
@ -88,17 +88,19 @@ impl Painter {
|
|||
//
|
||||
// After we've initialized our render state once though we expect all future surfaces
|
||||
// will have the same format and so this render state will remain valid.
|
||||
fn ensure_render_state_for_surface(
|
||||
async fn ensure_render_state_for_surface(
|
||||
&mut self,
|
||||
surface: &Surface,
|
||||
) -> Result<(), wgpu::RequestDeviceError> {
|
||||
if self.adapter.is_none() {
|
||||
self.adapter =
|
||||
pollster::block_on(self.instance.request_adapter(&wgpu::RequestAdapterOptions {
|
||||
self.adapter = self
|
||||
.instance
|
||||
.request_adapter(&wgpu::RequestAdapterOptions {
|
||||
power_preference: self.configuration.power_preference,
|
||||
compatible_surface: Some(surface),
|
||||
force_fallback_adapter: false,
|
||||
}));
|
||||
})
|
||||
.await;
|
||||
}
|
||||
if self.render_state.is_none() {
|
||||
match &self.adapter {
|
||||
|
@ -106,7 +108,7 @@ impl Painter {
|
|||
let swapchain_format = crate::preferred_framebuffer_format(
|
||||
&surface.get_supported_formats(adapter),
|
||||
);
|
||||
let rs = pollster::block_on(self.init_render_state(adapter, swapchain_format))?;
|
||||
let rs = self.init_render_state(adapter, swapchain_format).await?;
|
||||
self.render_state = Some(rs);
|
||||
}
|
||||
None => return Err(wgpu::RequestDeviceError {}),
|
||||
|
@ -171,7 +173,7 @@ impl Painter {
|
|||
///
|
||||
/// # Errors
|
||||
/// If the provided wgpu configuration does not match an available device.
|
||||
pub unsafe fn set_window(
|
||||
pub async unsafe fn set_window(
|
||||
&mut self,
|
||||
window: Option<&winit::window::Window>,
|
||||
) -> Result<(), wgpu::RequestDeviceError> {
|
||||
|
@ -179,7 +181,7 @@ impl Painter {
|
|||
Some(window) => {
|
||||
let surface = self.instance.create_surface(&window);
|
||||
|
||||
self.ensure_render_state_for_surface(&surface)?;
|
||||
self.ensure_render_state_for_surface(&surface).await?;
|
||||
|
||||
let size = window.inner_size();
|
||||
let width = size.width;
|
||||
|
|
Loading…
Reference in a new issue