use crate::raw::bindings::*;
#[derive(Clone)]
pub struct DeviceFeatures {
pub features10: VkPhysicalDeviceFeatures,
pub features11: VkPhysicalDeviceVulkan11Features,
pub features12: VkPhysicalDeviceVulkan12Features,
pub features13: VkPhysicalDeviceVulkan13Features,
}
impl Default for DeviceFeatures {
fn default() -> Self {
Self {
features10: VkPhysicalDeviceFeatures::default(),
features11: VkPhysicalDeviceVulkan11Features {
sType: VkStructureType::STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES,
..Default::default()
},
features12: VkPhysicalDeviceVulkan12Features {
sType: VkStructureType::STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
..Default::default()
},
features13: VkPhysicalDeviceVulkan13Features {
sType: VkStructureType::STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,
..Default::default()
},
}
}
}
impl DeviceFeatures {
pub fn new() -> Self {
Self::default()
}
pub fn with_robust_buffer_access(mut self) -> Self {
self.features10.robustBufferAccess = 1;
self
}
pub fn with_sampler_anisotropy(mut self) -> Self {
self.features10.samplerAnisotropy = 1;
self
}
pub fn with_fill_mode_non_solid(mut self) -> Self {
self.features10.fillModeNonSolid = 1;
self
}
pub fn with_pipeline_statistics_query(mut self) -> Self {
self.features10.pipelineStatisticsQuery = 1;
self
}
pub fn with_shader_int64(mut self) -> Self {
self.features10.shaderInt64 = 1;
self
}
pub fn with_shader_float64(mut self) -> Self {
self.features10.shaderFloat64 = 1;
self
}
pub fn with_buffer_device_address(mut self) -> Self {
self.features12.bufferDeviceAddress = 1;
self
}
pub fn with_timeline_semaphore(mut self) -> Self {
self.features12.timelineSemaphore = 1;
self
}
pub fn with_host_query_reset(mut self) -> Self {
self.features12.hostQueryReset = 1;
self
}
pub fn with_descriptor_indexing(mut self) -> Self {
self.features12.descriptorIndexing = 1;
self
}
pub fn with_runtime_descriptor_array(mut self) -> Self {
self.features12.runtimeDescriptorArray = 1;
self
}
pub fn with_shader_int8(mut self) -> Self {
self.features12.shaderInt8 = 1;
self
}
pub fn with_shader_float16(mut self) -> Self {
self.features12.shaderFloat16 = 1;
self
}
pub fn with_synchronization2(mut self) -> Self {
self.features13.synchronization2 = 1;
self
}
pub fn with_dynamic_rendering(mut self) -> Self {
self.features13.dynamicRendering = 1;
self
}
pub fn with_maintenance4(mut self) -> Self {
self.features13.maintenance4 = 1;
self
}
pub fn with_all_features10(mut self, features10: VkPhysicalDeviceFeatures) -> Self {
self.features10 = features10;
self
}
}
impl std::fmt::Debug for DeviceFeatures {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("DeviceFeatures")
.field(
"buffer_device_address",
&(self.features12.bufferDeviceAddress != 0),
)
.field(
"timeline_semaphore",
&(self.features12.timelineSemaphore != 0),
)
.field("synchronization2", &(self.features13.synchronization2 != 0))
.field(
"sampler_anisotropy",
&(self.features10.samplerAnisotropy != 0),
)
.finish_non_exhaustive()
}
}