diff options
| author | 2021-01-16 16:20:18 -0300 | |
|---|---|---|
| committer | 2021-02-13 02:17:24 -0300 | |
| commit | 35df1d1864ba721ea7b1cebf9a106dd771cde4f5 (patch) | |
| tree | 034a8281294246e2a8eea92d1937607ad00ed428 /src/video_core/vulkan_common | |
| parent | vulkan_device: Enable robustBufferAccess (diff) | |
| download | yuzu-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.cpp | 20 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.h | 5 |
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 | ||
| 789 | VkMemoryRequirements Device::GetBufferMemoryRequirements(VkBuffer buffer) const noexcept { | 789 | VkMemoryRequirements 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 | ||
| 795 | VkMemoryRequirements Device::GetImageMemoryRequirements(VkImage image) const noexcept { | 805 | VkMemoryRequirements 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 | ||