SpiecsEngine
 
Loading...
Searching...
No Matches

◆ EndFrame()

void Spices::VulkanRenderBackend::EndFrame ( FrameInfo & frameInfo)

End record the frame with vulkan render backend.

Parameters
[in]frameInfoFrameInfo.

Checkpoint of end primary commandBuffers.

End recording the CommandBuffer.

Instance a VkSubmitInfo.

Submit all commands recorded in queue.

Instance a VkSubmitInfo.

Submit all commands recorded in queue.

Instance a VkPresentInfoKHR.

Present the swapchain image to windows.

Checkpoint of end primary commandBuffers.

End recording the CommandBuffer.

Instance a VkSubmitInfo.

Submit all commands recorded in queue.

Instance a VkSubmitInfo.

Submit all commands recorded in queue.

Instance a VkPresentInfoKHR.

Present the swapchain image to windows.

Definition at line 315 of file VulkanRenderBackend.cpp.

316 {
318
319 {
320 SPICES_PROFILE_ZONEN("EndFrame::NsightPerfOneShotEndFrameRange");
321
322 NSIGHTPERF_GPUPROFILERONESHOT_ENDRANGE(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], 0)
323 }
324
325 {
326 SPICES_PROFILE_ZONEN("EndFrame::EndCommandBuffer");
327
331 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], m_VulkanState.m_VkFunc, "EndPrimaryGraphicCommandBuffer")
332 NSIGHTAFTERMATH_GPUCRASHTRACKER_SETCHECKPOINT(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex], m_VulkanState.m_VkFunc, "BeginPrimaryGraphicCommandBuffer")
333
337 VK_CHECK(vkEndCommandBuffer(m_VulkanState.m_ComputeCommandBuffer[frameInfo.m_FrameIndex]))
338 VK_CHECK(vkEndCommandBuffer(m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex]))
339 }
340
341 {
342 SPICES_PROFILE_ZONEN("EndFrame::ComputeQueueSubmit");
343
344 DEBUGUTILS_BEGINQUEUELABEL(m_VulkanState.m_ComputeQueue, "MainComputeQueue")
345
346 VkSemaphore waitSemphores[] = { m_VulkanState.m_GraphicImageSemaphore[frameInfo.m_FrameIndex] };
347 VkSemaphore signalSemaphores[] = { m_VulkanState.m_ComputeQueueSemaphore[frameInfo.m_FrameIndex] };
348 VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT };
349
353 VkSubmitInfo submitInfo{};
354 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
355 submitInfo.waitSemaphoreCount = 1;
356 submitInfo.pWaitSemaphores = waitSemphores;
357 submitInfo.pWaitDstStageMask = waitStages;
358 submitInfo.commandBufferCount = 1;
359 submitInfo.pCommandBuffers = &m_VulkanState.m_ComputeCommandBuffer[frameInfo.m_FrameIndex];
360 submitInfo.signalSemaphoreCount = 1;
361 submitInfo.pSignalSemaphores = signalSemaphores;
362
366 VK_CHECK(vkQueueSubmit(m_VulkanState.m_ComputeQueue, 1, &submitInfo, m_VulkanState.m_ComputeFence[frameInfo.m_FrameIndex]))
367
368 DEBUGUTILS_ENDQUEUELABEL(m_VulkanState.m_ComputeQueue)
369 }
370
371 {
372 SPICES_PROFILE_ZONEN("EndFrame::GraphicQueueSubmit");
373
374 DEBUGUTILS_BEGINQUEUELABEL(m_VulkanState.m_GraphicQueue, "MainGraphicQueue")
375
376 VkSemaphore waitSemphores[] = { m_VulkanState.m_ComputeQueueSemaphore[frameInfo.m_FrameIndex] };
377 VkSemaphore signalSemaphores[] = { m_VulkanState.m_GraphicQueueSemaphore[frameInfo.m_FrameIndex] };
378 VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
379
383 VkSubmitInfo submitInfo{};
384 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
385 submitInfo.waitSemaphoreCount = 1;
386 submitInfo.pWaitSemaphores = waitSemphores;
387 submitInfo.pWaitDstStageMask = waitStages;
388 submitInfo.commandBufferCount = 1;
389 submitInfo.pCommandBuffers = &m_VulkanState.m_GraphicCommandBuffer[frameInfo.m_FrameIndex];
390 submitInfo.signalSemaphoreCount = 1;
391 submitInfo.pSignalSemaphores = signalSemaphores;
392
396 VK_CHECK(vkQueueSubmit(m_VulkanState.m_GraphicQueue, 1, &submitInfo, m_VulkanState.m_GraphicFence[frameInfo.m_FrameIndex]))
397
398 DEBUGUTILS_ENDQUEUELABEL(m_VulkanState.m_GraphicQueue)
399 }
400
401 {
402 SPICES_PROFILE_ZONEN("EndFrame::NsightPerfFrameEnd");
403
404 NSIGHTPERF_GPUPROFILERHUD_ENDFRAME(m_VulkanState)
405 NSIGHTPERF_GPUPROFILERCONTINUOUS_ENDFRAME
406 NSIGHTPERF_GPUPROFILERREPORT_ENDFRAME(m_VulkanState)
407 NSIGHTPERF_GPUPROFILERONESHOT_ENDFRAME
408 }
409
410 {
411 SPICES_PROFILE_ZONEN("EndFrame::QueuePresent");
412
413 DEBUGUTILS_BEGINQUEUELABEL(m_VulkanState.m_PresentQueue, "PresentQueue")
414
415
418 VkPresentInfoKHR presentInfo{};
419 presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
420 presentInfo.waitSemaphoreCount = 1;
421 presentInfo.pWaitSemaphores = &m_VulkanState.m_GraphicQueueSemaphore[frameInfo.m_FrameIndex];
422 presentInfo.swapchainCount = 1;
423 presentInfo.pSwapchains = &m_VulkanState.m_SwapChain;
424 presentInfo.pImageIndices = &frameInfo.m_ImageIndex;
425 presentInfo.pResults = nullptr;
426
430 VkResult result = vkQueuePresentKHR(m_VulkanState.m_PresentQueue, &presentInfo);
431 if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR || m_VulkanWindows->IsResized())
432 {
433 m_VulkanWindows->SetResized(false);
435 }
436 else if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR)
437 {
438 SPICES_CORE_ERROR("Failed to present swap chain image!")
439 }
440
441 DEBUGUTILS_ENDQUEUELABEL(m_VulkanState.m_PresentQueue)
442 }
443
444 {
445 SPICES_PROFILE_ZONEN("StartFrame::Continue Delay ThreadPool");
446
447 ThreadModel::Get()->GetGameThreadPool()->Continue();
448 }
449 }
#define SPICES_PROFILE_ZONEN(...)
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
Definition VulkanUtils.h:68
static std::shared_ptr< ThreadModel > Get()
Get ThreadModel single instance.
void RecreateSwapChain()
Called OnSlateResize.
static VulkanState m_VulkanState
The VulkanState in use.
std::unique_ptr< VulkanWindows > m_VulkanWindows
VulkanWindows.
VkSwapchainKHR m_SwapChain
std::array< VkSemaphore, MaxFrameInFlight > m_ComputeQueueSemaphore
std::array< VkSemaphore, MaxFrameInFlight > m_GraphicQueueSemaphore
std::array< VkFence, MaxFrameInFlight > m_ComputeFence
std::array< VkCommandBuffer, MaxFrameInFlight > m_GraphicCommandBuffer
VulkanFunctions m_VkFunc
Definition VulkanUtils.h:98
std::array< VkSemaphore, MaxFrameInFlight > m_GraphicImageSemaphore
std::array< VkCommandBuffer, MaxFrameInFlight > m_ComputeCommandBuffer
std::array< VkFence, MaxFrameInFlight > m_GraphicFence

References Spices::FrameInfo::m_FrameIndex, m_VulkanState, and RecreateSwapChain().