diff --git a/Common/Data/Collections/FastVec.h b/Common/Data/Collections/FastVec.h index 08e5176d4ab7..6622cbdeb8da 100644 --- a/Common/Data/Collections/FastVec.h +++ b/Common/Data/Collections/FastVec.h @@ -69,7 +69,8 @@ class FastVec { void clear() { size_ = 0; } bool empty() const { return size_ == 0; } - const T *data() { return data_; } + const T *data() const { return data_; } + T *begin() { return data_; } T *end() { return data_ + size_; } const T *begin() const { return data_; } diff --git a/Common/GPU/Vulkan/VulkanBarrier.h b/Common/GPU/Vulkan/VulkanBarrier.h index 1fefb5adfa6a..9382f711666e 100644 --- a/Common/GPU/Vulkan/VulkanBarrier.h +++ b/Common/GPU/Vulkan/VulkanBarrier.h @@ -5,6 +5,7 @@ #include "Common/Log.h" #include "Common/GPU/Vulkan/VulkanLoader.h" +#include "Common/Data/Collections/FastVec.h" class VulkanContext; @@ -13,6 +14,8 @@ class VulkanContext; // However, not thread safe in any way! class VulkanBarrier { public: + VulkanBarrier() : imageBarriers_(4) {} + void TransitionImage( VkImage image, int baseMip, int numMipLevels, int numLayers, VkImageAspectFlags aspectMask, VkImageLayout oldImageLayout, VkImageLayout newImageLayout, @@ -25,7 +28,7 @@ class VulkanBarrier { dstStageMask_ |= dstStageMask; dependencyFlags_ |= VK_DEPENDENCY_BY_REGION_BIT; - VkImageMemoryBarrier imageBarrier; + VkImageMemoryBarrier &imageBarrier = imageBarriers_.push_uninitialized(); imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; imageBarrier.pNext = nullptr; imageBarrier.srcAccessMask = srcAccessMask; @@ -40,7 +43,6 @@ class VulkanBarrier { imageBarrier.subresourceRange.baseArrayLayer = 0; imageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; imageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - imageBarriers_.push_back(imageBarrier); } // Automatically determines access and stage masks from layouts. @@ -93,7 +95,7 @@ class VulkanBarrier { break; } - VkImageMemoryBarrier imageBarrier; + VkImageMemoryBarrier &imageBarrier = imageBarriers_.push_uninitialized(); imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; imageBarrier.pNext = nullptr; imageBarrier.srcAccessMask = srcAccessMask; @@ -108,7 +110,6 @@ class VulkanBarrier { imageBarrier.subresourceRange.baseArrayLayer = 0; imageBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; imageBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - imageBarriers_.push_back(imageBarrier); } void Flush(VkCommandBuffer cmd); @@ -116,6 +117,6 @@ class VulkanBarrier { private: VkPipelineStageFlags srcStageMask_ = 0; VkPipelineStageFlags dstStageMask_ = 0; - std::vector imageBarriers_; + FastVec imageBarriers_; VkDependencyFlags dependencyFlags_ = 0; };