Compare commits

...

3 commits

Author SHA1 Message Date
9b5a011afc Suppress clippy warning about wordy fn return type 2024-03-17 18:53:55 +09:00
25b80b0d6d Refactor: Fix minor clippy warning 2024-03-17 18:53:07 +09:00
bf1fc24011 Refactor: Split init code into function
Previous implementation originally had "init_vulkan" initialization
struct creation seperated into a different function, but was merged into
"init_vulkan" due to memory issues. More specifically, the struct
creation function used pointers to local variables that were not used
until the function went out of scope, causing the local variables to be
cleaned up and leaving the pointers in the "struct info" struct invalid
when they were actually used in a `ffi::Vk...` call.

This refactoring ensures that pointers to variables created in the
mentioned function does not become invalid when the function ends by
stored the pointees in `Pin<Box<...>>` and returning them with the
"struct info" struct at the end of the mentioned function.
2024-03-17 18:46:01 +09:00

View file

@ -3,6 +3,8 @@ mod math3d;
use std::collections::HashSet; use std::collections::HashSet;
use std::ffi::{c_void, CStr, CString}; use std::ffi::{c_void, CStr, CString};
use std::ops::Deref;
use std::pin::Pin;
use math3d::Vertex; use math3d::Vertex;
@ -949,19 +951,8 @@ impl VulkanApp {
let shader_stages: [ffi::VkPipelineShaderStageCreateInfo; 2] = let shader_stages: [ffi::VkPipelineShaderStageCreateInfo; 2] =
[vert_shader_stage_info, frag_shader_stage_info]; [vert_shader_stage_info, frag_shader_stage_info];
let mut vertex_input_info: ffi::VkPipelineVertexInputStateCreateInfo = let (vertex_input_info, _bind_desc, _attr_descs) =
unsafe { std::mem::zeroed() }; Self::create_vertex_input_state_info_struct()?;
vertex_input_info.sType =
ffi::VkStructureType_VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
let bind_desc = Vertex::get_binding_description();
let attr_descs = Vertex::get_attribute_descriptions();
vertex_input_info.vertexBindingDescriptionCount = 1;
vertex_input_info.vertexAttributeDescriptionCount = attr_descs.len() as u32;
vertex_input_info.pVertexBindingDescriptions = std::ptr::addr_of!(bind_desc);
vertex_input_info.pVertexAttributeDescriptions = attr_descs.as_ptr();
let mut input_assembly: ffi::VkPipelineInputAssemblyStateCreateInfo = let mut input_assembly: ffi::VkPipelineInputAssemblyStateCreateInfo =
unsafe { std::mem::zeroed() }; unsafe { std::mem::zeroed() };
@ -1688,8 +1679,8 @@ impl VulkanApp {
); );
} }
{ unsafe {
let data_ptr_vertices: &mut [Vertex; 3] = unsafe { std::mem::transmute(data_ptr) }; let data_ptr_vertices: *mut [Vertex; 3] = std::mem::transmute(data_ptr);
*data_ptr_vertices = VERTICES; *data_ptr_vertices = VERTICES;
} }
@ -1729,6 +1720,32 @@ impl VulkanApp {
Err(String::from("Failed to find suitable memory type!")) Err(String::from("Failed to find suitable memory type!"))
} }
#[allow(clippy::type_complexity)]
fn create_vertex_input_state_info_struct() -> Result<
(
ffi::VkPipelineVertexInputStateCreateInfo,
Pin<Box<ffi::VkVertexInputBindingDescription>>,
Pin<Box<[ffi::VkVertexInputAttributeDescription; 2]>>,
),
String,
> {
let mut vertex_input_info: ffi::VkPipelineVertexInputStateCreateInfo =
unsafe { std::mem::zeroed() };
vertex_input_info.sType =
ffi::VkStructureType_VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
let bind_desc = Box::pin(Vertex::get_binding_description());
let attr_descs = Box::pin(Vertex::get_attribute_descriptions());
vertex_input_info.vertexBindingDescriptionCount = 1;
vertex_input_info.vertexAttributeDescriptionCount = attr_descs.len() as u32;
vertex_input_info.pVertexBindingDescriptions = bind_desc.deref();
vertex_input_info.pVertexAttributeDescriptions = attr_descs.as_ptr();
Ok((vertex_input_info, bind_desc, attr_descs))
}
} }
impl Drop for VulkanApp { impl Drop for VulkanApp {