vulkano/device/
properties.rs1use super::physical::{
2 ConformanceVersion, DriverId, MemoryDecompressionMethods, OpticalFlowGridSizes,
3 PhysicalDeviceType, PipelineRobustnessBufferBehavior, PipelineRobustnessImageBehavior,
4 PointClippingBehavior, RayTracingInvocationReorderMode, ShaderCoreProperties,
5 ShaderFloatControlsIndependence, SubgroupFeatures,
6};
7use crate::{
8 buffer::BufferUsage,
9 device::{
10 physical::{LayeredDriverUnderlyingApi, PhysicalDeviceSchedulingControlsFlags},
11 DeviceExtensions, QueueFlags,
12 },
13 image::{sampler::ycbcr::ChromaLocation, ImageLayout, ImageUsage, SampleCount, SampleCounts},
14 instance::InstanceExtensions,
15 memory::DeviceAlignment,
16 render_pass::ResolveModes,
17 shader::ShaderStages,
18 DeviceSize, Version,
19};
20use std::ffi::c_char;
21
22include!(concat!(env!("OUT_DIR"), "/properties.rs"));
24
25pub(crate) trait FromVulkan<F>
28where
29 Self: Sized,
30{
31 fn from_vulkan(val: F) -> Option<Self>;
32}
33
34impl FromVulkan<u8> for u8 {
35 #[inline]
36 fn from_vulkan(val: u8) -> Option<Self> {
37 Some(val)
38 }
39}
40
41impl<const N: usize> FromVulkan<[u8; N]> for [u8; N] {
42 #[inline]
43 fn from_vulkan(val: [u8; N]) -> Option<Self> {
44 Some(val)
45 }
46}
47
48impl FromVulkan<u32> for u32 {
49 #[inline]
50 fn from_vulkan(val: u32) -> Option<Self> {
51 Some(val)
52 }
53}
54
55impl<const N: usize> FromVulkan<[u32; N]> for [u32; N] {
56 #[inline]
57 fn from_vulkan(val: [u32; N]) -> Option<Self> {
58 Some(val)
59 }
60}
61
62impl FromVulkan<u64> for u64 {
63 #[inline]
64 fn from_vulkan(val: u64) -> Option<Self> {
65 Some(val)
66 }
67}
68
69impl FromVulkan<u64> for DeviceAlignment {
70 #[inline]
71 fn from_vulkan(val: u64) -> Option<Self> {
72 DeviceAlignment::new(val)
73 }
74}
75
76impl FromVulkan<usize> for usize {
77 #[inline]
78 fn from_vulkan(val: usize) -> Option<Self> {
79 Some(val)
80 }
81}
82
83impl FromVulkan<i32> for i32 {
84 #[inline]
85 fn from_vulkan(val: i32) -> Option<Self> {
86 Some(val)
87 }
88}
89
90impl FromVulkan<i64> for i64 {
91 #[inline]
92 fn from_vulkan(val: i64) -> Option<Self> {
93 Some(val)
94 }
95}
96
97impl FromVulkan<f32> for f32 {
98 #[inline]
99 fn from_vulkan(val: f32) -> Option<Self> {
100 Some(val)
101 }
102}
103
104impl<const N: usize> FromVulkan<[f32; N]> for [f32; N] {
105 #[inline]
106 fn from_vulkan(val: [f32; N]) -> Option<Self> {
107 Some(val)
108 }
109}
110
111impl<const N: usize> FromVulkan<[c_char; N]> for String {
112 #[inline]
114 fn from_vulkan(val: [c_char; N]) -> Option<Self> {
115 let bytes = unsafe { core::slice::from_raw_parts(val.as_ptr().cast(), val.len()) };
117 Some(
118 core::ffi::CStr::from_bytes_until_nul(bytes)
119 .unwrap()
120 .to_string_lossy()
121 .into_owned(),
122 )
123 }
124}
125
126impl FromVulkan<u32> for Version {
127 #[inline]
128 fn from_vulkan(val: u32) -> Option<Self> {
129 Some(val.into())
130 }
131}
132
133impl FromVulkan<ash::vk::Bool32> for bool {
134 #[inline]
135 fn from_vulkan(val: ash::vk::Bool32) -> Option<Self> {
136 Some(val != 0)
137 }
138}
139
140impl FromVulkan<ash::vk::ConformanceVersion> for ConformanceVersion {
141 #[inline]
142 fn from_vulkan(val: ash::vk::ConformanceVersion) -> Option<Self> {
143 Some(val.into())
144 }
145}
146
147impl FromVulkan<ash::vk::DriverId> for DriverId {
148 #[inline]
149 fn from_vulkan(val: ash::vk::DriverId) -> Option<Self> {
150 val.try_into().ok()
151 }
152}
153
154impl FromVulkan<ash::vk::Extent2D> for [u32; 2] {
155 #[inline]
156 fn from_vulkan(val: ash::vk::Extent2D) -> Option<Self> {
157 Some([val.width, val.height])
158 }
159}
160
161impl FromVulkan<ash::vk::MemoryDecompressionMethodFlagsNV> for MemoryDecompressionMethods {
162 #[inline]
163 fn from_vulkan(val: ash::vk::MemoryDecompressionMethodFlagsNV) -> Option<Self> {
164 Some(val.into())
165 }
166}
167
168impl FromVulkan<ash::vk::OpticalFlowGridSizeFlagsNV> for OpticalFlowGridSizes {
169 #[inline]
170 fn from_vulkan(val: ash::vk::OpticalFlowGridSizeFlagsNV) -> Option<Self> {
171 Some(val.into())
172 }
173}
174
175impl FromVulkan<ash::vk::PhysicalDeviceType> for PhysicalDeviceType {
176 #[inline]
177 fn from_vulkan(val: ash::vk::PhysicalDeviceType) -> Option<Self> {
178 val.try_into().ok()
179 }
180}
181
182impl FromVulkan<ash::vk::PipelineRobustnessBufferBehaviorEXT> for PipelineRobustnessBufferBehavior {
183 #[inline]
184 fn from_vulkan(val: ash::vk::PipelineRobustnessBufferBehaviorEXT) -> Option<Self> {
185 val.try_into().ok()
186 }
187}
188
189impl FromVulkan<ash::vk::PipelineRobustnessImageBehaviorEXT> for PipelineRobustnessImageBehavior {
190 #[inline]
191 fn from_vulkan(val: ash::vk::PipelineRobustnessImageBehaviorEXT) -> Option<Self> {
192 val.try_into().ok()
193 }
194}
195
196impl FromVulkan<ash::vk::PointClippingBehavior> for PointClippingBehavior {
197 #[inline]
198 fn from_vulkan(val: ash::vk::PointClippingBehavior) -> Option<Self> {
199 val.try_into().ok()
200 }
201}
202
203impl FromVulkan<ash::vk::QueueFlags> for QueueFlags {
204 #[inline]
205 fn from_vulkan(val: ash::vk::QueueFlags) -> Option<Self> {
206 Some(val.into())
207 }
208}
209
210impl FromVulkan<ash::vk::RayTracingInvocationReorderModeNV> for RayTracingInvocationReorderMode {
211 #[inline]
212 fn from_vulkan(val: ash::vk::RayTracingInvocationReorderModeNV) -> Option<Self> {
213 val.try_into().ok()
214 }
215}
216
217impl FromVulkan<ash::vk::ResolveModeFlags> for ResolveModes {
218 #[inline]
219 fn from_vulkan(val: ash::vk::ResolveModeFlags) -> Option<Self> {
220 Some(val.into())
221 }
222}
223
224impl FromVulkan<ash::vk::SampleCountFlags> for SampleCounts {
225 #[inline]
226 fn from_vulkan(val: ash::vk::SampleCountFlags) -> Option<Self> {
227 Some(val.into())
228 }
229}
230
231impl FromVulkan<ash::vk::SampleCountFlags> for SampleCount {
232 #[inline]
233 fn from_vulkan(val: ash::vk::SampleCountFlags) -> Option<Self> {
234 val.try_into().ok()
235 }
236}
237
238impl FromVulkan<ash::vk::ShaderCorePropertiesFlagsAMD> for ShaderCoreProperties {
239 #[inline]
240 fn from_vulkan(val: ash::vk::ShaderCorePropertiesFlagsAMD) -> Option<Self> {
241 Some(val.into())
242 }
243}
244
245impl FromVulkan<ash::vk::ShaderFloatControlsIndependence> for ShaderFloatControlsIndependence {
246 #[inline]
247 fn from_vulkan(val: ash::vk::ShaderFloatControlsIndependence) -> Option<Self> {
248 val.try_into().ok()
249 }
250}
251
252impl FromVulkan<ash::vk::ShaderStageFlags> for ShaderStages {
253 #[inline]
254 fn from_vulkan(val: ash::vk::ShaderStageFlags) -> Option<Self> {
255 Some(val.into())
256 }
257}
258
259impl FromVulkan<ash::vk::SubgroupFeatureFlags> for SubgroupFeatures {
260 #[inline]
261 fn from_vulkan(val: ash::vk::SubgroupFeatureFlags) -> Option<Self> {
262 Some(val.into())
263 }
264}
265
266impl FromVulkan<ash::vk::BufferUsageFlags> for BufferUsage {
267 #[inline]
268 fn from_vulkan(val: ash::vk::BufferUsageFlags) -> Option<Self> {
269 Some(val.into())
270 }
271}
272
273impl FromVulkan<ash::vk::ImageUsageFlags> for ImageUsage {
274 #[inline]
275 fn from_vulkan(val: ash::vk::ImageUsageFlags) -> Option<Self> {
276 Some(val.into())
277 }
278}
279
280impl FromVulkan<ash::vk::ChromaLocation> for ChromaLocation {
281 #[inline]
282 fn from_vulkan(val: ash::vk::ChromaLocation) -> Option<Self> {
283 val.try_into().ok()
284 }
285}
286
287impl FromVulkan<ash::vk::PhysicalDeviceSchedulingControlsFlagsARM>
288 for PhysicalDeviceSchedulingControlsFlags
289{
290 #[inline]
291 fn from_vulkan(val: ash::vk::PhysicalDeviceSchedulingControlsFlagsARM) -> Option<Self> {
292 Some(val.into())
293 }
294}
295
296impl FromVulkan<ash::vk::LayeredDriverUnderlyingApiMSFT> for LayeredDriverUnderlyingApi {
297 #[inline]
298 fn from_vulkan(val: ash::vk::LayeredDriverUnderlyingApiMSFT) -> Option<Self> {
299 val.try_into().ok()
300 }
301}
302
303impl FromVulkan<ash::vk::ImageLayout> for ImageLayout {
304 #[inline]
305 fn from_vulkan(val: ash::vk::ImageLayout) -> Option<Self> {
306 val.try_into().ok()
307 }
308}
309
310impl<U: for<'a> FromVulkan<&'a T>, T> FromVulkan<&[T]> for Vec<U> {
311 #[inline]
312 fn from_vulkan(val: &[T]) -> Option<Vec<U>> {
313 val.iter()
314 .map(|it| U::from_vulkan(it))
315 .collect::<Option<Vec<_>>>()
316 }
317}
318
319impl<U: FromVulkan<T>, T: Copy> FromVulkan<&T> for U {
320 #[inline]
321 fn from_vulkan(val: &T) -> Option<Self> {
322 U::from_vulkan(*val)
323 }
324}