use anyhow::{anyhow, Result}; use vulkanalia::prelude::v1_0::*; use crate::{ app::AppData, image_view::create_image_view, texture_image::{create_image, transition_image_layout}, }; pub(crate) unsafe fn create_depth_objects( instance: &Instance, device: &Device, data: &mut AppData, ) -> Result<()> { let format = get_depth_format(instance, data)?; let (depth_image, depth_image_memory) = create_image( instance, device, data, data.swapchain_extent.width, data.swapchain_extent.height, 1, data.msaa_samples, format, vk::ImageTiling::OPTIMAL, vk::ImageUsageFlags::DEPTH_STENCIL_ATTACHMENT, vk::MemoryPropertyFlags::DEVICE_LOCAL, )?; data.depth_image = depth_image; data.depth_image_memory = depth_image_memory; // Image View let aspects = vk::ImageAspectFlags::DEPTH; let mip_levels = 1; data.depth_image_view = create_image_view(device, &data.depth_image, &format, &aspects, &mip_levels)?; // Explicitly transitioning the depth image transition_image_layout( device, data, data.depth_image, format, vk::ImageLayout::UNDEFINED, vk::ImageLayout::DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1, )?; Ok(()) } pub(crate) unsafe fn get_depth_format(instance: &Instance, data: &AppData) -> Result { let candidates = &[ vk::Format::D32_SFLOAT, vk::Format::D32_SFLOAT_S8_UINT, vk::Format::D24_UNORM_S8_UINT, ]; get_supported_format( instance, data, candidates, vk::ImageTiling::OPTIMAL, vk::FormatFeatureFlags::DEPTH_STENCIL_ATTACHMENT, ) } unsafe fn get_supported_format( instance: &Instance, data: &AppData, candidates: &[vk::Format], tiling: vk::ImageTiling, features: vk::FormatFeatureFlags, ) -> Result { candidates .iter() .cloned() .find(|f| { let properties = instance.get_physical_device_format_properties(data.physical_device, *f); match tiling { vk::ImageTiling::LINEAR => properties.linear_tiling_features.contains(features), vk::ImageTiling::OPTIMAL => properties.optimal_tiling_features.contains(features), _ => false, } }) .ok_or_else(|| anyhow!("Failed to find supported format!")) }