Skip to main content

vulkano/device/
properties.rs

1use 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
22// Generated by build.rs
23include!(concat!(env!("OUT_DIR"), "/properties.rs"));
24
25// A bit of a hack...
26// TODO: integrate into autogen?
27pub(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    /// <https://github.com/ash-rs/ash/blob/b724b78dac8d83879ed7a1aad2b91bb9f2beb5cf/ash/src/vk/prelude.rs#L66-L73>
113    #[inline]
114    fn from_vulkan(val: [c_char; N]) -> Option<Self> {
115        // SAFETY: The cast from c_char to u8 is ok because a c_char is always one byte.
116        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}