diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2021-01-30 21:14:24 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2021-01-30 21:14:24 +0100 |
| commit | f24c2bba8159e5a42397ecfc82a669a94f5ad4b3 (patch) | |
| tree | b6c12bad0fb1e6b168e1a35fb7e5d83dd4b1a4ac /src | |
| parent | c5ac7ee3f91efc60d87a59706c9ce2970116b865 (diff) | |
Fix api bugs
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.cpp | 10 | ||||
| -rw-r--r-- | src/vk-api.cpp | 6 | ||||
| -rw-r--r-- | src/vk-renderer.cpp | 38 |
3 files changed, 35 insertions, 19 deletions
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<Image>{ swapchain.image_count }; auto images = std::vector<VkImage>{ swapchain.image_count }; auto views = std::vector<VkImageView>{ 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 }); + swapchain = api.create_swapchain( + platform_surface, + min_swapchain_image_count, + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_STORAGE_BIT, + std::optional<Swapchain> { 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); } } |
