summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp25
-rw-r--r--src/video_core/renderer_vulkan/vk_staging_buffer_pool.h2
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
139void StagingBufferPool::TickFrame() { 136void StagingBufferPool::TickFrame() {
@@ -145,17 +142,20 @@ void StagingBufferPool::TickFrame() {
145} 142}
146 143
147StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) { 144StagingBufferRef 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
183StagingBufferRef 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
183std::optional<StagingBufferRef> StagingBufferPool::TryGetReservedBuffer(size_t size, 190std::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);