Application wide semaphores (present and render synchronization), submit info in base clas (#60, #65)
This commit is contained in:
parent
1868b4fb8e
commit
0240cde57a
2 changed files with 54 additions and 5 deletions
|
|
@ -424,6 +424,21 @@ void VulkanExampleBase::submitPostPresentBarrier(VkImage image)
|
||||||
assert(!vkRes);
|
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)
|
VulkanExampleBase::VulkanExampleBase(bool enableValidation)
|
||||||
{
|
{
|
||||||
// Check for validation command line flag
|
// Check for validation command line flag
|
||||||
|
|
@ -485,7 +500,8 @@ VulkanExampleBase::~VulkanExampleBase()
|
||||||
|
|
||||||
vkDestroyCommandPool(device, cmdPool, nullptr);
|
vkDestroyCommandPool(device, cmdPool, nullptr);
|
||||||
|
|
||||||
vkDestroySemaphore(device, presentCompleteSemaphore, nullptr);
|
vkDestroySemaphore(device, semaphores.presentComplete, nullptr);
|
||||||
|
vkDestroySemaphore(device, semaphores.renderComplete, nullptr);
|
||||||
|
|
||||||
vkDestroyDevice(device, nullptr);
|
vkDestroyDevice(device, nullptr);
|
||||||
|
|
||||||
|
|
@ -573,10 +589,26 @@ void VulkanExampleBase::initVulkan(bool enableValidation)
|
||||||
|
|
||||||
swapChain.connect(instance, physicalDevice, device);
|
swapChain.connect(instance, physicalDevice, device);
|
||||||
|
|
||||||
|
// Create synchronization objects
|
||||||
|
VkSemaphoreCreateInfo semaphoreCreateInfo = vkTools::initializers::semaphoreCreateInfo();
|
||||||
// Create a semaphore used to synchronize image presentation
|
// Create a semaphore used to synchronize image presentation
|
||||||
VkSemaphoreCreateInfo presentCompleteSemaphoreCreateInfo = vkTools::initializers::semaphoreCreateInfo();
|
// Ensures that the image is displayed before we start submitting new commands to the queu
|
||||||
err = vkCreateSemaphore(device, &presentCompleteSemaphoreCreateInfo, nullptr, &presentCompleteSemaphore);
|
err = vkCreateSemaphore(device, &semaphoreCreateInfo, nullptr, &semaphores.presentComplete);
|
||||||
assert(!err);
|
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
|
#ifdef _WIN32
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,10 @@ protected:
|
||||||
VkCommandBuffer postPresentCmdBuffer = VK_NULL_HANDLE;
|
VkCommandBuffer postPresentCmdBuffer = VK_NULL_HANDLE;
|
||||||
// Command buffer for submitting a pre present image barrier
|
// Command buffer for submitting a pre present image barrier
|
||||||
VkCommandBuffer prePresentCmdBuffer = VK_NULL_HANDLE;
|
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
|
// Command buffers used for rendering
|
||||||
std::vector<VkCommandBuffer> drawCmdBuffers;
|
std::vector<VkCommandBuffer> drawCmdBuffers;
|
||||||
// Global render pass for frame buffer writes
|
// Global render pass for frame buffer writes
|
||||||
|
|
@ -88,8 +92,15 @@ protected:
|
||||||
VkPipelineCache pipelineCache;
|
VkPipelineCache pipelineCache;
|
||||||
// Wraps the swap chain to present images (framebuffers) to the windowing system
|
// Wraps the swap chain to present images (framebuffers) to the windowing system
|
||||||
VulkanSwapChain swapChain;
|
VulkanSwapChain swapChain;
|
||||||
// Semaphore to synchronize image presentation
|
// Synchronization semaphores
|
||||||
VkSemaphore presentCompleteSemaphore;
|
struct {
|
||||||
|
// Swap chain image presentation
|
||||||
|
VkSemaphore presentComplete;
|
||||||
|
// Command buffer submission and execution
|
||||||
|
VkSemaphore renderComplete;
|
||||||
|
} semaphores;
|
||||||
|
|
||||||
|
|
||||||
// Simple texture loader
|
// Simple texture loader
|
||||||
vkTools::VulkanTextureLoader *textureLoader = nullptr;
|
vkTools::VulkanTextureLoader *textureLoader = nullptr;
|
||||||
public:
|
public:
|
||||||
|
|
@ -244,5 +255,11 @@ public:
|
||||||
// Submit a post present image barrier to the queue
|
// Submit a post present image barrier to the queue
|
||||||
// Transforms the (framebuffer) image layout back from present(khr) to color attachment layout
|
// Transforms the (framebuffer) image layout back from present(khr) to color attachment layout
|
||||||
void submitPostPresentBarrier(VkImage image);
|
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue