| 24 | } |
| 25 | |
| 26 | pub async fn initialize<E>(title: &str) -> (EventLoop, App) { |
| 27 | let event_loop = winit::event_loop::EventLoopBuilder::with_user_event().build(); |
| 28 | let mut builder = winit::window::WindowBuilder::new(); |
| 29 | builder = builder.with_title(title); |
| 30 | |
| 31 | let window = builder.build(&event_loop).unwrap(); |
| 32 | |
| 33 | #[cfg(target_arch = "wasm32")] |
| 34 | { |
| 35 | use wasm_bindgen::{prelude::*, JsCast}; |
| 36 | use winit::platform::web::WindowExtWebSys; |
| 37 | |
| 38 | let canvas = window.canvas(); |
| 39 | // On wasm, append the canvas to the document body |
| 40 | web_sys::window() |
| 41 | .and_then(|win| win.document()) |
| 42 | .and_then(|doc| doc.body()) |
| 43 | .and_then(|body| body.append_child(&web_sys::Element::from(canvas)).ok()) |
| 44 | .expect("couldn't append canvas to document body"); |
| 45 | } |
| 46 | |
| 47 | let dx12_shader_compiler = wgpu::util::dx12_shader_compiler_from_env().unwrap_or_default(); |
| 48 | let gles_minor_version = wgpu::util::gles_minor_version_from_env().unwrap_or_default(); |
| 49 | |
| 50 | let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { |
| 51 | backends: wgpu::Backends::PRIMARY, |
| 52 | dx12_shader_compiler, |
| 53 | gles_minor_version, |
| 54 | flags: wgpu::InstanceFlags::from_build_config().with_env(), |
| 55 | }); |
| 56 | let surface = unsafe { instance.create_surface(&window) }.unwrap(); |
| 57 | let adapter = instance |
| 58 | .request_adapter(&wgpu::RequestAdapterOptions { |
| 59 | power_preference: wgpu::PowerPreference::HighPerformance, |
| 60 | compatible_surface: Some(&surface), |
| 61 | force_fallback_adapter: false, |
| 62 | }) |
| 63 | .await |
| 64 | .expect("No suitable GPU adapters found on the system!"); |
| 65 | |
| 66 | let optional_features: wgpu::Features = wgpu::Features::default(); |
| 67 | let required_features: wgpu::Features = |
| 68 | wgpu::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES; |
| 69 | |
| 70 | let adapter_features: wgpu::Features = wgpu::Features::default(); |
| 71 | let needed_limits = wgpu::Limits { |
| 72 | max_storage_buffers_per_shader_stage: 8, |
| 73 | max_storage_buffer_binding_size: 256 * 1024 * 1024, |
| 74 | ..wgpu::Limits::default() |
| 75 | }; |
| 76 | let trace_dir = std::env::var("WGPU_TRACE"); |
| 77 | |
| 78 | let (device, queue) = adapter |
| 79 | .request_device( |
| 80 | &wgpu::DeviceDescriptor { |
| 81 | label: None, |
| 82 | features: (optional_features & adapter_features) | required_features, |
| 83 | limits: needed_limits, |