diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index fc3da95b..d41b0cc8 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -424,6 +424,21 @@ void VulkanExampleBase::submitPostPresentBarrier(VkImage image) assert(!vkRes); } +VkSubmitInfo VulkanExampleBase::prepareSubmitInfo( + std::vector commandBuffers, + VkPipelineStageFlags *pipelineStages) +{ + VkSubmitInfo submitInfo = vkTools::initializers::submitInfo(); + submitInfo.pWaitDstStageMask = pipelineStages; + submitInfo.waitSemaphoreCount = 1; + submitInfo.pWaitSemaphores = &semaphores.presentComplete; + submitInfo.commandBufferCount = commandBuffers.size(); + submitInfo.pCommandBuffers = commandBuffers.data(); + submitInfo.signalSemaphoreCount = 1; + submitInfo.pSignalSemaphores = &semaphores.renderComplete; + return submitInfo; +} + VulkanExampleBase::VulkanExampleBase(bool enableValidation) { // Check for validation command line flag @@ -485,7 +500,8 @@ VulkanExampleBase::~VulkanExampleBase() vkDestroyCommandPool(device, cmdPool, nullptr); - vkDestroySemaphore(device, presentCompleteSemaphore, nullptr); + vkDestroySemaphore(device, semaphores.presentComplete, nullptr); + vkDestroySemaphore(device, semaphores.renderComplete, nullptr); vkDestroyDevice(device, nullptr); @@ -573,10 +589,26 @@ void VulkanExampleBase::initVulkan(bool enableValidation) swapChain.connect(instance, physicalDevice, device); + // Create synchronization objects + VkSemaphoreCreateInfo semaphoreCreateInfo = vkTools::initializers::semaphoreCreateInfo(); // Create a semaphore used to synchronize image presentation - VkSemaphoreCreateInfo presentCompleteSemaphoreCreateInfo = vkTools::initializers::semaphoreCreateInfo(); - err = vkCreateSemaphore(device, &presentCompleteSemaphoreCreateInfo, nullptr, &presentCompleteSemaphore); + // Ensures that the image is displayed before we start submitting new commands to the queu + err = vkCreateSemaphore(device, &semaphoreCreateInfo, nullptr, &semaphores.presentComplete); assert(!err); + // Create a semaphore used to synchronize command submission + // Ensures that the image is not presented until all commands have been sumbitted and executed + err = vkCreateSemaphore(device, &semaphoreCreateInfo, nullptr, &semaphores.renderComplete); + assert(!err); + + // Set up submit info structure + // Semaphores will stay the same during application lifetime + // Command buffer submission info is set by each example + submitInfo = vkTools::initializers::submitInfo(); + submitInfo.pWaitDstStageMask = &submitPipelineStages; + submitInfo.waitSemaphoreCount = 1; + submitInfo.pWaitSemaphores = &semaphores.presentComplete; + submitInfo.signalSemaphoreCount = 1; + submitInfo.pSignalSemaphores = &semaphores.renderComplete; } #ifdef _WIN32 diff --git a/base/vulkanexamplebase.h b/base/vulkanexamplebase.h index 80fa4ab0..da7e0f64 100644 --- a/base/vulkanexamplebase.h +++ b/base/vulkanexamplebase.h @@ -72,6 +72,10 @@ protected: VkCommandBuffer postPresentCmdBuffer = VK_NULL_HANDLE; // Command buffer for submitting a pre present image barrier VkCommandBuffer prePresentCmdBuffer = VK_NULL_HANDLE; + // Pipeline stage flags for the submit info structure + VkPipelineStageFlags submitPipelineStages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + // Contains command buffers and semaphores to be presented to the queue + VkSubmitInfo submitInfo; // Command buffers used for rendering std::vector drawCmdBuffers; // Global render pass for frame buffer writes @@ -88,8 +92,15 @@ protected: VkPipelineCache pipelineCache; // Wraps the swap chain to present images (framebuffers) to the windowing system VulkanSwapChain swapChain; - // Semaphore to synchronize image presentation - VkSemaphore presentCompleteSemaphore; + // Synchronization semaphores + struct { + // Swap chain image presentation + VkSemaphore presentComplete; + // Command buffer submission and execution + VkSemaphore renderComplete; + } semaphores; + + // Simple texture loader vkTools::VulkanTextureLoader *textureLoader = nullptr; public: @@ -244,5 +255,11 @@ public: // Submit a post present image barrier to the queue // Transforms the (framebuffer) image layout back from present(khr) to color attachment layout void submitPostPresentBarrier(VkImage image); + + // Prepare a submit info structure containing + // semaphores and submit buffer info for vkQueueSubmit + VkSubmitInfo prepareSubmitInfo( + std::vector commandBuffers, + VkPipelineStageFlags *pipelineStages); };