MCPcopy Create free account
hub / github.com/clementgallet/libTAS / clearScreen

Method clearScreen

src/library/screencapture/ScreenCapture_Vulkan.cpp:614–685  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

612}
613
614void ScreenCapture_Vulkan::clearScreen()
615{
616 GlobalNative gn;
617
618 if (vk::context.swapchainRebuild) return;
619
620 /* A bit hackish code: we must only acquire a new image if redrawing. For
621 * the first draw of the current frame, we are clearing the current image,
622 * because it hasn't yet been presented. I'm checking which case based on
623 * the current semaphore that we should wait on */
624 if (vk::context.currentSemaphore != vk::context.frameSemaphores[vk::context.semaphoreIndex].screenCompleteSemaphore)
625 acquireImage();
626
627 if (vk::context.swapchainRebuild) return;
628
629 VkCommandBuffer cmdBuffer = vk::context.frames[vk::context.frameIndex].clearCommandBuffer;
630 VkImage backbuffer = vk::context.frames[vk::context.frameIndex].backbuffer;
631
632 beginCommand(cmdBuffer);
633
634 /* Transition destination image to transfer destination layout */
635 VkImageMemoryBarrier dstBarrier{};
636 dstBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
637 dstBarrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
638 dstBarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
639 dstBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
640 dstBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
641 dstBarrier.image = backbuffer;
642 dstBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
643 dstBarrier.subresourceRange.baseMipLevel = 0;
644 dstBarrier.subresourceRange.levelCount = 1;
645 dstBarrier.subresourceRange.baseArrayLayer = 0;
646 dstBarrier.subresourceRange.layerCount = 1;
647 dstBarrier.srcAccessMask = 0;
648 dstBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
649
650 orig::vkCmdPipelineBarrier(cmdBuffer,
651 VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
652 0,
653 0, nullptr,
654 0, nullptr,
655 1, &dstBarrier
656 );
657
658 VkClearColorValue clearColor = { 0.0f, 0.0f, 0.0f, 0.0f };
659 VkClearValue clearValue = {};
660 clearValue.color = clearColor;
661
662 VkImageSubresourceRange imageRange = {};
663 imageRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
664 imageRange.levelCount = 1;
665 imageRange.layerCount = 1;
666
667 orig::vkCmdClearColorImage(cmdBuffer, backbuffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1, &imageRange);
668
669 /* Transition destination image to general layout, which is the required layout for mapping the image memory later on */
670 dstBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
671 dstBarrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;

Callers

nothing calls this directly

Calls 3

acquireImageFunction · 0.85
beginCommandFunction · 0.85
EndCommandAndSubmitQueueFunction · 0.85

Tested by

no test coverage detected