diff --git a/src/app.rs b/src/app.rs index 644d46a..05a7f59 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,5 +1,4 @@ mod data; -mod functions; mod structs; use data::AppData; @@ -8,6 +7,7 @@ use structs::*; use ::anyhow::{anyhow, Result}; use ::lazy_static::lazy_static; use ::nalgebra_glm as glm; +use ::std::collections::HashSet; use ::std::mem::size_of; use ::std::ptr::copy_nonoverlapping as memcpy; use ::std::time::Instant; @@ -218,3 +218,111 @@ impl App { Ok(()) } } + +//================================================ +// Functions +//================================================ + +pub(crate) unsafe fn check_physical_device_extensions( + instance: &Instance, + physical_device: vk::PhysicalDevice, +) -> Result<()> { + let extensions = instance + .enumerate_device_extension_properties(physical_device, None)? + .iter() + .map(|e| e.extension_name) + .collect::>(); + + if DEVICE_EXTENSIONS.iter().all(|e| extensions.contains(e)) { + Ok(()) + } else { + Err(anyhow!(SuitabilityError( + "Missing required device extensions." + ))) + } +} + +pub(crate) fn get_swapchain_surface_format( + formats: &[vk::SurfaceFormatKHR], +) -> vk::SurfaceFormatKHR { + formats + .iter() + .cloned() + .find(|f| { + f.format == vk::Format::B8G8R8A8_SRGB + && f.color_space == vk::ColorSpaceKHR::SRGB_NONLINEAR + }) + .unwrap_or_else(|| formats[0]) +} + +pub(crate) fn get_swapchain_present_mode( + present_modes: &[vk::PresentModeKHR], +) -> vk::PresentModeKHR { + present_modes + .iter() + .cloned() + .find(|m| *m == vk::PresentModeKHR::MAILBOX) + .unwrap_or(vk::PresentModeKHR::FIFO) +} + +pub(crate) fn get_swapchain_extent( + window: &Window, + capabilities: vk::SurfaceCapabilitiesKHR, +) -> vk::Extent2D { + if capabilities.current_extent.width != u32::MAX { + capabilities.current_extent + } else { + let size = window.inner_size(); + let clamp = |min: u32, max: u32, v: u32| min.max(max.min(v)); + vk::Extent2D::builder() + .width(clamp( + capabilities.min_image_extent.width, + capabilities.max_image_extent.width, + size.width, + )) + .height(clamp( + capabilities.min_image_extent.height, + capabilities.max_image_extent.height, + size.height, + )) + .build() + } +} + +pub(crate) unsafe fn create_shader_module( + device: &Device, + bytecode: &[u8], +) -> Result { + let bytecode = Vec::::from(bytecode); + let (prefix, code, suffix) = bytecode.align_to::(); + if !prefix.is_empty() || !suffix.is_empty() { + return Err(anyhow!("Shader bytecode is not properly aligned.")); + } + + let info = vk::ShaderModuleCreateInfo::builder() + .code_size(bytecode.len()) + .code(code); + + Ok(device.create_shader_module(&info, None)?) +} + +pub(crate) unsafe fn create_image_view( + device: &Device, + image: vk::Image, + format: vk::Format, +) -> Result { + let subresource_range = vk::ImageSubresourceRange::builder() + .aspect_mask(vk::ImageAspectFlags::COLOR) + .base_mip_level(0) + .level_count(1) + .base_array_layer(0) + .layer_count(1); + + let info = vk::ImageViewCreateInfo::builder() + .image(image) + .view_type(vk::ImageViewType::_2D) + .format(format) + .subresource_range(subresource_range); + + Ok(device.create_image_view(&info, None)?) +} diff --git a/src/app/data.rs b/src/app/data.rs index 4e09966..ad936c2 100644 --- a/src/app/data.rs +++ b/src/app/data.rs @@ -1,5 +1,4 @@ #![allow(clippy::too_many_arguments)] -use super::functions::*; use super::*; use crate::VALIDATION_ENABLED; diff --git a/src/app/functions.rs b/src/app/functions.rs deleted file mode 100644 index 7ff80af..0000000 --- a/src/app/functions.rs +++ /dev/null @@ -1,90 +0,0 @@ -use super::*; - -use ::anyhow::{anyhow, Result}; -use ::std::collections::HashSet; -use ::vulkanalia::prelude::v1_0::*; -use ::winit::window::Window; - -pub unsafe fn check_physical_device_extensions( - instance: &Instance, - physical_device: vk::PhysicalDevice, -) -> Result<()> { - let extensions = instance - .enumerate_device_extension_properties(physical_device, None)? - .iter() - .map(|e| e.extension_name) - .collect::>(); - - if DEVICE_EXTENSIONS.iter().all(|e| extensions.contains(e)) { - Ok(()) - } else { - Err(anyhow!(SuitabilityError( - "Missing required device extensions." - ))) - } -} - -//================================================ -// Swapchain -//================================================ - -pub fn get_swapchain_surface_format(formats: &[vk::SurfaceFormatKHR]) -> vk::SurfaceFormatKHR { - formats - .iter() - .cloned() - .find(|f| { - f.format == vk::Format::B8G8R8A8_SRGB - && f.color_space == vk::ColorSpaceKHR::SRGB_NONLINEAR - }) - .unwrap_or_else(|| formats[0]) -} - -pub fn get_swapchain_present_mode(present_modes: &[vk::PresentModeKHR]) -> vk::PresentModeKHR { - present_modes - .iter() - .cloned() - .find(|m| *m == vk::PresentModeKHR::MAILBOX) - .unwrap_or(vk::PresentModeKHR::FIFO) -} - -pub fn get_swapchain_extent( - window: &Window, - capabilities: vk::SurfaceCapabilitiesKHR, -) -> vk::Extent2D { - if capabilities.current_extent.width != u32::MAX { - capabilities.current_extent - } else { - let size = window.inner_size(); - let clamp = |min: u32, max: u32, v: u32| min.max(max.min(v)); - vk::Extent2D::builder() - .width(clamp( - capabilities.min_image_extent.width, - capabilities.max_image_extent.width, - size.width, - )) - .height(clamp( - capabilities.min_image_extent.height, - capabilities.max_image_extent.height, - size.height, - )) - .build() - } -} - -//================================================ -// Pipeline -//================================================ - -pub unsafe fn create_shader_module(device: &Device, bytecode: &[u8]) -> Result { - let bytecode = Vec::::from(bytecode); - let (prefix, code, suffix) = bytecode.align_to::(); - if !prefix.is_empty() || !suffix.is_empty() { - return Err(anyhow!("Shader bytecode is not properly aligned.")); - } - - let info = vk::ShaderModuleCreateInfo::builder() - .code_size(bytecode.len()) - .code(code); - - Ok(device.create_shader_module(&info, None)?) -}