diff options
| -rw-r--r-- | include/vk-renderer.hpp | 4 | ||||
| -rw-r--r-- | include/vulkan-loader.hpp | 1 | ||||
| -rw-r--r-- | src/vk-renderer.cpp | 25 |
3 files changed, 24 insertions, 6 deletions
diff --git a/include/vk-renderer.hpp b/include/vk-renderer.hpp index 0ca4da4..3af5a04 100644 --- a/include/vk-renderer.hpp +++ b/include/vk-renderer.hpp @@ -56,6 +56,8 @@ class vkrenderer { void create_descriptor_set(); + void create_fence(); + void create_semaphores(); public: @@ -87,6 +89,8 @@ class vkrenderer { VkPipelineLayout compute_pipeline_layout; VkPipeline compute_pipeline; + VkFence submission_fence; + VkSemaphore execution_semaphore; VkSemaphore acquire_semaphore; VkSurfaceFormatKHR surface_format; diff --git a/include/vulkan-loader.hpp b/include/vulkan-loader.hpp index d993f5a..0243c9f 100644 --- a/include/vulkan-loader.hpp +++ b/include/vulkan-loader.hpp @@ -70,6 +70,7 @@ X(vkQueueSubmit) \ X(vkCreateSemaphore) \ X(vkDestroySemaphore) \ + X(vkWaitSemaphores) \ X(vkCreateCommandPool) \ X(vkAllocateCommandBuffers) \ X(vkFreeCommandBuffers) \ diff --git a/src/vk-renderer.cpp b/src/vk-renderer.cpp index f6eaa23..ac1edd4 100644 --- a/src/vk-renderer.cpp +++ b/src/vk-renderer.cpp @@ -30,9 +30,10 @@ vkrenderer::vkrenderer(window& wnd) { create_memory_allocator(); create_command_buffer(); create_descriptor_set(); + create_fence(); create_semaphores(); - initialization_frame(); + // initialization_frame(); } void vkrenderer::compute(const input_data& inputs, size_t width, size_t height) { @@ -116,9 +117,7 @@ void vkrenderer::compute(const input_data& inputs, size_t width, size_t height) submit_info.commandBufferCount = 1; submit_info.pCommandBuffers = &command_buffer; - VKRESULT(vkQueueSubmit(compute_queue, 1, &submit_info, VK_NULL_HANDLE)) - - VKRESULT(vkDeviceWaitIdle(device)) + VKRESULT(vkQueueSubmit(compute_queue, 1, &submit_info, submission_fence)) VkPresentInfoKHR present_info = {}; present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; @@ -131,6 +130,8 @@ void vkrenderer::compute(const input_data& inputs, size_t width, size_t height) present_info.pResults = nullptr; VKRESULT(vkQueuePresentKHR(compute_queue, &present_info)) + + VKRESULT(vkWaitForFences(device, 1, &submission_fence, VK_TRUE, UINT64_MAX)) } @@ -450,12 +451,22 @@ void vkrenderer::create_descriptor_set() { vkAllocateDescriptorSets(device, &descriptor_set_allocate_info, &compute_shader_set); } +void vkrenderer::create_fence() { + VkFenceCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + create_info.pNext = nullptr; + create_info.flags = 0; + + VKRESULT(vkCreateFence(device, &create_info, nullptr, &submission_fence)) +} + void vkrenderer::create_semaphores() { VkSemaphoreCreateInfo create_info = {}; create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; create_info.pNext = nullptr; create_info.flags = 0; + VKRESULT(vkCreateSemaphore(device, &create_info, nullptr, &execution_semaphore)) VKRESULT(vkCreateSemaphore(device, &create_info, nullptr, &acquire_semaphore)) } @@ -514,9 +525,11 @@ void vkrenderer::initialization_frame() { submit_info.commandBufferCount = 1; submit_info.pCommandBuffers = &command_buffer; - VKRESULT(vkQueueSubmit(compute_queue, 1, &submit_info, VK_NULL_HANDLE)) + VKRESULT(vkQueueSubmit(compute_queue, 1, &submit_info, submission_fence)) + + VKRESULT(vkWaitForFences(device, 1, &submission_fence, VK_TRUE, UINT64_MAX)) - VKRESULT(vkDeviceWaitIdle(device)) + vkResetFences(device, 1, &submission_fence); } void vkrenderer::select_physical_device() { |
