Раскомментирующая строка 96:
// extension_names.push(String::from(VK_KHR_SURFACE)); // uncomment to see error
приведет к сбою CreateInstance
в строке 121.
Я следую учебнику Vulkan , в котором упоминается, что расширения активируются путем определения VK_USE_PLATFORM_WIN32_KHR
. Ну, я использую vk-sys
(есть ли другие привязки Rust Vulkan, которые я должен использовать вместо этого?), Который является ящиком, используемым Vulkano . Я искал хранилище Вулкано, и там нет упоминания о VK_USE_PLATFORM_WIN32_KHR
. Его также нет в vk-sys docs .
Есть ли способ определить VK_USE_PLATFORM_WIN32_KHR
в Rust или он не нужен? Или мне нужно еще кое-что сделать?
extern crate shared_library;
extern crate vk_sys as vk;
use std::mem;
use std::os::raw::c_char;
use std::os::raw::c_void;
use std::ptr;
use std::path::Path;
const VK_KHR_SURFACE: &'static str = "VK_KHR_surface\0"; // base surface that all platforms need
const VK_KHR_WIN32_SURFACE: &'static str = "VK_KHR_win32_surface\0";
// https://github.com/vulkano-rs/vulkano/blob/f4f91f7ee1aace3062571bc1f678b702fbd020cd/vulkano/src/instance/loader.rs#L36
pub unsafe trait Loader {
fn get_instance_proc_addr(
&self,
instance: vk::Instance,
name: *const c_char,
) -> extern "system" fn() -> ();
}
// https://github.com/vulkano-rs/vulkano/blob/f4f91f7ee1aace3062571bc1f678b702fbd020cd/vulkano/src/instance/loader.rs#L56
pub struct DynamicLibraryLoader {
vk_lib: shared_library::dynamic_library::DynamicLibrary,
get_proc_addr: extern "system" fn(instance: vk::Instance, pName: *const c_char)
-> extern "system" fn() -> (),
}
// removed error checking
// https://github.com/vulkano-rs/vulkano/blob/71d90e562a63f2a9aee40abaa3b59949e909015d/vulkano/src/instance/loader.rs#L63
impl DynamicLibraryLoader {
pub unsafe fn new<P>(path: P) -> DynamicLibraryLoader
where
P: AsRef<Path>,
{
let vk_lib =
shared_library::dynamic_library::DynamicLibrary::open(Some(path.as_ref())).unwrap();
let get_proc_addr = {
let ptr: *mut c_void = vk_lib.symbol("vkGetInstanceProcAddr").unwrap();
mem::transmute(ptr)
};
DynamicLibraryLoader {
vk_lib,
get_proc_addr,
}
}
}
// https://github.com/vulkano-rs/vulkano/blob/f4f91f7ee1aace3062571bc1f678b702fbd020cd/vulkano/src/instance/loader.rs#L94
unsafe impl Loader for DynamicLibraryLoader {
#[inline]
fn get_instance_proc_addr(
&self,
instance: vk::Instance,
name: *const c_char,
) -> extern "system" fn() -> () {
(self.get_proc_addr)(instance, name)
}
}
// For Windows. For other OS, see:
// https://github.com/vulkano-rs/vulkano/blob/71d90e562a63f2a9aee40abaa3b59949e909015d/vulkano/src/instance/loader.rs#L171
fn get_path() -> &'static Path {
Path::new("vulkan-1.dll")
}
// return codes: https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VkResult
fn check_result(msg: &str, result: vk::Result) {
match result {
vk::SUCCESS => println!("{}: {}", msg, "SUCCESS"),
vk::NOT_READY => println!("{}: {}", msg, "NOT_READY"),
vk::TIMEOUT => println!("{}: {}", msg, "TIMEOUT"),
vk::EVENT_SET => println!("{}: {}", msg, "EVENT_SET"),
vk::EVENT_RESET => println!("{}: {}", msg, "EVENT_RESET"),
vk::INCOMPLETE => println!("{}: {}", msg, "INCOMPLETE"),
vk::ERROR_OUT_OF_HOST_MEMORY => println!("{}: {}", msg, "ERROR_OUT_OF_HOST_MEMORY"),
vk::ERROR_OUT_OF_DEVICE_MEMORY => println!("{}: {}", msg, "ERROR_OUT_OF_DEVICE_MEMORY"),
vk::ERROR_INITIALIZATION_FAILED => println!("{}: {}", msg, "ERROR_INITIALIZATION_FAILED"),
vk::ERROR_DEVICE_LOST => println!("{}: {}", msg, "ERROR_DEVICE_LOST"),
vk::ERROR_MEMORY_MAP_FAILED => println!("{}: {}", msg, "ERROR_MEMORY_MAP_FAILED"),
vk::ERROR_LAYER_NOT_PRESENT => println!("{}: {}", msg, "ERROR_LAYER_NOT_PRESENT"),
vk::ERROR_EXTENSION_NOT_PRESENT => println!("{}: {}", msg, "ERROR_EXTENSION_NOT_PRESENT"),
vk::ERROR_FEATURE_NOT_PRESENT => println!("{}: {}", msg, "ERROR_FEATURE_NOT_PRESENT"),
vk::ERROR_INCOMPATIBLE_DRIVER => println!("{}: {}", msg, "ERROR_INCOMPATIBLE_DRIVER"),
vk::ERROR_TOO_MANY_OBJECTS => println!("{}: {}", msg, "ERROR_TOO_MANY_OBJECTS"),
vk::ERROR_FORMAT_NOT_SUPPORTED => println!("{}: {}", msg, "ERROR_FORMAT_NOT_SUPPORTED"),
// vk::ERROR_FRAGMENTED_POOL => println!("{}: {}", msg, "ERROR_FRAGMENTED_POOL"),
_ => println!("VK_ERR: {:?}", result),
};
}
fn main() {
//********************************************************************************************************** Instance Create Info
let mut extension_names: Vec<String> = Vec::new();
// extension_names.push(String::from(VK_KHR_SURFACE)); // uncomment to see error
extension_names.push(String::from(VK_KHR_WIN32_SURFACE));
println!("extension_names: {:?}", extension_names);
let instance_create_info = vk::InstanceCreateInfo {
sType: vk::STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
pNext: ptr::null(),
flags: 0,
pApplicationInfo: ptr::null(),
enabledLayerCount: 0,
ppEnabledLayerNames: ptr::null(),
enabledExtensionCount: extension_names.len() as u32,
ppEnabledExtensionNames: extension_names.as_ptr() as *const *const i8,
};
//********************************************************************************************************** Instance Creation
let mut instance: vk::Instance = unsafe {mem::uninitialized()};
let loader = unsafe { DynamicLibraryLoader::new(get_path()) };
let entry_points = vk::EntryPoints::load(|name| unsafe {
mem::transmute(loader.get_instance_proc_addr(instance, name.as_ptr()))
});
unsafe {
check_result("create instance", entry_points.CreateInstance(&instance_create_info, ptr::null(), &mut instance));
}
}
Cargo.toml:
[dependencies]
vk-sys = "*"
shared_library = "*"