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