1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use utils::c_bindings::*;
use utils::vk_traits::*;
use utils::vk_ptr::*;
use utils::vk_convert::*;
use std::os::raw::c_char;
use std::ptr;
use std::mem;
use vulkan::LavaResult;
use vulkan::vk::*;
pub fn vk_create_instance(create_info: VkInstanceCreateInfo) -> LavaResult<VkInstance> {
unsafe {
let raw_create_info = new_ptr_vk_value(&create_info);
let mut vk_result = 0;
let raw_instance = &mut mem::zeroed() as *mut RawVkInstance;
vk_result = vkCreateInstance(raw_create_info, ptr::null(), raw_instance);
let mut instance = new_vk_value(raw_instance);
if vk_result == 0 {
let fn_table = Box::into_raw(Box::new(VkFunctionTable::from_instance(*raw_instance)));
VkSetup::vk_setup(&mut instance, fn_table);
}
free_vk_ptr(raw_create_info);
if vk_result == 0 { Ok(instance) } else { Err((RawVkResult::vk_to_wrapped(&vk_result), instance)) }
}
}
pub fn vk_enumerate_instance_extension_properties(layer_name: Option<&str>) -> LavaResult<Vec<VkExtensionProperties>> {
unsafe {
let raw_layer_name = new_ptr_string_checked(&layer_name);
let mut vk_result = 0;
let mut raw_properties : *mut RawVkExtensionProperties = ptr::null_mut();
let raw_property_count = &mut mem::zeroed() as *mut u32;
vk_result = vkEnumerateInstanceExtensionProperties(raw_layer_name, raw_property_count, raw_properties);
raw_properties = calloc(*raw_property_count as usize, mem::size_of::<RawVkExtensionProperties>()) as *mut RawVkExtensionProperties;
vk_result = vkEnumerateInstanceExtensionProperties(raw_layer_name, raw_property_count, raw_properties);
let properties = new_vk_array(*raw_property_count, raw_properties);
free_ptr(raw_layer_name);
free(raw_properties as *mut u8);
if vk_result == 0 { Ok(properties) } else { Err((RawVkResult::vk_to_wrapped(&vk_result), properties)) }
}
}
pub fn vk_enumerate_instance_layer_properties() -> LavaResult<Vec<VkLayerProperties>> {
unsafe {
let mut vk_result = 0;
let mut raw_properties : *mut RawVkLayerProperties = ptr::null_mut();
let raw_property_count = &mut mem::zeroed() as *mut u32;
vk_result = vkEnumerateInstanceLayerProperties(raw_property_count, raw_properties);
raw_properties = calloc(*raw_property_count as usize, mem::size_of::<RawVkLayerProperties>()) as *mut RawVkLayerProperties;
vk_result = vkEnumerateInstanceLayerProperties(raw_property_count, raw_properties);
let properties = new_vk_array(*raw_property_count, raw_properties);
free(raw_properties as *mut u8);
if vk_result == 0 { Ok(properties) } else { Err((RawVkResult::vk_to_wrapped(&vk_result), properties)) }
}
}
pub fn vk_enumerate_instance_version() -> LavaResult<VkVersion> {
unsafe {
let mut vk_result = 0;
let raw_api_version = &mut mem::zeroed() as *mut u32;
vk_result = vkEnumerateInstanceVersion(raw_api_version);
let api_version = new_vk_value(raw_api_version);
if vk_result == 0 { Ok(api_version) } else { Err((RawVkResult::vk_to_wrapped(&vk_result), api_version)) }
}
}
extern {
fn vkCreateInstance(create_info: *mut RawVkInstanceCreateInfo, allocator: *const c_void, instance: *mut RawVkInstance) -> RawVkResult;
fn vkEnumerateInstanceExtensionProperties(layer_name: *mut c_char, property_count: *mut u32, properties: *mut RawVkExtensionProperties) -> RawVkResult;
fn vkEnumerateInstanceLayerProperties(property_count: *mut u32, properties: *mut RawVkLayerProperties) -> RawVkResult;
fn vkEnumerateInstanceVersion(api_version: *mut u32) -> RawVkResult;
}