diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_stream_buffer.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_master_semaphore.h | 11 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_staging_buffer_pool.cpp | 5 |
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 | ||
| 177 | bool StagingBufferPool::AreRegionsActive(size_t region_begin, size_t region_end) const { | 177 | bool 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 | ||
| 182 | StagingBufferRef StagingBufferPool::GetStagingBuffer(size_t size, MemoryUsage usage) { | 183 | StagingBufferRef StagingBufferPool::GetStagingBuffer(size_t size, MemoryUsage usage) { |