Browse Source

Make `egui_wgpu::winit::Painter::set_window` async (#2434)

* Make `egui_wgpu::winit::Painter::set_window` async

* Fix changelog link
pull/2439/head
Emil Ernerfeldt 2 years ago
committed by GitHub
parent
commit
6c4fc50fdf
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      Cargo.lock
  2. 3
      crates/eframe/Cargo.toml
  3. 6
      crates/eframe/src/native/run.rs
  4. 1
      crates/egui-wgpu/CHANGELOG.md
  5. 3
      crates/egui-wgpu/Cargo.toml
  6. 16
      crates/egui-wgpu/src/winit.rs

2
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",

3
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.

6
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
};

1
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

3
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:

16
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;

Loading…
Cancel
Save