diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp | 25 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_staging_buffer_pool.h | 2 |
2 files changed, 18 insertions, 9 deletions
diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp index bc71202e2..4baf791d4 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp | |||
| @@ -130,10 +130,7 @@ StagingBufferRef StagingBufferPool::Request(size_t size, MemoryUsage usage) { | |||
| 130 | if (usage == MemoryUsage::Upload && size <= MAX_STREAM_BUFFER_REQUEST_SIZE) { | 130 | if (usage == MemoryUsage::Upload && size <= MAX_STREAM_BUFFER_REQUEST_SIZE) { |
| 131 | return GetStreamBuffer(size); | 131 | return GetStreamBuffer(size); |
| 132 | } | 132 | } |
| 133 | if (const std::optional<StagingBufferRef> ref = TryGetReservedBuffer(size, usage)) { | 133 | return GetStagingBuffer(size, usage); |
| 134 | return *ref; | ||
| 135 | } | ||
| 136 | return CreateStagingBuffer(size, usage); | ||
| 137 | } | 134 | } |
| 138 | 135 | ||
| 139 | void StagingBufferPool::TickFrame() { | 136 | void StagingBufferPool::TickFrame() { |
| @@ -145,17 +142,20 @@ void StagingBufferPool::TickFrame() { | |||
| 145 | } | 142 | } |
| 146 | 143 | ||
| 147 | StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { | 144 | StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { |
| 145 | for (size_t region = Region(free_iterator) + 1, | ||
| 146 | region_end = std::min(Region(iterator + size) + 1, NUM_SYNCS); | ||
| 147 | region < region_end; ++region) { | ||
| 148 | // If we'd have to wait, get a staging buffer to avoid waiting | ||
| 149 | if (!scheduler.IsFree(sync_ticks[region])) { | ||
| 150 | return GetStagingBuffer(size, MemoryUsage::Upload); | ||
| 151 | } | ||
| 152 | } | ||
| 148 | for (size_t region = Region(used_iterator), region_end = Region(iterator); region < region_end; | 153 | for (size_t region = Region(used_iterator), region_end = Region(iterator); region < region_end; |
| 149 | ++region) { | 154 | ++region) { |
| 150 | sync_ticks[region] = scheduler.CurrentTick(); | 155 | sync_ticks[region] = scheduler.CurrentTick(); |
| 151 | } | 156 | } |
| 152 | used_iterator = iterator; | 157 | used_iterator = iterator; |
| 153 | 158 | ||
| 154 | for (size_t region = Region(free_iterator) + 1, | ||
| 155 | region_end = std::min(Region(iterator + size) + 1, NUM_SYNCS); | ||
| 156 | region < region_end; ++region) { | ||
| 157 | scheduler.Wait(sync_ticks[region]); | ||
| 158 | } | ||
| 159 | if (iterator + size > free_iterator) { | 159 | if (iterator + size > free_iterator) { |
| 160 | free_iterator = iterator + size; | 160 | free_iterator = iterator + size; |
| 161 | } | 161 | } |
| @@ -180,6 +180,13 @@ StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { | |||
| 180 | }; | 180 | }; |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | StagingBufferRef StagingBufferPool::GetStagingBuffer(size_t size, MemoryUsage usage) { | ||
| 184 | if (const std::optional<StagingBufferRef> ref = TryGetReservedBuffer(size, usage)) { | ||
| 185 | return *ref; | ||
| 186 | } | ||
| 187 | return CreateStagingBuffer(size, usage); | ||
| 188 | } | ||
| 189 | |||
| 183 | std::optional<StagingBufferRef> StagingBufferPool::TryGetReservedBuffer(size_t size, | 190 | std::optional<StagingBufferRef> StagingBufferPool::TryGetReservedBuffer(size_t size, |
| 184 | MemoryUsage usage) { | 191 | MemoryUsage usage) { |
| 185 | StagingBuffers& cache_level = GetCache(usage)[Common::Log2Ceil64(size)]; | 192 | StagingBuffers& cache_level = GetCache(usage)[Common::Log2Ceil64(size)]; |
diff --git a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h index 4ed99c0df..8e4cadf9b 100644 --- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h +++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.h | |||
| @@ -67,6 +67,8 @@ private: | |||
| 67 | 67 | ||
| 68 | StagingBufferRef GetStreamBuffer(size_t size); | 68 | StagingBufferRef GetStreamBuffer(size_t size); |
| 69 | 69 | ||
| 70 | StagingBufferRef GetStagingBuffer(size_t size, MemoryUsage usage); | ||
| 71 | |||
| 70 | std::optional<StagingBufferRef> TryGetReservedBuffer(size_t size, MemoryUsage usage); | 72 | std::optional<StagingBufferRef> TryGetReservedBuffer(size_t size, MemoryUsage usage); |
| 71 | 73 | ||
| 72 | StagingBufferRef CreateStagingBuffer(size_t size, MemoryUsage usage); | 74 | StagingBufferRef CreateStagingBuffer(size_t size, MemoryUsage usage); |