Application wide semaphores (present and render synchronization), submit info in base clas (#60, #65)

This commit is contained in:
saschawillems 2016-03-06 19:22:41 +01:00
parent 1868b4fb8e
commit 0240cde57a
2 changed files with 54 additions and 5 deletions

View file

@ -424,6 +424,21 @@ void VulkanExampleBase::submitPostPresentBarrier(VkImage image)
assert(!vkRes);
}
VkSubmitInfo VulkanExampleBase::prepareSubmitInfo(
std::vector<VkCommandBuffer> 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

View file

@ -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<VkCommandBuffer> 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<VkCommandBuffer> commandBuffers,
VkPipelineStageFlags *pipelineStages);
};