1 type VkPhysicalDevice 2 def get_capabilities surface = 3 let mut capabilities = SurfaceCapabilitiesKhr@zero 4 vk/get_physical_device_surface_capabilities_khr self surface 5 capabilities@mut_ptr 6 |> assert_success 7 8 capabilities 9 10 def is_supported queue_family_index 11 surface = 12 let mut is_supported = 0 13 vk/get_physical_device_surface_support_khr self queue_family_index 14 surface 15 is_supported@mut_ptr 16 |> assert_success 17 18 is_supported <> 0 19 20 def get_present_modes surface = 21 let mut count = 0 22 vk/get_physical_device_surface_present_modes_khr self surface 23 count@mut_ptr 24 null 25 |> assert_success 26 27 let present_modes = Array<PresentModeKhr> count 28 vk/get_physical_device_surface_present_modes_khr self surface 29 count@mut_ptr 30 present_modes.as_mut_ptr 31 |> assert_success 32 33 List.from present_modes 34 35 def get_max_usable_sample_count = 36 let mut properties = PhysicalDeviceProperties@zero 37 vk/get_physical_device_properties self properties@mut_ptr 38 39 let flags = properties.limits.framebuffer_color_sample_counts 40 & properties.limits.framebuffer_depth_sample_counts 41 when 42 flags.contains SampleCountFlags/64 -> SampleCountFlags/64 43 flags.contains SampleCountFlags/32 -> SampleCountFlags/32 44 flags.contains SampleCountFlags/16 -> SampleCountFlags/16 45 flags.contains SampleCountFlags/8 -> SampleCountFlags/8 46 flags.contains SampleCountFlags/4 -> SampleCountFlags/4 47 flags.contains SampleCountFlags/2 -> SampleCountFlags/2 48 else -> SampleCountFlags/1 49 50 let find_supported_format (formats : Slice<VkFormat> 51 tiling : ImageTiling 52 features : FormatFeatureFlags) : VkFormat = 53 for format in formats do 54 let mut properties = FormatProperties@zero 55 vk/get_physical_device_format_properties self format properties@mut_ptr 56 57 if tiling == ImageTiling/Linear 58 && properties.linear_tiling_features.contains features 59 || tiling == ImageTiling/Optimal 60 && properties.optimal_tiling_features.contains features 61 then 62 return format 63 64 fail "cannot find supported format" 65 66 def find_depth_format = 67 let formats = [VkFormat/D32_SFLOAT 68 VkFormat/D32_SFLOAT_S8_UINT 69 VkFormat/D24_UNORM_S8_UINT] 70 71 find_supported_format formats ImageTiling/Optimal 72 FormatFeatureFlags/DepthStencilAttachment 73 74 def get_properties = 75 let mut physical_device_properties = PhysicalDeviceProperties@zero 76 vk/get_physical_device_properties self physical_device_properties@mut_ptr 77 78 physical_device_properties 79 80 def get_graphics_queue_family_index : u32 = 81 let mut count = 0 82 vk/get_physical_device_queue_family_properties self count@mut_ptr null 83 84 let properties = Array<QueueFamilyProperties> count 85 vk/get_physical_device_queue_family_properties self count@mut_ptr 86 properties.as_mut_ptr 87 let queue_index = 88 properties.find_index { _.queue_flags.contains QueueFlags/Graphics } 89 90 properties.discard 91 queue_index 92 93 def get_memory_type_index (type_filter : u32 94 property_flags : MemoryPropertyFlags) : u32 = 95 let mut memory_properties = PhysicalDeviceMemoryProperties@zero 96 vk/get_physical_device_memory_properties self memory_properties@mut_ptr 97 98 for i = 0 until memory_properties.memory_type_count do 99 if type_filter & 1 << i <> 0 100 && memory_properties.memory_types[i].property_flags 101 & property_flags == property_flags 102 then 103 return i 104 105 fail "cannot find memory type index" 106