dear_imgui_wgpu/renderer/
lifecycle.rs1use super::WgpuRenderer;
2use crate::{FrameResources, RenderResources, RendererResult};
3
4impl WgpuRenderer {
5 pub fn new_frame(&mut self) -> RendererResult<()> {
9 let needs_recreation = if let Some(backend_data) = &self.backend_data {
10 backend_data.pipeline_state.is_none()
11 } else {
12 false
13 };
14
15 if needs_recreation {
16 let mut backend_data = self.backend_data.take().unwrap();
18 self.create_device_objects(&mut backend_data)?;
19 self.backend_data = Some(backend_data);
20 }
21 Ok(())
22 }
23
24 pub fn invalidate_device_objects(&mut self) -> RendererResult<()> {
28 if let Some(ref mut backend_data) = self.backend_data {
29 backend_data.pipeline_state = None;
30 backend_data.render_resources = RenderResources::new();
31
32 for frame_resources in &mut backend_data.frame_resources {
34 *frame_resources = FrameResources::new();
35 }
36 }
37
38 self.texture_manager.clear();
40 self.default_texture = None;
41
42 Ok(())
43 }
44
45 pub fn shutdown(&mut self) {
53 #[cfg(any(feature = "multi-viewport-winit", feature = "multi-viewport-sdl3"))]
54 self.clear_multi_viewport_renderer_state();
55 self.invalidate_device_objects().ok();
56 self.backend_data = None;
57 }
58
59 #[cfg(any(feature = "multi-viewport-winit", feature = "multi-viewport-sdl3"))]
60 pub(super) fn clear_multi_viewport_renderer_state(&mut self) {
61 #[cfg(feature = "multi-viewport-winit")]
64 {
65 super::multi_viewport::clear_for_drop(self as *mut WgpuRenderer);
66 }
67 #[cfg(feature = "multi-viewport-sdl3")]
68 {
69 super::multi_viewport_sdl3::clear_for_drop(self as *mut WgpuRenderer);
70 }
71 }
72}