diff --git a/Cargo.lock b/Cargo.lock index 9366a7724..a2cc0fc0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/crates/eframe/Cargo.toml b/crates/eframe/Cargo.toml index e4a25b90f..ef528e40b 100644 --- a/crates/eframe/Cargo.toml +++ b/crates/eframe/Cargo.toml @@ -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. diff --git a/crates/eframe/src/native/run.rs b/crates/eframe/src/native/run.rs index a25ed4edd..865d8825f 100644 --- a/crates/eframe/src/native/run.rs +++ b/crates/eframe/src/native/run.rs @@ -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 }; diff --git a/crates/egui-wgpu/CHANGELOG.md b/crates/egui-wgpu/CHANGELOG.md index 6fc0bc286..01c122fc3 100644 --- a/crates/egui-wgpu/CHANGELOG.md +++ b/crates/egui-wgpu/CHANGELOG.md @@ -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 diff --git a/crates/egui-wgpu/Cargo.toml b/crates/egui-wgpu/Cargo.toml index 8f663c6d5..7f5afaf5a 100644 --- a/crates/egui-wgpu/Cargo.toml +++ b/crates/egui-wgpu/Cargo.toml @@ -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: diff --git a/crates/egui-wgpu/src/winit.rs b/crates/egui-wgpu/src/winit.rs index 064e0ca81..8154abe64 100644 --- a/crates/egui-wgpu/src/winit.rs +++ b/crates/egui-wgpu/src/winit.rs @@ -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;