From ebfbae8dd147e9273e1bd1ba6b6b206ec8ce8e68 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Wed, 10 Mar 2021 01:08:08 +1000 Subject: [PATCH] Vulkan/StreamBuffer: Prevent skipping fance when wrapping around --- src/common/vulkan/stream_buffer.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/common/vulkan/stream_buffer.cpp b/src/common/vulkan/stream_buffer.cpp index 234021093..f27871ba5 100644 --- a/src/common/vulkan/stream_buffer.cpp +++ b/src/common/vulkan/stream_buffer.cpp @@ -173,8 +173,9 @@ bool StreamBuffer::ReserveMemory(u32 num_bytes, u32 alignment) return false; } + UpdateGPUPosition(); + // Is the GPU behind or up to date with our current offset? - UpdateCurrentFencePosition(); if (m_current_offset >= m_current_gpu_position) { const u32 remaining_bytes = m_size - m_current_offset; @@ -194,7 +195,7 @@ bool StreamBuffer::ReserveMemory(u32 num_bytes, u32 alignment) { // Reset offset to zero, since we're allocating behind the gpu now m_current_offset = 0; - m_current_space = m_current_gpu_position; + m_current_space = m_current_gpu_position - 1; return true; } } @@ -208,7 +209,7 @@ bool StreamBuffer::ReserveMemory(u32 num_bytes, u32 alignment) { // Place at the current position, since this is still behind the GPU. m_current_offset = Common::AlignUp(m_current_offset, alignment); - m_current_space = m_current_gpu_position - m_current_offset; + m_current_space = m_current_gpu_position - m_current_offset - 1; return true; } } @@ -243,14 +244,11 @@ void StreamBuffer::CommitMemory(u32 final_num_bytes) m_current_offset += final_num_bytes; m_current_space -= final_num_bytes; + UpdateCurrentFencePosition(); } void StreamBuffer::UpdateCurrentFencePosition() { - // Don't create a tracking entry if the GPU is caught up with the buffer. - if (m_current_offset == m_current_gpu_position) - return; - // Has the offset changed since the last fence? const u64 counter = g_vulkan_context->GetCurrentFenceCounter(); if (!m_tracked_fences.empty() && m_tracked_fences.back().first == counter) @@ -261,7 +259,6 @@ void StreamBuffer::UpdateCurrentFencePosition() } // New buffer, so update the GPU position while we're at it. - UpdateGPUPosition(); m_tracked_fences.emplace_back(counter, m_current_offset); }