diff options
author | riperiperi <rhy3756547@hotmail.com> | 2022-11-18 20:47:29 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-18 21:47:29 +0100 |
commit | de162a648b3bb1c8080460bfb8392951340ef40b (patch) | |
tree | c0a81e411cfc6b4e6f2813724bcbe41b7ea5953b | |
parent | 131baebe2a569cfe8533aa57ca6df2c8f846f6ad (diff) |
Gpu: Fix thread safety of ReregisterRanges (#3865)1.1.362
A quick fix to prevent reading the wrong value of Count when reregistering ranges for a new target buffer. Buffer flushes from another thread can modify the range list when the lock isn't active, which can change the count.
This prevents some crashes in Pokemon Scarlet/Violet. It's probably likely that buffer migration during flush is causing some other issues in this game, but this at least prevents the crashing.
-rw-r--r-- | Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs b/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs index b9b533fb..07dbd209 100644 --- a/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs +++ b/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs @@ -325,13 +325,15 @@ namespace Ryujinx.Graphics.Gpu.Memory public void ReregisterRanges(Action<ulong, ulong> rangeAction) { ref var ranges = ref ThreadStaticArray<BufferModifiedRange>.Get(); + int count; // Range list must be consistent for this operation. lock (_lock) { - if (ranges.Length < Count) + count = Count; + if (ranges.Length < count) { - Array.Resize(ref ranges, Count); + Array.Resize(ref ranges, count); } int i = 0; @@ -342,7 +344,7 @@ namespace Ryujinx.Graphics.Gpu.Memory } ulong currentSync = _context.SyncNumber; - for (int i = 0; i < Count; i++) + for (int i = 0; i < count; i++) { BufferModifiedRange range = ranges[i]; if (range.SyncNumber != currentSync) |