From f24c2bba8159e5a42397ecfc82a669a94f5ad4b3 Mon Sep 17 00:00:00 2001 From: ladevieq Date: Sat, 30 Jan 2021 21:14:24 +0100 Subject: Fix api bugs --- include/vk-api.hpp | 1 - include/vk-renderer.hpp | 5 +---- src/main.cpp | 10 ++++++---- src/vk-api.cpp | 6 ++++-- src/vk-renderer.cpp | 38 +++++++++++++++++++++++++------------- 5 files changed, 36 insertions(+), 24 deletions(-) diff --git a/include/vk-api.hpp b/include/vk-api.hpp index 53a33ba..c4b51aa 100644 --- a/include/vk-api.hpp +++ b/include/vk-api.hpp @@ -73,7 +73,6 @@ class vkapi { void destroy_descriptor_sets(std::vector &descriptor_sets); - // TODO: Maybe includes surface in the swapchain structure VkSurfaceKHR create_surface(window& wnd); void destroy_surface(VkSurfaceKHR surface); diff --git a/include/vk-renderer.hpp b/include/vk-renderer.hpp index 301aad2..cd09458 100644 --- a/include/vk-renderer.hpp +++ b/include/vk-renderer.hpp @@ -31,7 +31,6 @@ class vkrenderer { std::vector command_buffers; - VkDescriptorPool descriptor_pool; std::vector compute_shader_sets; ComputePipeline compute_pipeline; @@ -40,9 +39,7 @@ class vkrenderer { std::vector execution_semaphores; std::vector acquire_semaphores; - VkSurfaceFormatKHR surface_format; - VkSurfaceKHR platform_surface = VK_NULL_HANDLE; - + VkSurfaceKHR platform_surface; Swapchain swapchain; const uint32_t min_swapchain_image_count = 3; diff --git a/src/main.cpp b/src/main.cpp index 390df41..37ebddb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -44,8 +44,8 @@ int main() { // Image dimensions const float aspect_ratio = 16.0 / 9.0; - const uint32_t width = 400; - const uint32_t height = width / aspect_ratio; + uint32_t width = 400; + uint32_t height = width / aspect_ratio; window wnd { width , height }; @@ -68,8 +68,10 @@ int main() { for (auto event: wnd.events) { switch(event.type) { case EVENT_TYPES::RESIZE: { - ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->width = event.width; - ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->height = event.height; + width = event.width; + height = event.height; + ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->width = width; + ((input_data*) renderer.compute_shader_buffer.mapped_ptr)->height = height; if (event.width == 0 && event.height == 0) { canRender = false; diff --git a/src/vk-api.cpp b/src/vk-api.cpp index 84ac583..c81927e 100644 --- a/src/vk-api.cpp +++ b/src/vk-api.cpp @@ -405,7 +405,7 @@ Swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count, create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; create_info.presentMode = VK_PRESENT_MODE_FIFO_KHR; create_info.clipped = VK_TRUE; - create_info.oldSwapchain = old_swapchain_handle; + create_info.oldSwapchain = VK_NULL_HANDLE; VKRESULT(vkCreateSwapchainKHR(context.device, &create_info, nullptr, &swapchain.handle)) @@ -413,8 +413,10 @@ Swapchain vkapi::create_swapchain(VkSurfaceKHR surface, size_t min_image_count, destroy_swapchain(old_swapchain.value()); } - VKRESULT(vkGetSwapchainImagesKHR(context.device, swapchain.handle, (uint32_t*)&swapchain.image_count, VK_NULL_HANDLE)) + uint32_t image_count = 0; + VKRESULT(vkGetSwapchainImagesKHR(context.device, swapchain.handle, &image_count, VK_NULL_HANDLE)) + swapchain.image_count = image_count; swapchain.images = std::vector{ swapchain.image_count }; auto images = std::vector{ swapchain.image_count }; auto views = std::vector{ swapchain.image_count }; diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp index a8baa38..63694f2 100644 --- a/src/vk-renderer.cpp +++ b/src/vk-renderer.cpp @@ -50,15 +50,14 @@ vkrenderer::vkrenderer(window& wnd, const input_data& inputs) { compute_shader_buffer = api.create_buffer(sizeof(inputs), VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU); std::memcpy(compute_shader_buffer.mapped_ptr, &inputs, sizeof(inputs)); - size_t image_index = 0; - for (auto& set: compute_shader_sets) { - api.update_descriptor_set_buffer(set, bindings[0], compute_shader_buffer); - api.update_descriptor_set_image(set, bindings[1], swapchain.images[image_index].view); + for (size_t index = 0; index < swapchain.image_count; index++) { + api.update_descriptor_set_buffer(compute_shader_sets[index], bindings[0], compute_shader_buffer); + api.update_descriptor_set_image(compute_shader_sets[index], bindings[1], swapchain.images[index].view); } } vkrenderer::~vkrenderer() { - VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX)) + VKRESULT(vkWaitForFences(api.context.device, submission_fences.size(), submission_fences.data(), VK_TRUE, UINT64_MAX)) api.destroy_buffer(compute_shader_buffer); api.destroy_fences(submission_fences); @@ -81,6 +80,17 @@ void vkrenderer::compute(uint32_t width, uint32_t height) { auto acquire_result = vkAcquireNextImageKHR(api.context.device, swapchain.handle, UINT64_MAX, acquire_semaphores[frame_index], VK_NULL_HANDLE, ¤t_image_index); handle_swapchain_result(acquire_result); + // API + // api.start_record(cmd_buffer); + // api.command_barrier(); + // bind pipeline + // bind descriptor set + // dispatch + // api.command_barrier(); + // api.stop_record(); + // api.execute(cmd_buffer, wait_semaphore, signal_semaphore); + // api.present(swapchain, img_index, wait_semaphore); + VkCommandBufferBeginInfo cmd_buf_begin_info = {}; cmd_buf_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmd_buf_begin_info.pNext = nullptr; @@ -88,7 +98,6 @@ void vkrenderer::compute(uint32_t width, uint32_t height) { cmd_buf_begin_info.pInheritanceInfo = nullptr; vkBeginCommandBuffer(command_buffers[frame_index], &cmd_buf_begin_info); - VkImageSubresourceRange image_subresource_range = {}; image_subresource_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; image_subresource_range.baseMipLevel = 0; @@ -182,15 +191,18 @@ void vkrenderer::compute(uint32_t width, uint32_t height) { auto present_result = vkQueuePresentKHR(api.context.queue, &present_info); handle_swapchain_result(present_result); - VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX)) - frame_index = ++frame_index % swapchain.image_count; } void vkrenderer::recreate_swapchain() { - VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX)) + VKRESULT(vkWaitForFences(api.context.device, submission_fences.size(), submission_fences.data(), VK_TRUE, UINT64_MAX)) - swapchain = api.create_swapchain(platform_surface, 3, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, std::optional { swapchain }); + swapchain = api.create_swapchain( + platform_surface, + min_swapchain_image_count, + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_STORAGE_BIT, + std::optional { swapchain } + ); VkDescriptorSetLayoutBinding binding { .binding = 1, @@ -199,9 +211,9 @@ void vkrenderer::recreate_swapchain() { .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, .pImmutableSamplers = VK_NULL_HANDLE, }; - size_t image_index = 0; - for (auto& set: compute_shader_sets) { - api.update_descriptor_set_image(set, binding, swapchain.images[image_index].view); + + for (size_t index = 0; index < swapchain.image_count; index++) { + api.update_descriptor_set_image(compute_shader_sets[index], binding, swapchain.images[index].view); } } -- cgit v1.3