From 86ed9a9b89841436934bd17f9a4fa8b01b929e67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 31 May 2023 10:58:08 +0200 Subject: [PATCH] Move code to cpp --- Common/GPU/Vulkan/VulkanBarrier.cpp | 94 +++++++++++++++++++++++++++++ Common/GPU/Vulkan/VulkanBarrier.h | 90 +-------------------------- 2 files changed, 97 insertions(+), 87 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanBarrier.cpp b/Common/GPU/Vulkan/VulkanBarrier.cpp index d47f50684579..93ebd9ea4b7f 100644 --- a/Common/GPU/Vulkan/VulkanBarrier.cpp +++ b/Common/GPU/Vulkan/VulkanBarrier.cpp @@ -11,3 +11,97 @@ void VulkanBarrier::Flush(VkCommandBuffer cmd) { dstStageMask_ = 0; dependencyFlags_ = 0; } + +void VulkanBarrier::TransitionImage( + VkImage image, int baseMip, int numMipLevels, int numLayers, VkImageAspectFlags aspectMask, + VkImageLayout oldImageLayout, VkImageLayout newImageLayout, + VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, + VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask +) { + _dbg_assert_(image != VK_NULL_HANDLE); + + srcStageMask_ |= srcStageMask; + dstStageMask_ |= dstStageMask; + dependencyFlags_ |= VK_DEPENDENCY_BY_REGION_BIT; + + VkImageMemoryBarrier &imageBarrier = imageBarriers_.push_uninitialized(); + imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + imageBarrier.pNext = nullptr; + imageBarrier.srcAccessMask = srcAccessMask; + imageBarrier.dstAccessMask = dstAccessMask; + imageBarrier.oldLayout = oldImageLayout; + imageBarrier.newLayout = newImageLayout; + imageBarrier.image = image; + imageBarrier.subresourceRange.aspectMask = aspectMask; + imageBarrier.subresourceRange.baseMipLevel = baseMip; + imageBarrier.subresourceRange.levelCount = numMipLevels; + imageBarrier.subresourceRange.layerCount = numLayers; // NOTE: We could usually use VK_REMAINING_ARRAY_LAYERS/VK_REMAINING_MIP_LEVELS, but really old Mali drivers have problems with those. + imageBarrier.subresourceRange.baseArrayLayer = 0; + imageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + imageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; +} + +void VulkanBarrier::TransitionImageAuto( + VkImage image, int baseMip, int numMipLevels, int numLayers, VkImageAspectFlags aspectMask, + VkImageLayout oldImageLayout, VkImageLayout newImageLayout) { + _dbg_assert_(image != VK_NULL_HANDLE); + + VkAccessFlags srcAccessMask = 0; + VkAccessFlags dstAccessMask = 0; + switch (oldImageLayout) { + case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: + // Assert aspect here? + srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; + srcStageMask_ |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + break; + case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: + // Assert aspect here? + srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; + srcStageMask_ |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + break; + case VK_IMAGE_LAYOUT_UNDEFINED: + // Actually this seems wrong? + if (aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) { + srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; + srcStageMask_ |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + } + break; + case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: + srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + srcStageMask_ |= VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: + srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + srcStageMask_ |= VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + default: + _assert_msg_(false, "Unexpected oldLayout: %d", (int)oldImageLayout); + break; + } + + switch (newImageLayout) { + case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + dstStageMask_ |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + break; + default: + _assert_msg_(false, "Unexpected newLayout: %d", (int)newImageLayout); + break; + } + + VkImageMemoryBarrier &imageBarrier = imageBarriers_.push_uninitialized(); + imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + imageBarrier.pNext = nullptr; + imageBarrier.srcAccessMask = srcAccessMask; + imageBarrier.dstAccessMask = dstAccessMask; + imageBarrier.oldLayout = oldImageLayout; + imageBarrier.newLayout = newImageLayout; + imageBarrier.image = image; + imageBarrier.subresourceRange.aspectMask = aspectMask; + imageBarrier.subresourceRange.baseMipLevel = baseMip; + imageBarrier.subresourceRange.levelCount = numMipLevels; + imageBarrier.subresourceRange.layerCount = numLayers; // NOTE: We could usually use VK_REMAINING_ARRAY_LAYERS/VK_REMAINING_MIP_LEVELS, but really old Mali drivers have problems with those. + imageBarrier.subresourceRange.baseArrayLayer = 0; + imageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + imageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; +} diff --git a/Common/GPU/Vulkan/VulkanBarrier.h b/Common/GPU/Vulkan/VulkanBarrier.h index 2356fbcc18fa..b671c7d1df99 100644 --- a/Common/GPU/Vulkan/VulkanBarrier.h +++ b/Common/GPU/Vulkan/VulkanBarrier.h @@ -23,96 +23,12 @@ class VulkanBarrier { VkImageLayout oldImageLayout, VkImageLayout newImageLayout, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask - ) { - _dbg_assert_(image != VK_NULL_HANDLE); - - srcStageMask_ |= srcStageMask; - dstStageMask_ |= dstStageMask; - dependencyFlags_ |= VK_DEPENDENCY_BY_REGION_BIT; - - VkImageMemoryBarrier &imageBarrier = imageBarriers_.push_uninitialized(); - imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - imageBarrier.pNext = nullptr; - imageBarrier.srcAccessMask = srcAccessMask; - imageBarrier.dstAccessMask = dstAccessMask; - imageBarrier.oldLayout = oldImageLayout; - imageBarrier.newLayout = newImageLayout; - imageBarrier.image = image; - imageBarrier.subresourceRange.aspectMask = aspectMask; - imageBarrier.subresourceRange.baseMipLevel = baseMip; - imageBarrier.subresourceRange.levelCount = numMipLevels; - imageBarrier.subresourceRange.layerCount = numLayers; // NOTE: We could usually use VK_REMAINING_ARRAY_LAYERS/VK_REMAINING_MIP_LEVELS, but really old Mali drivers have problems with those. - imageBarrier.subresourceRange.baseArrayLayer = 0; - imageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - imageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - } + ); // Automatically determines access and stage masks from layouts. // Not universally usable, but works for PPSSPP's use. - void TransitionImageAuto( - VkImage image, int baseMip, int numMipLevels, int numLayers, VkImageAspectFlags aspectMask, VkImageLayout oldImageLayout, VkImageLayout newImageLayout - ) { - _dbg_assert_(image != VK_NULL_HANDLE); - - VkAccessFlags srcAccessMask = 0; - VkAccessFlags dstAccessMask = 0; - switch (oldImageLayout) { - case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - // Assert aspect here? - srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; - srcStageMask_ |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - break; - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: - // Assert aspect here? - srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; - srcStageMask_ |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - break; - case VK_IMAGE_LAYOUT_UNDEFINED: - // Actually this seems wrong? - if (aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) { - srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT; - srcStageMask_ |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - } - break; - case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - srcStageMask_ |= VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - srcStageMask_ |= VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - default: - _assert_msg_(false, "Unexpected oldLayout: %d", (int)oldImageLayout); - break; - } - - switch (newImageLayout) { - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - dstStageMask_ |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - break; - default: - _assert_msg_(false, "Unexpected newLayout: %d", (int)newImageLayout); - break; - } - - VkImageMemoryBarrier &imageBarrier = imageBarriers_.push_uninitialized(); - imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - imageBarrier.pNext = nullptr; - imageBarrier.srcAccessMask = srcAccessMask; - imageBarrier.dstAccessMask = dstAccessMask; - imageBarrier.oldLayout = oldImageLayout; - imageBarrier.newLayout = newImageLayout; - imageBarrier.image = image; - imageBarrier.subresourceRange.aspectMask = aspectMask; - imageBarrier.subresourceRange.baseMipLevel = baseMip; - imageBarrier.subresourceRange.levelCount = numMipLevels; - imageBarrier.subresourceRange.layerCount = numLayers; // NOTE: We could usually use VK_REMAINING_ARRAY_LAYERS/VK_REMAINING_MIP_LEVELS, but really old Mali drivers have problems with those. - imageBarrier.subresourceRange.baseArrayLayer = 0; - imageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - imageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - } + void TransitionImageAuto(VkImage image, int baseMip, int numMipLevels, int numLayers, VkImageAspectFlags aspectMask, + VkImageLayout oldImageLayout, VkImageLayout newImageLayout); void Flush(VkCommandBuffer cmd);