diff --git a/crates/egui-wgpu/src/winit.rs b/crates/egui-wgpu/src/winit.rs index 26b3c86ae2c..189afbf9545 100644 --- a/crates/egui-wgpu/src/winit.rs +++ b/crates/egui-wgpu/src/winit.rs @@ -668,13 +668,6 @@ impl Painter { ); } - { - let mut renderer = render_state.renderer.write(); - for id in &textures_delta.free { - renderer.free_texture(id); - } - } - let encoded = { crate::profile_scope!("CommandEncoder::finish"); encoder.finish() @@ -691,6 +684,16 @@ impl Painter { vsync_sec += start.elapsed().as_secs_f32(); }; + // Free textures marked for destruction **after** queue submit since they might still be used in the current frame. + // Calling `wgpu::Texture::destroy` on a texture that is still in use would invalidate the command buffer(s) it is used in. + // However, once we called `wgpu::Queue::submit`, it is up for wgpu to determine how long the underlying gpu resource has to live. + { + let mut renderer = render_state.renderer.write(); + for id in &textures_delta.free { + renderer.free_texture(id); + } + } + let screenshot = if capture { self.screen_capture_state .as_ref()