summaryrefslogtreecommitdiff
path: root/src/video_core/vulkan_common
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-01-16 16:20:18 -0300
committerGravatar ReinUsesLisp2021-02-13 02:17:24 -0300
commit35df1d1864ba721ea7b1cebf9a106dd771cde4f5 (patch)
tree034a8281294246e2a8eea92d1937607ad00ed428 /src/video_core/vulkan_common
parentvulkan_device: Enable robustBufferAccess (diff)
downloadyuzu-35df1d1864ba721ea7b1cebf9a106dd771cde4f5.tar.gz
yuzu-35df1d1864ba721ea7b1cebf9a106dd771cde4f5.tar.xz
yuzu-35df1d1864ba721ea7b1cebf9a106dd771cde4f5.zip
vk_staging_buffer_pool: Add stream buffer for small uploads
This uses a ring buffer similar to OpenGL's stream buffer for small uploads. This stops us from allocating several small buffers, reducing memory fragmentation and cache locality. It uses dedicated allocations when possible.
Diffstat (limited to 'src/video_core/vulkan_common')
-rw-r--r--src/video_core/vulkan_common/vulkan_wrapper.cpp20
-rw-r--r--src/video_core/vulkan_common/vulkan_wrapper.h5
2 files changed, 18 insertions, 7 deletions
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp
index d39bbdc70..2aa0ffbe6 100644
--- a/src/video_core/vulkan_common/vulkan_wrapper.cpp
+++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp
@@ -168,7 +168,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept {
168 X(vkFreeCommandBuffers); 168 X(vkFreeCommandBuffers);
169 X(vkFreeDescriptorSets); 169 X(vkFreeDescriptorSets);
170 X(vkFreeMemory); 170 X(vkFreeMemory);
171 X(vkGetBufferMemoryRequirements); 171 X(vkGetBufferMemoryRequirements2);
172 X(vkGetDeviceQueue); 172 X(vkGetDeviceQueue);
173 X(vkGetEventStatus); 173 X(vkGetEventStatus);
174 X(vkGetFenceStatus); 174 X(vkGetFenceStatus);
@@ -786,10 +786,20 @@ DeviceMemory Device::AllocateMemory(const VkMemoryAllocateInfo& ai) const {
786 return DeviceMemory(memory, handle, *dld); 786 return DeviceMemory(memory, handle, *dld);
787} 787}
788 788
789VkMemoryRequirements Device::GetBufferMemoryRequirements(VkBuffer buffer) const noexcept { 789VkMemoryRequirements Device::GetBufferMemoryRequirements(VkBuffer buffer,
790 VkMemoryRequirements requirements; 790 void* pnext) const noexcept {
791 dld->vkGetBufferMemoryRequirements(handle, buffer, &requirements); 791 const VkBufferMemoryRequirementsInfo2 info{
792 return requirements; 792 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
793 .pNext = nullptr,
794 .buffer = buffer,
795 };
796 VkMemoryRequirements2 requirements{
797 .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
798 .pNext = pnext,
799 .memoryRequirements{},
800 };
801 dld->vkGetBufferMemoryRequirements2(handle, &info, &requirements);
802 return requirements.memoryRequirements;
793} 803}
794 804
795VkMemoryRequirements Device::GetImageMemoryRequirements(VkImage image) const noexcept { 805VkMemoryRequirements Device::GetImageMemoryRequirements(VkImage image) const noexcept {
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h
index 7f781b081..3e36d356a 100644
--- a/src/video_core/vulkan_common/vulkan_wrapper.h
+++ b/src/video_core/vulkan_common/vulkan_wrapper.h
@@ -283,7 +283,7 @@ struct DeviceDispatch : InstanceDispatch {
283 PFN_vkFreeCommandBuffers vkFreeCommandBuffers{}; 283 PFN_vkFreeCommandBuffers vkFreeCommandBuffers{};
284 PFN_vkFreeDescriptorSets vkFreeDescriptorSets{}; 284 PFN_vkFreeDescriptorSets vkFreeDescriptorSets{};
285 PFN_vkFreeMemory vkFreeMemory{}; 285 PFN_vkFreeMemory vkFreeMemory{};
286 PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements{}; 286 PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2{};
287 PFN_vkGetDeviceQueue vkGetDeviceQueue{}; 287 PFN_vkGetDeviceQueue vkGetDeviceQueue{};
288 PFN_vkGetEventStatus vkGetEventStatus{}; 288 PFN_vkGetEventStatus vkGetEventStatus{};
289 PFN_vkGetFenceStatus vkGetFenceStatus{}; 289 PFN_vkGetFenceStatus vkGetFenceStatus{};
@@ -871,7 +871,8 @@ public:
871 871
872 DeviceMemory AllocateMemory(const VkMemoryAllocateInfo& ai) const; 872 DeviceMemory AllocateMemory(const VkMemoryAllocateInfo& ai) const;
873 873
874 VkMemoryRequirements GetBufferMemoryRequirements(VkBuffer buffer) const noexcept; 874 VkMemoryRequirements GetBufferMemoryRequirements(VkBuffer buffer,
875 void* pnext = nullptr) const noexcept;
875 876
876 VkMemoryRequirements GetImageMemoryRequirements(VkImage image) const noexcept; 877 VkMemoryRequirements GetImageMemoryRequirements(VkImage image) const noexcept;
877 878