aa7b429f4f
* Mark EntryCustom::new_custom as unsafe Passing a badly-behaved `load` function can invoke undefined behavior. * Document required feature for Entry * Support linking Vulkan directly This is the preferred pattern in most environments when an application cannot function without Vulkan, as it saves the libloading dependency, eliminates an error case, and makes the Vulkan dependency visible to the OS. * Rename libloading feature to "loaded" * Link by default * Guide users towards linking the loader directly * Remove unnecessary error type InstanceError::LoadError was never constructed. * Unify entry types Simplifies the interface and allows a bunch of code to become monomorphic.
54 lines
1.8 KiB
Rust
54 lines
1.8 KiB
Rust
//! Demonstrate interop with beryllium/SDL windows.
|
|
//!
|
|
//! Sample creates a surface from a window through the
|
|
//! platform agnostic window handle trait.
|
|
//!
|
|
//! On instance extensions platform specific extensions need to be enabled.
|
|
|
|
use ash::vk;
|
|
use std::error::Error;
|
|
|
|
fn main() -> Result<(), Box<dyn Error>> {
|
|
let mut events_loop = winit::EventsLoop::new();
|
|
let window = winit::WindowBuilder::new()
|
|
.with_dimensions((800, 600).into())
|
|
.build(&events_loop)?;
|
|
|
|
unsafe {
|
|
let entry = ash::Entry::new();
|
|
let surface_extensions = ash_window::enumerate_required_extensions(&window)?;
|
|
let instance_extensions = surface_extensions
|
|
.iter()
|
|
.map(|ext| ext.as_ptr())
|
|
.collect::<Vec<_>>();
|
|
let app_desc = vk::ApplicationInfo::builder().api_version(vk::make_api_version(0, 1, 0, 0));
|
|
let instance_desc = vk::InstanceCreateInfo::builder()
|
|
.application_info(&app_desc)
|
|
.enabled_extension_names(&instance_extensions);
|
|
|
|
let instance = entry.create_instance(&instance_desc, None)?;
|
|
|
|
// Create a surface from winit window.
|
|
let surface = ash_window::create_surface(&entry, &instance, &window, None)?;
|
|
let surface_fn = ash::extensions::khr::Surface::new(&entry, &instance);
|
|
println!("surface: {:?}", surface);
|
|
|
|
let mut running = true;
|
|
while running {
|
|
events_loop.poll_events(|event| {
|
|
if let winit::Event::WindowEvent {
|
|
event: winit::WindowEvent::CloseRequested,
|
|
..
|
|
} = event
|
|
{
|
|
running = false;
|
|
}
|
|
});
|
|
}
|
|
|
|
surface_fn.destroy_surface(surface, None);
|
|
}
|
|
|
|
Ok(())
|
|
}
|