multi-window
This commit is contained in:
		
							parent
							
								
									ee995bbd01
								
							
						
					
					
						commit
						99c86c0c85
					
				|  | @ -19,6 +19,7 @@ vk-mem = "0.4.0" | |||
| vk-sync = "0.1.6" | ||||
| winit = "0.30.5" | ||||
| tinyvec = "1.8" | ||||
| rand = "0.8.5" | ||||
| 
 | ||||
| futures = "0.3" | ||||
| smol = "2.0" | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ use tracing::info; | |||
| use winit::{ | ||||
|     application::ApplicationHandler, | ||||
|     dpi::{LogicalSize, PhysicalSize}, | ||||
|     event::ElementState, | ||||
|     event_loop::EventLoop, | ||||
|     raw_window_handle::{DisplayHandle, HasDisplayHandle, HasWindowHandle}, | ||||
|     window::{Window, WindowAttributes, WindowId}, | ||||
|  | @ -14,6 +15,7 @@ struct WindowState { | |||
|     last_resize_events: BTreeMap<WindowId, PhysicalSize<u32>>, | ||||
|     window_attrs: WindowAttributes, | ||||
|     window: Option<Window>, | ||||
|     windows: BTreeMap<WindowId, Window>, | ||||
|     renderer: Renderer, | ||||
| } | ||||
| 
 | ||||
|  | @ -21,6 +23,7 @@ impl WindowState { | |||
|     fn new(window_title: String, display: DisplayHandle) -> WindowState { | ||||
|         Self { | ||||
|             window: None, | ||||
|             windows: BTreeMap::new(), | ||||
|             last_resize_events: BTreeMap::new(), | ||||
|             window_attrs: WindowAttributes::default() | ||||
|                 .with_title(window_title) | ||||
|  | @ -49,17 +52,25 @@ impl WindowState { | |||
| 
 | ||||
|     fn handle_draw_request(&mut self, window_id: WindowId) { | ||||
|         _ = window_id; | ||||
|         info!("TODO: implement draw request"); | ||||
|         info!( | ||||
|             window_id = u64::from(window_id), | ||||
|             "TODO: implement draw request" | ||||
|         ); | ||||
|         self.renderer.debug_draw().expect("drawing"); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl ApplicationHandler for WindowState { | ||||
|     fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { | ||||
|         tracing::debug!("winit::resumed"); | ||||
|         self.window = | ||||
|             Some(event_loop.create_window(self.window_attrs.clone()).unwrap()); | ||||
|         let window_id = self.window.as_ref().unwrap().id(); | ||||
|     fn create_window( | ||||
|         &mut self, | ||||
|         event_loop: &winit::event_loop::ActiveEventLoop, | ||||
|     ) { | ||||
|         let window = event_loop | ||||
|             .create_window( | ||||
|                 self.window_attrs | ||||
|                     .clone() | ||||
|                     .with_window_level(winit::window::WindowLevel::AlwaysOnTop), | ||||
|             ) | ||||
|             .expect("new window"); | ||||
|         let window_id = window.id(); | ||||
|         tracing::info!(window = u64::from(window_id), "created new window"); | ||||
| 
 | ||||
|         let size = self | ||||
|  | @ -75,12 +86,18 @@ impl ApplicationHandler for WindowState { | |||
|         let _ = self.renderer.new_window_context( | ||||
|             extent, | ||||
|             window_id, | ||||
|             self.window | ||||
|                 .as_ref() | ||||
|                 .unwrap() | ||||
|                 .window_handle() | ||||
|                 .expect("window handle"), | ||||
|             window.window_handle().expect("window handle"), | ||||
|         ); | ||||
| 
 | ||||
|         self.windows.insert(window.id(), window); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl ApplicationHandler for WindowState { | ||||
|     fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { | ||||
|         tracing::debug!("winit::resumed"); | ||||
| 
 | ||||
|         self.create_window(event_loop); | ||||
|     } | ||||
| 
 | ||||
|     fn about_to_wait( | ||||
|  | @ -113,7 +130,28 @@ impl ApplicationHandler for WindowState { | |||
|                     window = u64::from(window_id), | ||||
|                     "window close requested" | ||||
|                 ); | ||||
|                 event_loop.exit(); | ||||
| 
 | ||||
|                 self.windows.remove(&window_id); | ||||
|                 self.renderer.window_contexts.remove(&window_id); | ||||
| 
 | ||||
|                 if self.windows.is_empty() { | ||||
|                     event_loop.exit(); | ||||
|                 } | ||||
|             } | ||||
|             winit::event::WindowEvent::KeyboardInput { | ||||
|                 event: | ||||
|                     winit::event::KeyEvent { | ||||
|                         physical_key: | ||||
|                             winit::keyboard::PhysicalKey::Code( | ||||
|                                 winit::keyboard::KeyCode::Space, | ||||
|                             ), | ||||
|                         state: ElementState::Pressed, | ||||
|                         repeat: false, | ||||
|                         .. | ||||
|                     }, | ||||
|                 .. | ||||
|             } => { | ||||
|                 self.create_window(event_loop); | ||||
|             } | ||||
|             winit::event::WindowEvent::KeyboardInput { | ||||
|                 device_id, | ||||
|  | @ -137,7 +175,7 @@ impl ApplicationHandler for WindowState { | |||
|             } | ||||
|             winit::event::WindowEvent::RedrawRequested => { | ||||
|                 self.handle_draw_request(window_id); | ||||
|                 if let Some(window) = self.window.as_ref() { | ||||
|                 if let Some(window) = self.windows.get(&window_id) { | ||||
|                     window.request_redraw(); | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ edition = "2021" | |||
| 
 | ||||
| [dependencies] | ||||
| tinyvec = {workspace = true} | ||||
| rand = {workspace = true} | ||||
| dyn-clone = "1" | ||||
| anyhow = "1.0.89" | ||||
| ash = "0.38.0" | ||||
|  |  | |||
|  | @ -8,9 +8,15 @@ use std::{ | |||
|     sync::{Arc, Mutex}, | ||||
| }; | ||||
| 
 | ||||
| use ash::{khr, vk, Entry}; | ||||
| use ash::{ | ||||
|     khr, | ||||
|     vk::{self, Handle}, | ||||
|     Entry, | ||||
| }; | ||||
| use dyn_clone::DynClone; | ||||
| use rand::{Rng, SeedableRng}; | ||||
| use tinyvec::{array_vec, ArrayVec}; | ||||
| use tracing::info; | ||||
| use winit::raw_window_handle::DisplayHandle; | ||||
| 
 | ||||
| mod commands; | ||||
|  | @ -526,6 +532,7 @@ struct Swapchain { | |||
| impl Drop for Swapchain { | ||||
|     fn drop(&mut self) { | ||||
|         unsafe { | ||||
|             info!("dropping swapchain {:?}", self.swapchain); | ||||
|             for view in &self.image_views { | ||||
|                 self.device.device.destroy_image_view(*view, None); | ||||
|             } | ||||
|  | @ -1571,8 +1578,12 @@ impl Renderer { | |||
| 
 | ||||
|             // let view = image.view(&dev, vk::ImageAspectFlags::COLOR)?;
 | ||||
| 
 | ||||
|             let [r, g, b] = rand::prelude::StdRng::seed_from_u64( | ||||
|                 ctx.surface.surface.as_raw(), | ||||
|             ) | ||||
|             .gen::<[f32; 3]>(); | ||||
|             let clear_values = vk::ClearColorValue { | ||||
|                 float32: [0.275, 0.769, 0.941, 1.0], | ||||
|                 float32: [r, g, b, 1.0], | ||||
|             }; | ||||
| 
 | ||||
|             unsafe { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue