diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index d05cddc4..c3febaa7 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -664,6 +664,55 @@ void VulkanExampleBase::updateTextOverlay() textOverlay->endTextUpdate(); } +void VulkanExampleBase::prepareFrame() +{ + // Acquire the next image from the swap chaing + VK_CHECK_RESULT(swapChain.acquireNextImage(semaphores.presentComplete, ¤tBuffer)); + // Submit barrier that transforms color attachment image layout back from khr + submitPostPresentBarrier(swapChain.buffers[currentBuffer].image); + +} + +void VulkanExampleBase::submitFrame() +{ + bool submitTextOverlay = enableTextOverlay && textOverlay->visible; + + if (submitTextOverlay) + { + // Wait for color attachment output to finish before rendering the text overlay + VkPipelineStageFlags stageFlags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + submitInfo.pWaitDstStageMask = &stageFlags; + + // Set semaphores + // Wait for render complete semaphore + submitInfo.waitSemaphoreCount = 1; + submitInfo.pWaitSemaphores = &semaphores.renderComplete; + // Signal ready with text overlay complete semaphpre + submitInfo.signalSemaphoreCount = 1; + submitInfo.pSignalSemaphores = &semaphores.textOverlayComplete; + + // Submit current text overlay command buffer + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &textOverlay->cmdBuffers[currentBuffer]; + VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE)); + + // Reset wait and signal semaphores for rendering next frame + // Wait for swap chain presentation to finish + submitInfo.waitSemaphoreCount = 1; + submitInfo.pWaitSemaphores = &semaphores.presentComplete; + // Signal ready with offscreen semaphore + submitInfo.signalSemaphoreCount = 1; + submitInfo.pSignalSemaphores = &semaphores.renderComplete; + } + + // Submit barrier that transforms color attachment to khr presen + submitPrePresentBarrier(swapChain.buffers[currentBuffer].image); + + VK_CHECK_RESULT(swapChain.queuePresent(queue, currentBuffer, submitTextOverlay ? semaphores.textOverlayComplete : semaphores.renderComplete)); + + VK_CHECK_RESULT(vkQueueWaitIdle(queue)); +} + VulkanExampleBase::VulkanExampleBase(bool enableValidation) { // Check for validation command line flag @@ -1031,6 +1080,12 @@ void VulkanExampleBase::handleMessages(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR case 0x50: paused = !paused; break; + case VK_F1: + if (enableTextOverlay) + { + textOverlay->visible = !textOverlay->visible; + } + break; case VK_ESCAPE: exit(0); break; diff --git a/base/vulkanexamplebase.h b/base/vulkanexamplebase.h index f15a7417..27d37618 100644 --- a/base/vulkanexamplebase.h +++ b/base/vulkanexamplebase.h @@ -340,5 +340,17 @@ public: VkPipelineStageFlags *pipelineStages); void updateTextOverlay(); + + // Prepare the frame for workload submission + // - Acquires the next image from the swap chain + // - Submits a post present barrier + // - Sets the default wait and signal semaphores + void prepareFrame(); + + // Submit the frames' workload + // - Submits the text overlay (if enabled) + // - + void submitFrame(); + }; diff --git a/texture/texture.cpp b/texture/texture.cpp index 7d83d46b..b387ccdc 100644 --- a/texture/texture.cpp +++ b/texture/texture.cpp @@ -83,6 +83,7 @@ public: zoom = -2.5f; rotation = { 0.0f, 15.0f, 0.0f }; title = "Vulkan Example - Texturing"; + enableTextOverlay = true; } ~VulkanExample() @@ -517,10 +518,7 @@ public: void draw() { - // Get next image in the swap chain (back/front buffer) - VK_CHECK_RESULT(swapChain.acquireNextImage(semaphores.presentComplete, ¤tBuffer)); - - submitPostPresentBarrier(swapChain.buffers[currentBuffer].image); + VulkanExampleBase::prepareFrame(); // Command buffer to be sumitted to the queue submitInfo.commandBufferCount = 1; @@ -529,11 +527,7 @@ public: // Submit to queue VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE)); - submitPrePresentBarrier(swapChain.buffers[currentBuffer].image); - - VK_CHECK_RESULT(swapChain.queuePresent(queue, currentBuffer, semaphores.renderComplete)); - - VK_CHECK_RESULT(vkQueueWaitIdle(queue)); + VulkanExampleBase::submitFrame(); } void generateQuad()