vk_stream_buffer: Fix synchronization during buffer overflow

* Especially with custom textures the bufer would fill up but didn't wait any watchers on overflow overriding some textures
This commit is contained in:
GPUCode
2023-02-25 16:05:02 +02:00
parent 11ca327951
commit 74be64b60a
2 changed files with 5 additions and 4 deletions

View File

@@ -54,8 +54,6 @@ std::tuple<u8*, u64, bool> StreamBuffer::Map(u64 size, u64 alignment) {
offset = Common::AlignUp(offset, alignment); offset = Common::AlignUp(offset, alignment);
} }
WaitPendingOperations(offset);
bool invalidate{false}; bool invalidate{false};
if (offset + size > stream_buffer_size) { if (offset + size > stream_buffer_size) {
// The buffer would overflow, save the amount of used watches and reset the state. // The buffer would overflow, save the amount of used watches and reset the state.
@@ -70,6 +68,9 @@ std::tuple<u8*, u64, bool> StreamBuffer::Map(u64 size, u64 alignment) {
wait_bound = 0; wait_bound = 0;
} }
const u64 mapped_upper_bound = offset + size;
WaitPendingOperations(mapped_upper_bound);
return std::make_tuple(mapped + offset, offset, invalidate); return std::make_tuple(mapped + offset, offset, invalidate);
} }
@@ -128,7 +129,7 @@ void StreamBuffer::WaitPendingOperations(u64 requested_upper_bound) {
if (!invalidation_mark) { if (!invalidation_mark) {
return; return;
} }
while (requested_upper_bound < wait_bound && wait_cursor < *invalidation_mark) { while (requested_upper_bound > wait_bound && wait_cursor < *invalidation_mark) {
auto& watch = previous_watches[wait_cursor]; auto& watch = previous_watches[wait_cursor];
wait_bound = watch.upper_bound; wait_bound = watch.upper_bound;
scheduler.Wait(watch.tick); scheduler.Wait(watch.tick);

View File

@@ -106,7 +106,7 @@ u32 UnpackDepthStencil(const StagingData& data, vk::Format dest) {
return depth_offset; return depth_offset;
} }
constexpr u64 UPLOAD_BUFFER_SIZE = 64 * 1024 * 1024; constexpr u64 UPLOAD_BUFFER_SIZE = 128 * 1024 * 1024;
constexpr u64 DOWNLOAD_BUFFER_SIZE = 16 * 1024 * 1024; constexpr u64 DOWNLOAD_BUFFER_SIZE = 16 * 1024 * 1024;
} // Anonymous namespace } // Anonymous namespace