summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorph <39850852+Morph1984@users.noreply.github.com>2021-02-13 14:25:45 +0100
committerGitHub <noreply@github.com>2021-02-13 14:25:45 +0100
commit83227ad981aee7bff00b06788fdebff038505520 (patch)
tree9f386ef1ce5a5b78653b3661b4097dfc0f7f2849
parentMerge pull request #5915 from lat9nq/screenshots-dir-fix (diff)
parentvk_master_semaphore: Mark gpu_tick atomic operations with relaxed order (diff)
downloadyuzu-83227ad981aee7bff00b06788fdebff038505520.tar
yuzu-83227ad981aee7bff00b06788fdebff038505520.tar.gz
yuzu-83227ad981aee7bff00b06788fdebff038505520.tar.bz2
yuzu-83227ad981aee7bff00b06788fdebff038505520.tar.lz
yuzu-83227ad981aee7bff00b06788fdebff038505520.tar.xz
yuzu-83227ad981aee7bff00b06788fdebff038505520.tar.zst
yuzu-83227ad981aee7bff00b06788fdebff038505520.zip
-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 {
glClientWaitSync(fences[region].handle, 0, GL_TIMEOUT_IGNORED);
fences[region].Release();
}
- if (iterator + size > free_iterator) {
+ if (iterator + size >= free_iterator) {
free_iterator = iterator + size;
}
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:
/// Returns the current logical tick.
[[nodiscard]] u64 CurrentTick() const noexcept {
- return current_tick;
+ return current_tick.load(std::memory_order_relaxed);
+ }
+
+ /// Returns the last known GPU tick.
+ [[nodiscard]] u64 KnownGpuTick() const noexcept {
+ return gpu_tick.load(std::memory_order_relaxed);
}
/// Returns the timeline semaphore handle.
@@ -31,7 +36,7 @@ public:
/// Returns true when a tick has been hit by the GPU.
[[nodiscard]] bool IsFree(u64 tick) {
- return gpu_tick >= tick;
+ return gpu_tick.load(std::memory_order_relaxed) >= tick;
}
/// Advance to the logical tick.
@@ -41,7 +46,7 @@ public:
/// Refresh the known GPU tick
void Refresh() {
- gpu_tick = semaphore.GetCounter();
+ gpu_tick.store(semaphore.GetCounter(), std::memory_order_relaxed);
}
/// 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) {
used_iterator = iterator;
free_iterator = std::max(free_iterator, iterator + size);
- if (iterator + size > STREAM_BUFFER_SIZE) {
+ if (iterator + size >= STREAM_BUFFER_SIZE) {
std::fill(sync_ticks.begin() + Region(used_iterator), sync_ticks.begin() + NUM_SYNCS,
current_tick);
used_iterator = 0;
@@ -175,8 +175,9 @@ StagingBufferRef StagingBufferPool::GetStreamBuffer(size_t size) {
}
bool StagingBufferPool::AreRegionsActive(size_t region_begin, size_t region_end) const {
+ const u64 gpu_tick = scheduler.GetMasterSemaphore().KnownGpuTick();
return std::any_of(sync_ticks.begin() + region_begin, sync_ticks.begin() + region_end,
- [this](u64 sync_tick) { return !scheduler.IsFree(sync_tick); });
+ [gpu_tick](u64 sync_tick) { return gpu_tick < sync_tick; });
};
StagingBufferRef StagingBufferPool::GetStagingBuffer(size_t size, MemoryUsage usage) {