diff --git a/crates/bevy_vulkan_render/src/lib.rs b/crates/bevy_vulkan_render/src/lib.rs index 1f89fd6..0560ba0 100644 --- a/crates/bevy_vulkan_render/src/lib.rs +++ b/crates/bevy_vulkan_render/src/lib.rs @@ -101,7 +101,50 @@ impl Plugin for RenderPlugin { } fn init_vulkan(app: &mut App) -> Option<()> { - let device = renderer::device::Device::new_from_default_desc(None, &[]).ok()?; + let instance_desc = renderer::instance::InstanceDesc { + app_name: Some("Vidya"), + layers: &[], + layer_settings: &[], + ..Default::default() + }; + let instance = renderer::instance::Instance::new(&instance_desc).ok()?; + + let required_extensions = [ + renderer::make_extension!(renderer::ash::ext::mesh_shader), + renderer::make_extension!(renderer::ash::ext::index_type_uint8), + renderer::make_extension!(renderer::ash::khr::spirv_1_4), + ]; + let features = renderer::PhysicalDeviceFeatures { + core: renderer::ash::vk::PhysicalDeviceFeatures::default() + .sampler_anisotropy(true) + .fill_mode_non_solid(true) + .multi_draw_indirect(true), + core11: renderer::ash::vk::PhysicalDeviceVulkan11Features::default() + .shader_draw_parameters(true), + core12: renderer::ash::vk::PhysicalDeviceVulkan12Features::default() + .shader_int8(true) + .runtime_descriptor_array(true) + .descriptor_binding_partially_bound(true) + .shader_sampled_image_array_non_uniform_indexing(true) + .descriptor_binding_sampled_image_update_after_bind(true) + .storage_buffer8_bit_access(true), + core13: renderer::ash::vk::PhysicalDeviceVulkan13Features::default() + .synchronization2(true) + .dynamic_rendering(true) + .maintenance4(true), + mesh_shader: Some( + renderer::ash::vk::PhysicalDeviceMeshShaderFeaturesEXT::default() + .mesh_shader(true) + .task_shader(true), + ), + }; + + let adapter = instance + .choose_adapter_default(None, &required_extensions, Some(&features)) + .ok()?; + let device = adapter + .create_logical_device(&instance, &required_extensions, features, None) + .ok()?; let device = RenderDevice { device }; app.insert_resource(device.clone()); diff --git a/crates/bevy_vulkan_render/src/window/mod.rs b/crates/bevy_vulkan_render/src/window/mod.rs index 9d6b95f..8442f60 100644 --- a/crates/bevy_vulkan_render/src/window/mod.rs +++ b/crates/bevy_vulkan_render/src/window/mod.rs @@ -139,27 +139,49 @@ pub(crate) fn configure_surfaces( window.handle.get_window_handle(), ); - let surface = WindowSurface::new( - (**device).clone(), - vk::Extent2D { - width: window.physical_width, - height: window.physical_height, - }, - window_handle, - display_handle, - ) + let surface = unsafe { + Surface::new_from_raw_window_handle( + device.instance(), + display_handle, + window_handle, + ) + } .expect("Failed to create window surface"); + surface + .configure( + &**device, + SwapchainConfiguration { + extent: vk::Extent2D { + width: window.physical_width, + height: window.physical_height, + }, + ..Default::default() + }, + ) + .expect("Failed to configure window surface"); SurfaceData { surface } }); if window.size_changed { + let config = surface + .surface + .swapchain() + .as_ref() + .map(|swapchain| swapchain.config().clone()) + .unwrap_or_default(); surface .surface - .recreate_with(Some(vk::Extent2D { - width: window.physical_width, - height: window.physical_height, - })) + .configure( + &**device, + SwapchainConfiguration { + extent: vk::Extent2D { + width: window.physical_width, + height: window.physical_height, + }, + ..config + }, + ) .expect("Failed to recreate surface"); } surfaces.configured.insert(window.entity);