diff --git a/Common/GPU/Vulkan/VulkanBarrier.cpp b/Common/GPU/Vulkan/VulkanBarrier.cpp index f75e1caaf9..130787b8bb 100644 --- a/Common/GPU/Vulkan/VulkanBarrier.cpp +++ b/Common/GPU/Vulkan/VulkanBarrier.cpp @@ -114,3 +114,22 @@ void VulkanBarrier::TransitionImageAuto( imageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; imageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; } + +void TransitionImageLayout2(VkCommandBuffer cmd, VkImage image, int baseMip, int numMipLevels, int numLayers, VkImageAspectFlags aspectMask, + VkImageLayout oldImageLayout, VkImageLayout newImageLayout, + VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, + VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask) { + VkImageMemoryBarrier image_memory_barrier{ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER }; + image_memory_barrier.srcAccessMask = srcAccessMask; + image_memory_barrier.dstAccessMask = dstAccessMask; + image_memory_barrier.oldLayout = oldImageLayout; + image_memory_barrier.newLayout = newImageLayout; + image_memory_barrier.image = image; + image_memory_barrier.subresourceRange.aspectMask = aspectMask; + image_memory_barrier.subresourceRange.baseMipLevel = baseMip; + image_memory_barrier.subresourceRange.levelCount = numMipLevels; + image_memory_barrier.subresourceRange.layerCount = numLayers; // We never use more than one layer, and old Mali drivers have problems with VK_REMAINING_ARRAY_LAYERS/VK_REMAINING_MIP_LEVELS. + image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + vkCmdPipelineBarrier(cmd, srcStageMask, dstStageMask, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); +} diff --git a/Common/GPU/Vulkan/VulkanBarrier.h b/Common/GPU/Vulkan/VulkanBarrier.h index ceab810969..556f8bb074 100644 --- a/Common/GPU/Vulkan/VulkanBarrier.h +++ b/Common/GPU/Vulkan/VulkanBarrier.h @@ -11,6 +11,7 @@ class VulkanContext; class VulkanBarrierBatch { public: + VulkanBarrierBatch() : imageBarriers_(4) {} ~VulkanBarrierBatch(); VkImageMemoryBarrier *Add(VkImage image, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags) { @@ -80,3 +81,9 @@ private: FastVec imageBarriers_; VkDependencyFlags dependencyFlags_ = 0; }; + +// Detailed control, but just a single image. Use the barrier batch when possible. +void TransitionImageLayout2(VkCommandBuffer cmd, VkImage image, int baseMip, int mipLevels, int numLayers, VkImageAspectFlags aspectMask, + VkImageLayout oldImageLayout, VkImageLayout newImageLayout, + VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, + VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask); diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index bc5fc5956f..dc5b9246bc 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -1494,25 +1494,6 @@ bool VulkanContext::CreateShaderModule(const std::vector &spirv, VkSha } } -void TransitionImageLayout2(VkCommandBuffer cmd, VkImage image, int baseMip, int numMipLevels, int numLayers, VkImageAspectFlags aspectMask, - VkImageLayout oldImageLayout, VkImageLayout newImageLayout, - VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, - VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask) { - VkImageMemoryBarrier image_memory_barrier{ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER }; - image_memory_barrier.srcAccessMask = srcAccessMask; - image_memory_barrier.dstAccessMask = dstAccessMask; - image_memory_barrier.oldLayout = oldImageLayout; - image_memory_barrier.newLayout = newImageLayout; - image_memory_barrier.image = image; - image_memory_barrier.subresourceRange.aspectMask = aspectMask; - image_memory_barrier.subresourceRange.baseMipLevel = baseMip; - image_memory_barrier.subresourceRange.levelCount = numMipLevels; - image_memory_barrier.subresourceRange.layerCount = numLayers; // We never use more than one layer, and old Mali drivers have problems with VK_REMAINING_ARRAY_LAYERS/VK_REMAINING_MIP_LEVELS. - image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - vkCmdPipelineBarrier(cmd, srcStageMask, dstStageMask, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); -} - EShLanguage FindLanguage(const VkShaderStageFlagBits shader_type) { switch (shader_type) { case VK_SHADER_STAGE_VERTEX_BIT: diff --git a/Common/GPU/Vulkan/VulkanContext.h b/Common/GPU/Vulkan/VulkanContext.h index 3a004ad9c4..516b41d6e3 100644 --- a/Common/GPU/Vulkan/VulkanContext.h +++ b/Common/GPU/Vulkan/VulkanContext.h @@ -498,12 +498,6 @@ private: VmaAllocator allocator_ = VK_NULL_HANDLE; }; -// Detailed control. -void TransitionImageLayout2(VkCommandBuffer cmd, VkImage image, int baseMip, int mipLevels, int numLayers, VkImageAspectFlags aspectMask, - VkImageLayout oldImageLayout, VkImageLayout newImageLayout, - VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, - VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask); - // GLSL compiler void init_glslang(); void finalize_glslang(); diff --git a/Core/RetroAchievements.cpp b/Core/RetroAchievements.cpp index 835cf88ae8..8ef5be7b89 100644 --- a/Core/RetroAchievements.cpp +++ b/Core/RetroAchievements.cpp @@ -73,7 +73,7 @@ static bool HashISOFile(ISOFileSystem *fs, const std::string filename, md5_conte return false; } - std::unique_ptr buffer(new uint8_t[sz]); + auto buffer = std::make_unique(sz); if (fs->ReadFile(handle, buffer.get(), sz) != sz) { return false; } @@ -84,13 +84,15 @@ static bool HashISOFile(ISOFileSystem *fs, const std::string filename, md5_conte } // Consumes the blockDevice. -std::string ComputePSPHash(BlockDevice *blockDevice) { +// If failed, returns an empty string, otherwise a 32-character string with the hash in hex format. +static std::string ComputePSPHash(BlockDevice *blockDevice) { md5_context md5; ppsspp_md5_starts(&md5); SequentialHandleAllocator alloc; { - std::unique_ptr fs(new ISOFileSystem(&alloc, blockDevice)); + // ISOFileSystem takes owneship of the blockDevice here. + auto fs = std::make_unique(&alloc, blockDevice); if (!HashISOFile(fs.get(), "PSP_GAME/PARAM.SFO", &md5)) { return std::string(); }