Skip to content

Commit

Permalink
Make egui_wgpu::winit::Painter::set_window async (emilk#2434)
Browse files Browse the repository at this point in the history
* Make `egui_wgpu::winit::Painter::set_window` async

* Fix changelog link
  • Loading branch information
emilk authored Dec 12, 2022
1 parent 7a658e3 commit 6c4fc50
Show file tree
Hide file tree
Showing 6 changed files with 17 additions and 14 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion crates/eframe/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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.
Expand Down
6 changes: 3 additions & 3 deletions crates/eframe/src/native/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(())
Expand All @@ -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(())
Expand All @@ -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
};

Expand Down
1 change: 1 addition & 0 deletions crates/egui-wgpu/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 1 addition & 2 deletions crates/egui-wgpu/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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:
Expand Down
16 changes: 9 additions & 7 deletions crates/egui-wgpu/src/winit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,25 +88,27 @@ 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 {
Some(adapter) => {
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 {}),
Expand Down Expand Up @@ -171,15 +173,15 @@ 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> {
match window {
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;
Expand Down

0 comments on commit 6c4fc50

Please sign in to comment.