| 612 | } |
| 613 | |
| 614 | void 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; |
nothing calls this directly
no test coverage detected