use super::physical::{ ConformanceVersion, DriverId, MemoryDecompressionMethods, OpticalFlowGridSizes, PhysicalDeviceType, PipelineRobustnessBufferBehavior, PipelineRobustnessImageBehavior, PointClippingBehavior, RayTracingInvocationReorderMode, ShaderCoreProperties, ShaderFloatControlsIndependence, SubgroupFeatures, }; use crate::{ device::{DeviceExtensions, QueueFlags}, image::{SampleCount, SampleCounts}, instance::InstanceExtensions, memory::DeviceAlignment, render_pass::ResolveModes, shader::ShaderStages, DeviceSize, Version, }; use std::{ffi::CStr, os::raw::c_char}; // Generated by build.rs include!(concat!(env!("OUT_DIR"), "/properties.rs")); // A bit of a hack... // TODO: integrate into autogen? pub(crate) trait FromVulkan where Self: Sized, { fn from_vulkan(val: F) -> Option; } impl FromVulkan for u8 { #[inline] fn from_vulkan(val: u8) -> Option { Some(val) } } impl FromVulkan<[u8; N]> for [u8; N] { #[inline] fn from_vulkan(val: [u8; N]) -> Option { Some(val) } } impl FromVulkan for u32 { #[inline] fn from_vulkan(val: u32) -> Option { Some(val) } } impl FromVulkan<[u32; N]> for [u32; N] { #[inline] fn from_vulkan(val: [u32; N]) -> Option { Some(val) } } impl FromVulkan for u64 { #[inline] fn from_vulkan(val: u64) -> Option { Some(val) } } impl FromVulkan for DeviceAlignment { #[inline] fn from_vulkan(val: u64) -> Option { DeviceAlignment::new(val) } } impl FromVulkan for usize { #[inline] fn from_vulkan(val: usize) -> Option { Some(val) } } impl FromVulkan for i32 { #[inline] fn from_vulkan(val: i32) -> Option { Some(val) } } impl FromVulkan for i64 { #[inline] fn from_vulkan(val: i64) -> Option { Some(val) } } impl FromVulkan for f32 { #[inline] fn from_vulkan(val: f32) -> Option { Some(val) } } impl FromVulkan<[f32; N]> for [f32; N] { #[inline] fn from_vulkan(val: [f32; N]) -> Option { Some(val) } } impl FromVulkan<[c_char; N]> for String { #[inline] fn from_vulkan(val: [c_char; N]) -> Option { Some(unsafe { CStr::from_ptr(val.as_ptr()).to_string_lossy().into_owned() }) } } impl FromVulkan for Version { #[inline] fn from_vulkan(val: u32) -> Option { val.try_into().ok() } } impl FromVulkan for bool { #[inline] fn from_vulkan(val: ash::vk::Bool32) -> Option { Some(val != 0) } } impl FromVulkan for ConformanceVersion { #[inline] fn from_vulkan(val: ash::vk::ConformanceVersion) -> Option { Some(val.into()) } } impl FromVulkan for DriverId { #[inline] fn from_vulkan(val: ash::vk::DriverId) -> Option { val.try_into().ok() } } impl FromVulkan for [u32; 2] { #[inline] fn from_vulkan(val: ash::vk::Extent2D) -> Option { Some([val.width, val.height]) } } impl FromVulkan for MemoryDecompressionMethods { #[inline] fn from_vulkan(val: ash::vk::MemoryDecompressionMethodFlagsNV) -> Option { Some(val.into()) } } impl FromVulkan for OpticalFlowGridSizes { #[inline] fn from_vulkan(val: ash::vk::OpticalFlowGridSizeFlagsNV) -> Option { Some(val.into()) } } impl FromVulkan for PhysicalDeviceType { #[inline] fn from_vulkan(val: ash::vk::PhysicalDeviceType) -> Option { val.try_into().ok() } } impl FromVulkan for PipelineRobustnessBufferBehavior { #[inline] fn from_vulkan(val: ash::vk::PipelineRobustnessBufferBehaviorEXT) -> Option { val.try_into().ok() } } impl FromVulkan for PipelineRobustnessImageBehavior { #[inline] fn from_vulkan(val: ash::vk::PipelineRobustnessImageBehaviorEXT) -> Option { val.try_into().ok() } } impl FromVulkan for PointClippingBehavior { #[inline] fn from_vulkan(val: ash::vk::PointClippingBehavior) -> Option { val.try_into().ok() } } impl FromVulkan for QueueFlags { #[inline] fn from_vulkan(val: ash::vk::QueueFlags) -> Option { Some(val.into()) } } impl FromVulkan for RayTracingInvocationReorderMode { #[inline] fn from_vulkan(val: ash::vk::RayTracingInvocationReorderModeNV) -> Option { val.try_into().ok() } } impl FromVulkan for ResolveModes { #[inline] fn from_vulkan(val: ash::vk::ResolveModeFlags) -> Option { Some(val.into()) } } impl FromVulkan for SampleCounts { #[inline] fn from_vulkan(val: ash::vk::SampleCountFlags) -> Option { Some(val.into()) } } impl FromVulkan for SampleCount { #[inline] fn from_vulkan(val: ash::vk::SampleCountFlags) -> Option { val.try_into().ok() } } impl FromVulkan for ShaderCoreProperties { #[inline] fn from_vulkan(val: ash::vk::ShaderCorePropertiesFlagsAMD) -> Option { Some(val.into()) } } impl FromVulkan for ShaderFloatControlsIndependence { #[inline] fn from_vulkan(val: ash::vk::ShaderFloatControlsIndependence) -> Option { val.try_into().ok() } } impl FromVulkan for ShaderStages { #[inline] fn from_vulkan(val: ash::vk::ShaderStageFlags) -> Option { Some(val.into()) } } impl FromVulkan for SubgroupFeatures { #[inline] fn from_vulkan(val: ash::vk::SubgroupFeatureFlags) -> Option { Some(val.into()) } }