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:
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user