1 use super::physical::{ 2 ConformanceVersion, DriverId, MemoryDecompressionMethods, OpticalFlowGridSizes, 3 PhysicalDeviceType, PipelineRobustnessBufferBehavior, PipelineRobustnessImageBehavior, 4 PointClippingBehavior, RayTracingInvocationReorderMode, ShaderCoreProperties, 5 ShaderFloatControlsIndependence, SubgroupFeatures, 6 }; 7 use crate::{ 8 device::{DeviceExtensions, QueueFlags}, 9 image::{SampleCount, SampleCounts}, 10 instance::InstanceExtensions, 11 memory::DeviceAlignment, 12 render_pass::ResolveModes, 13 shader::ShaderStages, 14 DeviceSize, Version, 15 }; 16 use std::{ffi::CStr, os::raw::c_char}; 17 18 // Generated by build.rs 19 include!(concat!(env!("OUT_DIR"), "/properties.rs")); 20 21 // A bit of a hack... 22 // TODO: integrate into autogen? 23 pub(crate) trait FromVulkan<F> 24 where 25 Self: Sized, 26 { from_vulkan(val: F) -> Option<Self>27 fn from_vulkan(val: F) -> Option<Self>; 28 } 29 30 impl FromVulkan<u8> for u8 { 31 #[inline] from_vulkan(val: u8) -> Option<Self>32 fn from_vulkan(val: u8) -> Option<Self> { 33 Some(val) 34 } 35 } 36 37 impl<const N: usize> FromVulkan<[u8; N]> for [u8; N] { 38 #[inline] from_vulkan(val: [u8; N]) -> Option<Self>39 fn from_vulkan(val: [u8; N]) -> Option<Self> { 40 Some(val) 41 } 42 } 43 44 impl FromVulkan<u32> for u32 { 45 #[inline] from_vulkan(val: u32) -> Option<Self>46 fn from_vulkan(val: u32) -> Option<Self> { 47 Some(val) 48 } 49 } 50 51 impl<const N: usize> FromVulkan<[u32; N]> for [u32; N] { 52 #[inline] from_vulkan(val: [u32; N]) -> Option<Self>53 fn from_vulkan(val: [u32; N]) -> Option<Self> { 54 Some(val) 55 } 56 } 57 58 impl FromVulkan<u64> for u64 { 59 #[inline] from_vulkan(val: u64) -> Option<Self>60 fn from_vulkan(val: u64) -> Option<Self> { 61 Some(val) 62 } 63 } 64 65 impl FromVulkan<u64> for DeviceAlignment { 66 #[inline] from_vulkan(val: u64) -> Option<Self>67 fn from_vulkan(val: u64) -> Option<Self> { 68 DeviceAlignment::new(val) 69 } 70 } 71 72 impl FromVulkan<usize> for usize { 73 #[inline] from_vulkan(val: usize) -> Option<Self>74 fn from_vulkan(val: usize) -> Option<Self> { 75 Some(val) 76 } 77 } 78 79 impl FromVulkan<i32> for i32 { 80 #[inline] from_vulkan(val: i32) -> Option<Self>81 fn from_vulkan(val: i32) -> Option<Self> { 82 Some(val) 83 } 84 } 85 86 impl FromVulkan<i64> for i64 { 87 #[inline] from_vulkan(val: i64) -> Option<Self>88 fn from_vulkan(val: i64) -> Option<Self> { 89 Some(val) 90 } 91 } 92 93 impl FromVulkan<f32> for f32 { 94 #[inline] from_vulkan(val: f32) -> Option<Self>95 fn from_vulkan(val: f32) -> Option<Self> { 96 Some(val) 97 } 98 } 99 100 impl<const N: usize> FromVulkan<[f32; N]> for [f32; N] { 101 #[inline] from_vulkan(val: [f32; N]) -> Option<Self>102 fn from_vulkan(val: [f32; N]) -> Option<Self> { 103 Some(val) 104 } 105 } 106 107 impl<const N: usize> FromVulkan<[c_char; N]> for String { 108 #[inline] from_vulkan(val: [c_char; N]) -> Option<Self>109 fn from_vulkan(val: [c_char; N]) -> Option<Self> { 110 Some(unsafe { CStr::from_ptr(val.as_ptr()).to_string_lossy().into_owned() }) 111 } 112 } 113 114 impl FromVulkan<u32> for Version { 115 #[inline] from_vulkan(val: u32) -> Option<Self>116 fn from_vulkan(val: u32) -> Option<Self> { 117 val.try_into().ok() 118 } 119 } 120 121 impl FromVulkan<ash::vk::Bool32> for bool { 122 #[inline] from_vulkan(val: ash::vk::Bool32) -> Option<Self>123 fn from_vulkan(val: ash::vk::Bool32) -> Option<Self> { 124 Some(val != 0) 125 } 126 } 127 128 impl FromVulkan<ash::vk::ConformanceVersion> for ConformanceVersion { 129 #[inline] from_vulkan(val: ash::vk::ConformanceVersion) -> Option<Self>130 fn from_vulkan(val: ash::vk::ConformanceVersion) -> Option<Self> { 131 Some(val.into()) 132 } 133 } 134 135 impl FromVulkan<ash::vk::DriverId> for DriverId { 136 #[inline] from_vulkan(val: ash::vk::DriverId) -> Option<Self>137 fn from_vulkan(val: ash::vk::DriverId) -> Option<Self> { 138 val.try_into().ok() 139 } 140 } 141 142 impl FromVulkan<ash::vk::Extent2D> for [u32; 2] { 143 #[inline] from_vulkan(val: ash::vk::Extent2D) -> Option<Self>144 fn from_vulkan(val: ash::vk::Extent2D) -> Option<Self> { 145 Some([val.width, val.height]) 146 } 147 } 148 149 impl FromVulkan<ash::vk::MemoryDecompressionMethodFlagsNV> for MemoryDecompressionMethods { 150 #[inline] from_vulkan(val: ash::vk::MemoryDecompressionMethodFlagsNV) -> Option<Self>151 fn from_vulkan(val: ash::vk::MemoryDecompressionMethodFlagsNV) -> Option<Self> { 152 Some(val.into()) 153 } 154 } 155 156 impl FromVulkan<ash::vk::OpticalFlowGridSizeFlagsNV> for OpticalFlowGridSizes { 157 #[inline] from_vulkan(val: ash::vk::OpticalFlowGridSizeFlagsNV) -> Option<Self>158 fn from_vulkan(val: ash::vk::OpticalFlowGridSizeFlagsNV) -> Option<Self> { 159 Some(val.into()) 160 } 161 } 162 163 impl FromVulkan<ash::vk::PhysicalDeviceType> for PhysicalDeviceType { 164 #[inline] from_vulkan(val: ash::vk::PhysicalDeviceType) -> Option<Self>165 fn from_vulkan(val: ash::vk::PhysicalDeviceType) -> Option<Self> { 166 val.try_into().ok() 167 } 168 } 169 170 impl FromVulkan<ash::vk::PipelineRobustnessBufferBehaviorEXT> for PipelineRobustnessBufferBehavior { 171 #[inline] from_vulkan(val: ash::vk::PipelineRobustnessBufferBehaviorEXT) -> Option<Self>172 fn from_vulkan(val: ash::vk::PipelineRobustnessBufferBehaviorEXT) -> Option<Self> { 173 val.try_into().ok() 174 } 175 } 176 177 impl FromVulkan<ash::vk::PipelineRobustnessImageBehaviorEXT> for PipelineRobustnessImageBehavior { 178 #[inline] from_vulkan(val: ash::vk::PipelineRobustnessImageBehaviorEXT) -> Option<Self>179 fn from_vulkan(val: ash::vk::PipelineRobustnessImageBehaviorEXT) -> Option<Self> { 180 val.try_into().ok() 181 } 182 } 183 184 impl FromVulkan<ash::vk::PointClippingBehavior> for PointClippingBehavior { 185 #[inline] from_vulkan(val: ash::vk::PointClippingBehavior) -> Option<Self>186 fn from_vulkan(val: ash::vk::PointClippingBehavior) -> Option<Self> { 187 val.try_into().ok() 188 } 189 } 190 191 impl FromVulkan<ash::vk::QueueFlags> for QueueFlags { 192 #[inline] from_vulkan(val: ash::vk::QueueFlags) -> Option<Self>193 fn from_vulkan(val: ash::vk::QueueFlags) -> Option<Self> { 194 Some(val.into()) 195 } 196 } 197 198 impl FromVulkan<ash::vk::RayTracingInvocationReorderModeNV> for RayTracingInvocationReorderMode { 199 #[inline] from_vulkan(val: ash::vk::RayTracingInvocationReorderModeNV) -> Option<Self>200 fn from_vulkan(val: ash::vk::RayTracingInvocationReorderModeNV) -> Option<Self> { 201 val.try_into().ok() 202 } 203 } 204 205 impl FromVulkan<ash::vk::ResolveModeFlags> for ResolveModes { 206 #[inline] from_vulkan(val: ash::vk::ResolveModeFlags) -> Option<Self>207 fn from_vulkan(val: ash::vk::ResolveModeFlags) -> Option<Self> { 208 Some(val.into()) 209 } 210 } 211 212 impl FromVulkan<ash::vk::SampleCountFlags> for SampleCounts { 213 #[inline] from_vulkan(val: ash::vk::SampleCountFlags) -> Option<Self>214 fn from_vulkan(val: ash::vk::SampleCountFlags) -> Option<Self> { 215 Some(val.into()) 216 } 217 } 218 219 impl FromVulkan<ash::vk::SampleCountFlags> for SampleCount { 220 #[inline] from_vulkan(val: ash::vk::SampleCountFlags) -> Option<Self>221 fn from_vulkan(val: ash::vk::SampleCountFlags) -> Option<Self> { 222 val.try_into().ok() 223 } 224 } 225 226 impl FromVulkan<ash::vk::ShaderCorePropertiesFlagsAMD> for ShaderCoreProperties { 227 #[inline] from_vulkan(val: ash::vk::ShaderCorePropertiesFlagsAMD) -> Option<Self>228 fn from_vulkan(val: ash::vk::ShaderCorePropertiesFlagsAMD) -> Option<Self> { 229 Some(val.into()) 230 } 231 } 232 233 impl FromVulkan<ash::vk::ShaderFloatControlsIndependence> for ShaderFloatControlsIndependence { 234 #[inline] from_vulkan(val: ash::vk::ShaderFloatControlsIndependence) -> Option<Self>235 fn from_vulkan(val: ash::vk::ShaderFloatControlsIndependence) -> Option<Self> { 236 val.try_into().ok() 237 } 238 } 239 240 impl FromVulkan<ash::vk::ShaderStageFlags> for ShaderStages { 241 #[inline] from_vulkan(val: ash::vk::ShaderStageFlags) -> Option<Self>242 fn from_vulkan(val: ash::vk::ShaderStageFlags) -> Option<Self> { 243 Some(val.into()) 244 } 245 } 246 247 impl FromVulkan<ash::vk::SubgroupFeatureFlags> for SubgroupFeatures { 248 #[inline] from_vulkan(val: ash::vk::SubgroupFeatureFlags) -> Option<Self>249 fn from_vulkan(val: ash::vk::SubgroupFeatureFlags) -> Option<Self> { 250 Some(val.into()) 251 } 252 } 253