diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
index 848eedd66..668633e7b 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp
@@ -201,10 +201,6 @@ void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, VkBuffer buffer,
     });
 }
 
-void BufferCacheRuntime::BindBuffer(VkBuffer buffer, u32 offset, u32 size) {
-    update_descriptor_queue.AddBuffer(buffer, offset, size);
-}
-
 void BufferCacheRuntime::ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle) {
     if (num_indices <= current_num_indices) {
         return;
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h
index 041e6515c..982e92191 100644
--- a/src/video_core/renderer_vulkan/vk_buffer_cache.h
+++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h
@@ -8,6 +8,7 @@
 #include "video_core/engines/maxwell_3d.h"
 #include "video_core/renderer_vulkan/vk_compute_pass.h"
 #include "video_core/renderer_vulkan/vk_staging_buffer_pool.h"
+#include "video_core/renderer_vulkan/vk_update_descriptor.h"
 #include "video_core/vulkan_common/vulkan_memory_allocator.h"
 #include "video_core/vulkan_common/vulkan_wrapper.h"
 
@@ -16,7 +17,6 @@ namespace Vulkan {
 class Device;
 class VKDescriptorPool;
 class VKScheduler;
-class VKUpdateDescriptorQueue;
 
 class BufferCacheRuntime;
 
@@ -86,7 +86,9 @@ public:
     }
 
 private:
-    void BindBuffer(VkBuffer buffer, u32 offset, u32 size);
+    void BindBuffer(VkBuffer buffer, u32 offset, u32 size) {
+        update_descriptor_queue.AddBuffer(buffer, offset, size);
+    }
 
     void ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle);
 
diff --git a/src/video_core/renderer_vulkan/vk_update_descriptor.cpp b/src/video_core/renderer_vulkan/vk_update_descriptor.cpp
index f99273c6a..dc45fdcb1 100644
--- a/src/video_core/renderer_vulkan/vk_update_descriptor.cpp
+++ b/src/video_core/renderer_vulkan/vk_update_descriptor.cpp
@@ -20,20 +20,20 @@ VKUpdateDescriptorQueue::VKUpdateDescriptorQueue(const Device& device_, VKSchedu
 VKUpdateDescriptorQueue::~VKUpdateDescriptorQueue() = default;
 
 void VKUpdateDescriptorQueue::TickFrame() {
-    payload.clear();
+    payload_cursor = payload.data();
 }
 
 void VKUpdateDescriptorQueue::Acquire() {
     // Minimum number of entries required.
     // This is the maximum number of entries a single draw call migth use.
-    static constexpr std::size_t MIN_ENTRIES = 0x400;
+    static constexpr size_t MIN_ENTRIES = 0x400;
 
-    if (payload.size() + MIN_ENTRIES >= payload.max_size()) {
+    if (std::distance(payload.data(), payload_cursor) + MIN_ENTRIES >= payload.max_size()) {
         LOG_WARNING(Render_Vulkan, "Payload overflow, waiting for worker thread");
         scheduler.WaitWorker();
-        payload.clear();
+        payload_cursor = payload.data();
     }
-    upload_start = &*payload.end();
+    upload_start = payload_cursor;
 }
 
 void VKUpdateDescriptorQueue::Send(VkDescriptorUpdateTemplateKHR update_template,
diff --git a/src/video_core/renderer_vulkan/vk_update_descriptor.h b/src/video_core/renderer_vulkan/vk_update_descriptor.h
index e214f7195..d35e77c44 100644
--- a/src/video_core/renderer_vulkan/vk_update_descriptor.h
+++ b/src/video_core/renderer_vulkan/vk_update_descriptor.h
@@ -4,8 +4,7 @@
 
 #pragma once
 
-#include <variant>
-#include <boost/container/static_vector.hpp>
+#include <array>
 
 #include "common/common_types.h"
 #include "video_core/vulkan_common/vulkan_wrapper.h"
@@ -16,13 +15,15 @@ class Device;
 class VKScheduler;
 
 struct DescriptorUpdateEntry {
+    struct Empty {};
+
+    DescriptorUpdateEntry() = default;
     DescriptorUpdateEntry(VkDescriptorImageInfo image_) : image{image_} {}
-
     DescriptorUpdateEntry(VkDescriptorBufferInfo buffer_) : buffer{buffer_} {}
-
     DescriptorUpdateEntry(VkBufferView texel_buffer_) : texel_buffer{texel_buffer_} {}
 
     union {
+        Empty empty{};
         VkDescriptorImageInfo image;
         VkDescriptorBufferInfo buffer;
         VkBufferView texel_buffer;
@@ -41,39 +42,40 @@ public:
     void Send(VkDescriptorUpdateTemplateKHR update_template, VkDescriptorSet set);
 
     void AddSampledImage(VkImageView image_view, VkSampler sampler) {
-        payload.emplace_back(VkDescriptorImageInfo{
+        *(payload_cursor++) = VkDescriptorImageInfo{
             .sampler = sampler,
             .imageView = image_view,
             .imageLayout = VK_IMAGE_LAYOUT_GENERAL,
-        });
+        };
     }
 
     void AddImage(VkImageView image_view) {
-        payload.emplace_back(VkDescriptorImageInfo{
+        *(payload_cursor++) = VkDescriptorImageInfo{
             .sampler = VK_NULL_HANDLE,
             .imageView = image_view,
             .imageLayout = VK_IMAGE_LAYOUT_GENERAL,
-        });
+        };
     }
 
-    void AddBuffer(VkBuffer buffer, u64 offset, size_t size) {
-        payload.emplace_back(VkDescriptorBufferInfo{
+    void AddBuffer(VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size) {
+        *(payload_cursor++) = VkDescriptorBufferInfo{
             .buffer = buffer,
             .offset = offset,
             .range = size,
-        });
+        };
     }
 
     void AddTexelBuffer(VkBufferView texel_buffer) {
-        payload.emplace_back(texel_buffer);
+        *(payload_cursor++) = texel_buffer;
     }
 
 private:
     const Device& device;
     VKScheduler& scheduler;
 
+    DescriptorUpdateEntry* payload_cursor = nullptr;
     const DescriptorUpdateEntry* upload_start = nullptr;
-    boost::container::static_vector<DescriptorUpdateEntry, 0x10000> payload;
+    std::array<DescriptorUpdateEntry, 0x10000> payload;
 };
 
 } // namespace Vulkan