summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_stream_buffer.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_master_semaphore.h11
-rw-r--r--src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp5
3 files changed, 12 insertions, 6 deletions
diff --git a/src/video_core/renderer_opengl/gl_stream_buffer.cpp b/src/video_core/renderer_opengl/gl_stream_buffer.cpp
index bfb992a79..77b3ee0fe 100644
--- a/src/video_core/renderer_opengl/gl_stream_buffer.cpp
+++ b/src/video_core/renderer_opengl/gl_stream_buffer.cpp
@@ -40,7 +40,7 @@ std::pair<std::span<u8>, size_t> StreamBuffer::Request(size_t size) noexcept {
40 glClientWaitSync(fences[region].handle, 0, GL_TIMEOUT_IGNORED); 40 glClientWaitSync(fences[region].handle, 0, GL_TIMEOUT_IGNORED);
41 fences[region].Release(); 41 fences[region].Release();
42 } 42 }
43 if (iterator + size > free_iterator) { 43 if (iterator + size >= free_iterator) {
44 free_iterator = iterator + size; 44 free_iterator = iterator + size;
45 } 45 }
46 if (iterator + size > STREAM_BUFFER_SIZE) { 46 if (iterator + size > STREAM_BUFFER_SIZE) {
diff --git a/src/video_core/renderer_vulkan/vk_master_semaphore.h b/src/video_core/renderer_vulkan/vk_master_semaphore.h
index f336f1862..2c7ed654d 100644
--- a/src/video_core/renderer_vulkan/vk_master_semaphore.h
+++ b/src/video_core/renderer_vulkan/vk_master_semaphore.h
@@ -21,7 +21,12 @@ public:
21 21
22 /// Returns the current logical tick. 22 /// Returns the current logical tick.
23 [[nodiscard]] u64 CurrentTick() const noexcept { 23 [[nodiscard]] u64 CurrentTick() const noexcept {
24 return current_tick; 24 return current_tick.load(std::memory_order_relaxed);
25 }
26
27 /// Returns the last known GPU tick.
28 [[nodiscard]] u64 KnownGpuTick() const noexcept {
29 return gpu_tick.load(std::memory_order_relaxed);
25 } 30 }
26 31
27 /// Returns the timeline semaphore handle. 32 /// Returns the timeline semaphore handle.
@@ -31,7 +36,7 @@ public:
31 36
32 /// Returns true when a tick has been hit by the GPU. 37 /// Returns true when a tick has been hit by the GPU.
33 [[nodiscard]] bool IsFree(u64 tick) { 38 [[nodiscard]] bool IsFree(u64 tick) {
34 return gpu_tick >= tick; 39 return gpu_tick.load(std::memory_order_relaxed) >= tick;
35 } 40 }
36 41
37 /// Advance to the logical tick. 42 /// Advance to the logical tick.
@@ -41,7 +46,7 @@ public:
41 46
42 /// Refresh the known GPU tick 47 /// Refresh the known GPU tick
43 void Refresh() { 48 void Refresh() {
44 gpu_tick = semaphore.GetCounter(); 49 gpu_tick.store(semaphore.GetCounter(), std::memory_order_relaxed);
45 } 50 }
46 51
47 /// Waits for a tick to be hit on the GPU 52 /// Waits for a tick to be hit on the GPU
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 dfd8c8e5a..7a1232497 100644
--- a/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp
+++ b/src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp
@@ -153,7 +153,7 @@ StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) {
153 used_iterator = iterator; 153 used_iterator = iterator;
154 free_iterator = std::max(free_iterator, iterator + size); 154 free_iterator = std::max(free_iterator, iterator + size);
155 155
156 if (iterator + size > STREAM_BUFFER_SIZE) { 156 if (iterator + size >= STREAM_BUFFER_SIZE) {
157 std::fill(sync_ticks.begin() + Region(used_iterator), sync_ticks.begin() + NUM_SYNCS, 157 std::fill(sync_ticks.begin() + Region(used_iterator), sync_ticks.begin() + NUM_SYNCS,
158 current_tick); 158 current_tick);
159 used_iterator = 0; 159 used_iterator = 0;
@@ -175,8 +175,9 @@ StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) {
175} 175}
176 176
177bool StagingBufferPool::AreRegionsActive(size_t region_begin, size_t region_end) const { 177bool StagingBufferPool::AreRegionsActive(size_t region_begin, size_t region_end) const {
178 const u64 gpu_tick = scheduler.GetMasterSemaphore().KnownGpuTick();
178 return std::any_of(sync_ticks.begin() + region_begin, sync_ticks.begin() + region_end, 179 return std::any_of(sync_ticks.begin() + region_begin, sync_ticks.begin() + region_end,
179 [this](u64 sync_tick) { return !scheduler.IsFree(sync_tick); }); 180 [gpu_tick](u64 sync_tick) { return gpu_tick < sync_tick; });
180}; 181};
181 182
182StagingBufferRef StagingBufferPool::GetStagingBuffer(size_t size, MemoryUsage usage) { 183StagingBufferRef StagingBufferPool::GetStagingBuffer(size_t size, MemoryUsage usage) {