diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2021-01-31 19:36:15 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2021-01-31 19:36:15 +0100 |
| commit | 6d156207ae26eb2398df87192a9cbf872cc166c8 (patch) | |
| tree | 7e6c1e0eae88b389667e862bfe8def897ccf62a8 | |
| parent | d685be6799bffcf0c0f2a39d6982a44debfc7ad7 (diff) | |
Pipeline execution, command buffer submission & presentation api
functions
| -rw-r--r-- | include/vk-api.hpp | 6 | ||||
| -rw-r--r-- | include/vk-renderer.hpp | 1 | ||||
| -rw-r--r-- | src/vk-api.cpp | 39 | ||||
| -rw-r--r-- | src/vk-renderer.cpp | 56 |
4 files changed, 53 insertions, 49 deletions
diff --git a/include/vk-api.hpp b/include/vk-api.hpp index 761b91d..099f4de 100644 --- a/include/vk-api.hpp +++ b/include/vk-api.hpp @@ -88,7 +88,13 @@ class vkapi { void image_barrier(VkCommandBuffer command_buffer, VkImageLayout src_layout, VkImageLayout dst_layout, VkPipelineStageFlagBits src_stage, VkPipelineStageFlagBits dst_stage, VkAccessFlags src_access, VkAccessFlags dst_access, Image image); + void run_compute_pipeline(VkCommandBuffer command_buffer, ComputePipeline pipeline, VkDescriptorSet set, size_t group_count_x, size_t group_count_y, size_t group_count_z); + void end_record(VkCommandBuffer command_buffer); + + VkResult submit(VkCommandBuffer command_buffer, VkSemaphore wait_semaphore, VkSemaphore signal_semaphore, VkFence submission_fence); + + VkResult present(Swapchain swapchain, uint32_t image_index, VkSemaphore wait_semaphore); // private: vkcontext context; diff --git a/include/vk-renderer.hpp b/include/vk-renderer.hpp index cd09458..f16adf5 100644 --- a/include/vk-renderer.hpp +++ b/include/vk-renderer.hpp @@ -43,7 +43,6 @@ class vkrenderer { Swapchain swapchain; const uint32_t min_swapchain_image_count = 3; - uint32_t current_image_index; }; #endif // !__VK_RENDERER_HPP_ diff --git a/src/vk-api.cpp b/src/vk-api.cpp index 4e8df48..6144c9e 100644 --- a/src/vk-api.cpp +++ b/src/vk-api.cpp @@ -544,6 +544,45 @@ void vkapi::image_barrier(VkCommandBuffer command_buffer, VkImageLayout src_layo ); } +void vkapi::run_compute_pipeline(VkCommandBuffer command_buffer, ComputePipeline pipeline, VkDescriptorSet set, size_t group_count_x, size_t group_count_y, size_t group_count_z) { + vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.layout, 0, 1, &set, 0, nullptr); + + vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.handle); + + vkCmdDispatch(command_buffer, group_count_x, group_count_y, group_count_z); +} + void vkapi::end_record(VkCommandBuffer command_buffer) { VKRESULT(vkEndCommandBuffer(command_buffer)) } + +VkResult vkapi::submit(VkCommandBuffer command_buffer, VkSemaphore wait_semaphore, VkSemaphore signal_semaphore, VkFence submission_fence) { + VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + + VkSubmitInfo submit_info = {}; + submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submit_info.pNext = nullptr; + submit_info.waitSemaphoreCount = 1; + submit_info.pWaitSemaphores = &wait_semaphore; + submit_info.pWaitDstStageMask = &wait_stage; + submit_info.signalSemaphoreCount = 1; + submit_info.pSignalSemaphores = &signal_semaphore; + submit_info.commandBufferCount = 1; + submit_info.pCommandBuffers = &command_buffer; + + return vkQueueSubmit(context.queue, 1, &submit_info, submission_fence); +} + +VkResult vkapi::present(Swapchain swapchain, uint32_t image_index, VkSemaphore wait_semaphore) { + VkPresentInfoKHR present_info = {}; + present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + present_info.pNext = nullptr; + present_info.waitSemaphoreCount = 1; + present_info.pWaitSemaphores = &wait_semaphore; + present_info.swapchainCount = 1; + present_info.pSwapchains = &swapchain.handle; + present_info.pImageIndices = &image_index; + present_info.pResults = nullptr; + + return vkQueuePresentKHR(context.queue, &present_info); +} diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp index cc1df8b..93f319d 100644 --- a/src/vk-renderer.cpp +++ b/src/vk-renderer.cpp @@ -77,61 +77,21 @@ void vkrenderer::compute(uint32_t width, uint32_t height) { VKRESULT(vkWaitForFences(api.context.device, 1, &submission_fences[frame_index], VK_TRUE, UINT64_MAX)) VKRESULT(vkResetFences(api.context.device, 1, &submission_fences[frame_index])) - auto acquire_result = vkAcquireNextImageKHR(api.context.device, swapchain.handle, UINT64_MAX, acquire_semaphores[frame_index], VK_NULL_HANDLE, ¤t_image_index); + uint32_t swapchain_image_index = 0; + auto acquire_result = vkAcquireNextImageKHR(api.context.device, swapchain.handle, UINT64_MAX, acquire_semaphores[frame_index], VK_NULL_HANDLE, &swapchain_image_index); handle_swapchain_result(acquire_result); - // API frame skeleton - // 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); - auto cmd_buf = command_buffers[frame_index]; - api.start_record(cmd_buf); - api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, VK_ACCESS_SHADER_WRITE_BIT, swapchain.images[current_image_index]); - - - vkCmdBindDescriptorSets(cmd_buf, VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline.layout, 0, 1, &compute_shader_sets[current_image_index], 0, nullptr); - - vkCmdBindPipeline(cmd_buf, VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline.handle); - - vkCmdDispatch(cmd_buf, width / 8, height / 8, 1); - - api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, swapchain.images[current_image_index]); + api.start_record(cmd_buf); + api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, VK_ACCESS_SHADER_WRITE_BIT, swapchain.images[swapchain_image_index]); + api.run_compute_pipeline(cmd_buf, compute_pipeline, compute_shader_sets[swapchain_image_index], width / 8, height / 8, 1); + api.image_barrier(cmd_buf, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, swapchain.images[swapchain_image_index]); api.end_record(cmd_buf); - VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - - VkSubmitInfo submit_info = {}; - submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submit_info.pNext = nullptr; - submit_info.waitSemaphoreCount = 1; - submit_info.pWaitSemaphores = &acquire_semaphores[frame_index]; - submit_info.pWaitDstStageMask = &wait_stage; - submit_info.signalSemaphoreCount = 1; - submit_info.pSignalSemaphores = &execution_semaphores[frame_index]; - submit_info.commandBufferCount = 1; - submit_info.pCommandBuffers = &command_buffers[frame_index]; - - VKRESULT(vkQueueSubmit(api.context.queue, 1, &submit_info, submission_fences[frame_index])) - - VkPresentInfoKHR present_info = {}; - present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; - present_info.pNext = nullptr; - present_info.waitSemaphoreCount = 1; - present_info.pWaitSemaphores = &execution_semaphores[frame_index]; - present_info.swapchainCount = 1; - present_info.pSwapchains = &swapchain.handle; - present_info.pImageIndices = ¤t_image_index; - present_info.pResults = nullptr; + api.submit(cmd_buf, acquire_semaphores[frame_index], execution_semaphores[frame_index], submission_fences[frame_index]); - auto present_result = vkQueuePresentKHR(api.context.queue, &present_info); + auto present_result = api.present(swapchain, swapchain_image_index, execution_semaphores[frame_index]); handle_swapchain_result(present_result); frame_index = ++frame_index % swapchain.image_count; |
