aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2022-11-18 20:47:29 +0000
committerGitHub <noreply@github.com>2022-11-18 21:47:29 +0100
commitde162a648b3bb1c8080460bfb8392951340ef40b (patch)
treec0a81e411cfc6b4e6f2813724bcbe41b7ea5953b
parent131baebe2a569cfe8533aa57ca6df2c8f846f6ad (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.cs8
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)