From 43ae43e8b83dba48d61e5caeb43f4d6b3e5c9b7d Mon Sep 17 00:00:00 2001 From: Alex Janka Date: Mon, 2 Oct 2023 11:04:51 +1100 Subject: [PATCH] some refactoring --- gb-emu/src/renderer/vulkan/vulkan.rs | 69 ++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/gb-emu/src/renderer/vulkan/vulkan.rs b/gb-emu/src/renderer/vulkan/vulkan.rs index b071769..0f7ad3c 100644 --- a/gb-emu/src/renderer/vulkan/vulkan.rs +++ b/gb-emu/src/renderer/vulkan/vulkan.rs @@ -16,23 +16,15 @@ use winit::window::Window; const SHADER: &[u8] = include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/shaders/shader.spv")); pub struct WindowData { - scale_factor: u32, - - // entry: Entry, instance: Instance, device: Device, surface_loader: Surface, swapchain_loader: Swapchain, - // pdevice: vk::PhysicalDevice, - // device_memory_properties: vk::PhysicalDeviceMemoryProperties, - // queue_family_index: u32, present_queue: vk::Queue, surface: vk::SurfaceKHR, - // surface_format: vk::SurfaceFormatKHR, surface_resolution: vk::Extent2D, swapchain: vk::SwapchainKHR, - // present_images: Vec, present_image_views: Vec, pool: vk::CommandPool, @@ -54,12 +46,21 @@ pub struct WindowData { framebuffers: Vec, pipeline_layout: vk::PipelineLayout, descriptor_sets: Vec, - graphic_pipeline: vk::Pipeline, + graphics_pipelines: Vec, viewports: [vk::Viewport; 1], scissors: [vk::Rect2D; 1], index_buffer: vk::Buffer, index_buffer_data: [u32; 6], + shader_module: vk::ShaderModule, + vertex_input_buffer_memory: vk::DeviceMemory, + texture_memory: vk::DeviceMemory, + index_buffer_memory: vk::DeviceMemory, + tex_image_view: vk::ImageView, + desc_set_layouts: [vk::DescriptorSetLayout; 1], + descriptor_pool: vk::DescriptorPool, + sampler: vk::Sampler, + image_buffer: vk::Buffer, image_buffer_memory: vk::DeviceMemory, image_buffer_memory_req: vk::MemoryRequirements, @@ -877,24 +878,15 @@ impl WindowData { .create_graphics_pipelines(vk::PipelineCache::null(), &[graphic_pipeline_infos], None) .unwrap(); - let graphic_pipeline = graphics_pipelines[0]; - Self { - scale_factor: factor, - // entry, instance, device, surface_loader, swapchain_loader, - // pdevice, - // device_memory_properties, - // queue_family_index, present_queue, surface, - // surface_format, surface_resolution, swapchain, - // present_images, present_image_views, pool, draw_command_buffer, @@ -911,11 +903,19 @@ impl WindowData { framebuffers, pipeline_layout, descriptor_sets, - graphic_pipeline, + graphics_pipelines, viewports, scissors, index_buffer, index_buffer_data, + shader_module, + vertex_input_buffer_memory, + texture_memory, + index_buffer_memory, + tex_image_view, + desc_set_layouts, + descriptor_pool, + sampler, image_buffer, image_buffer_memory, image_buffer_memory_req, @@ -1081,7 +1081,7 @@ impl WindowData { device.cmd_bind_pipeline( draw_command_buffer, vk::PipelineBindPoint::GRAPHICS, - self.graphic_pipeline, + self.graphics_pipelines[0], ); device.cmd_set_viewport(draw_command_buffer, 0, &self.viewports); device.cmd_set_scissor(draw_command_buffer, 0, &self.scissors); @@ -1127,6 +1127,35 @@ impl Drop for WindowData { fn drop(&mut self) { unsafe { self.device.device_wait_idle().unwrap(); + + for pipeline in &self.graphics_pipelines { + self.device.destroy_pipeline(*pipeline, None); + } + self.device + .destroy_pipeline_layout(self.pipeline_layout, None); + self.device.destroy_shader_module(self.shader_module, None); + self.device.free_memory(self.image_buffer_memory, None); + self.device.destroy_buffer(self.image_buffer, None); + self.device.free_memory(self.texture_memory, None); + self.device.destroy_image_view(self.tex_image_view, None); + self.device.destroy_image(self.texture_image, None); + self.device.free_memory(self.index_buffer_memory, None); + self.device.destroy_buffer(self.index_buffer, None); + self.device + .free_memory(self.vertex_input_buffer_memory, None); + self.device.destroy_buffer(self.vertex_input_buffer, None); + for &descriptor_set_layout in self.desc_set_layouts.iter() { + self.device + .destroy_descriptor_set_layout(descriptor_set_layout, None); + } + self.device + .destroy_descriptor_pool(self.descriptor_pool, None); + self.device.destroy_sampler(self.sampler, None); + for framebuffer in &self.framebuffers { + self.device.destroy_framebuffer(*framebuffer, None); + } + self.device.destroy_render_pass(self.renderpass, None); + self.device .destroy_semaphore(self.present_complete_semaphore, None); self.device