diff options
| -rw-r--r-- | include/vk-renderer.hpp | 33 | ||||
| -rw-r--r-- | src/main.cpp | 3 | ||||
| -rw-r--r-- | src/vk-renderer.cpp | 111 | ||||
| -rw-r--r-- | src/window.cpp | 19 |
4 files changed, 141 insertions, 25 deletions
diff --git a/include/vk-renderer.hpp b/include/vk-renderer.hpp index aa51383..5f70718 100644 --- a/include/vk-renderer.hpp +++ b/include/vk-renderer.hpp @@ -14,6 +14,8 @@ class vkrenderer { public: vkrenderer(window& wnd, const input_data& inputs); + ~vkrenderer(); + void compute(); void recreate_swapchain(); @@ -37,7 +39,7 @@ class vkrenderer { void create_command_buffers(); - void create_descriptor_set(); + void create_descriptor_sets(); void create_fences(); @@ -45,8 +47,32 @@ class vkrenderer { void create_input_buffer(const input_data& inputs); + void destroy_instance(); + + void destroy_debugger(); + + void destroy_surface(); + + void destroy_device(); + + void destroy_swapchain(); + void destroy_swapchain_images(); + void destroy_pipeline(); + + void destroy_command_buffers(); + + void destroy_allocator(); + + void destroy_descriptor_sets(); + + void destroy_fences(); + + void destroy_semaphores(); + + void destroy_input_buffer(); + void select_physical_device(); void select_compute_queue(); @@ -61,11 +87,15 @@ class vkrenderer { uint64_t frame_index = 0; VkInstance instance; + + VkDebugUtilsMessengerEXT debugMessenger; + VkPhysicalDevice physical_device; VkDevice device; VkQueue compute_queue; VmaAllocator allocator; + VmaAllocation allocation; VkBuffer compute_shader_buffer; VkCommandPool command_pool; @@ -74,6 +104,7 @@ class vkrenderer { VkDescriptorPool descriptor_pool; std::vector<VkDescriptorSet> compute_shader_sets; + VkShaderModule compute_shader_module; VkDescriptorSetLayout compute_shader_layout; VkPipelineLayout compute_pipeline_layout; VkPipeline compute_pipeline; diff --git a/src/main.cpp b/src/main.cpp index b67d5f8..b449c4c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -70,9 +70,6 @@ int main() { } break; } - case EVENT_TYPES::QUIT: { - exit(1); - } default: { } } diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp index d5b785f..cfb437e 100644 --- a/src/vk-renderer.cpp +++ b/src/vk-renderer.cpp @@ -30,7 +30,7 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) create_swapchain(); create_memory_allocator(); create_command_buffers(); - create_descriptor_set(); + create_descriptor_sets(); create_fences(); create_semaphores(); create_input_buffer(inputs); @@ -39,6 +39,23 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) update_descriptors_image(); } +vkrenderer::~vkrenderer() { + VKRESULT(vkWaitForFences(device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX)) + + destroy_input_buffer(); + destroy_fences(); + destroy_semaphores(); + destroy_descriptor_sets(); + destroy_command_buffers(); + destroy_allocator(); + destroy_pipeline(); + destroy_swapchain(); + destroy_device(); + destroy_surface(); + destroy_debugger(); + destroy_instance(); +} + void vkrenderer::compute() { VKRESULT(vkWaitForFences(device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX)) VKRESULT(vkResetFences(device, 1, &submission_fences[frame_index])) @@ -204,7 +221,6 @@ void vkrenderer::create_instance() { } void vkrenderer::create_debugger() { - VkDebugUtilsMessengerEXT debugMessenger; VkDebugUtilsMessengerCreateInfoEXT debugUtilsMessengeCreateInfo { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, nullptr, @@ -225,10 +241,6 @@ void vkrenderer::create_debugger() { } void vkrenderer::create_surface() { - if (platform_surface != VK_NULL_HANDLE) { - vkDestroySurfaceKHR(instance, platform_surface, nullptr); - } - #if defined(LINUX) VkXcbSurfaceCreateInfoKHR create_info = {}; create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; @@ -385,7 +397,6 @@ void vkrenderer::create_pipeline() { exit(1); } - VkShaderModule compute_shader_module; VkShaderModuleCreateInfo shader_create_info = {}; shader_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; shader_create_info.pNext = nullptr; @@ -491,7 +502,7 @@ void vkrenderer::create_command_buffers() { command_buffers = std::vector<VkCommandBuffer> { swapchain_images_count }; vkAllocateCommandBuffers(device, &cmd_buf_allocate_info, command_buffers.data()); } -void vkrenderer::create_descriptor_set() { +void vkrenderer::create_descriptor_sets() { std::vector<VkDescriptorPoolSize> descriptor_pools_sizes = { { .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, @@ -567,23 +578,91 @@ void vkrenderer::create_input_buffer(const input_data& inputs) { VmaAllocationCreateInfo alloc_create_info = {}; alloc_create_info.usage = VMA_MEMORY_USAGE_CPU_TO_GPU; - VmaAllocation allocation; vmaCreateBuffer(allocator, &buffer_info, &alloc_create_info, &compute_shader_buffer, &allocation, nullptr); vmaMapMemory(allocator, allocation, (void**) &mapped_data); std::memcpy(mapped_data, &inputs, sizeof(inputs)); } +void vkrenderer::destroy_instance() { + vkDestroyInstance(instance, nullptr); +} + +void vkrenderer::destroy_debugger() { + vkDestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr); +} + +void vkrenderer::destroy_surface() { + vkDestroySurfaceKHR(instance, platform_surface, nullptr); +} + +void vkrenderer::destroy_device() { + vkDestroyDevice(device, nullptr); +} + +void vkrenderer::destroy_swapchain() { + vkDestroySwapchainKHR(device, swapchain, nullptr); + + destroy_swapchain_images(); +} void vkrenderer::destroy_swapchain_images() { - if (swapchain != VK_NULL_HANDLE) { - for (auto view: swapchain_images_views) { - vkDestroyImageView(device, view, nullptr); - } + for (auto view: swapchain_images_views) { + vkDestroyImageView(device, view, nullptr); + } + + swapchain_images_views.clear(); + swapchain_images.clear(); +} - swapchain_images_views.clear(); - swapchain_images.clear(); +void vkrenderer::destroy_pipeline() { + vkDestroyShaderModule(device, compute_shader_module, nullptr); + vkDestroyDescriptorSetLayout(device, compute_shader_layout, nullptr); + vkDestroyPipelineLayout(device, compute_pipeline_layout, nullptr); + vkDestroyPipeline(device, compute_pipeline, nullptr); +} + +void vkrenderer::destroy_command_buffers() { + vkFreeCommandBuffers(device, command_pool, swapchain_images_count, command_buffers.data()); + + vkDestroyCommandPool(device, command_pool, nullptr); +} + +void vkrenderer::destroy_allocator() { + vmaDestroyAllocator(allocator); +} + +void vkrenderer::destroy_descriptor_sets() { + // vkFreeDescriptorSets(device, descriptor_pool, swapchain_images_count, compute_shader_sets.data()); + + vkDestroyDescriptorPool(device, descriptor_pool, nullptr); +} + +void vkrenderer::destroy_fences() { + for (auto fence: submission_fences) { + vkDestroyFence(device, fence, nullptr); } + + submission_fences.clear(); +} + +void vkrenderer::destroy_semaphores() { + for (auto semaphore: acquire_semaphores) { + vkDestroySemaphore(device, semaphore, nullptr); + } + + acquire_semaphores.clear(); + + for (auto semaphore: execution_semaphores) { + vkDestroySemaphore(device, semaphore, nullptr); + } + + execution_semaphores.clear(); +} + +void vkrenderer::destroy_input_buffer() { + vmaUnmapMemory(allocator, allocation); + vmaDestroyBuffer(allocator, compute_shader_buffer, allocation); } void vkrenderer::select_physical_device() { @@ -673,6 +752,8 @@ void vkrenderer::handle_swapchain_result(VkResult function_result) { switch(function_result) { case VK_ERROR_OUT_OF_DATE_KHR: return recreate_swapchain(); + case VK_ERROR_SURFACE_LOST_KHR: + std::cerr << "surface lost" << std::endl; default: return; } diff --git a/src/window.cpp b/src/window.cpp index d1d2f4f..c273f43 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -156,17 +156,24 @@ void window::poll_events() { LRESULT window::message_handler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) { switch(umsg) { + case WM_CLOSE: + case WM_DESTROY: case WM_QUIT: { isOpen = false; - break; + return 0; } case WM_SIZE: { - event.push_back({ EVENT_TYPES::RESIZE }); + width = LOWORD(lparam); + height = HIWORD(lparam); + + events.push_back({ + .width = width, + .height = height, + .type = EVENT_TYPES::RESIZE + }); + return 0; } - default: - return DefWindowProc(hwnd, umsg, wparam, lparam); } - - return 0; + return DefWindowProc(hwnd, umsg, wparam, lparam); } #endif |
