diff --git a/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs b/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
index aae75bbff..03f676af9 100644
--- a/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
+++ b/src/Ryujinx.Graphics.Gpu/Memory/BufferModifiedRangeList.cs
@@ -181,13 +181,13 @@ namespace Ryujinx.Graphics.Gpu.Memory
if (first.Address < address)
{
- first.Size = address - first.Address;
-
if (first.EndAddress > endAddress)
{
Add(new BufferModifiedRange(endAddress, first.EndAddress - endAddress,
first.SyncNumber, first.Parent));
}
+
+ first.Size = address - first.Address;
}
else
{
@@ -198,7 +198,14 @@ namespace Ryujinx.Graphics.Gpu.Memory
}
else
{
- Remove(first);
+ first.Address = address;
+ first.Size = size;
+ first.SyncNumber = syncNumber;
+ first.Parent = this;
+
+ Lock.ExitWriteLock();
+
+ return;
}
}
@@ -208,38 +215,39 @@ namespace Ryujinx.Graphics.Gpu.Memory
return;
}
- BufferModifiedRange buffPre = null;
- BufferModifiedRange buffPost = null;
- bool extendsPost = false;
- bool extendsPre = false;
-
if (first.Address < address)
{
- buffPre = new BufferModifiedRange(first.Address, address - first.Address,
- first.SyncNumber, first.Parent);
- extendsPre = true;
+ first.Size = address - first.Address;
+ first = first.Next;
}
if (last.EndAddress > endAddress)
{
- buffPost = new BufferModifiedRange(endAddress, last.EndAddress - endAddress,
- last.SyncNumber, last.Parent);
- extendsPost = true;
+ last.Size = last.EndAddress - endAddress;
+ last.Address = endAddress;
+ last = last.Previous;
}
- RemoveRange(first, last);
-
- if (extendsPre)
+ if (first.Address < last.Address)
{
- Add(buffPre);
+ RemoveRange(first.Next, last);
+ first.Address = address;
+ first.Size = size;
+ first.SyncNumber = syncNumber;
+ first.Parent = this;
}
-
- if (extendsPost)
+ else if (first.Address == last.Address)
{
- Add(buffPost);
+ first.Address = address;
+ first.Size = size;
+ first.SyncNumber = syncNumber;
+ first.Parent = this;
}
-
- Add(new BufferModifiedRange(address, size, syncNumber, this));
+ else
+ {
+ Add(new BufferModifiedRange(address, size, syncNumber, this));
+ }
+
Lock.ExitWriteLock();
}
@@ -535,18 +543,25 @@ namespace Ryujinx.Graphics.Gpu.Memory
private void ClearPart(BufferModifiedRange overlap, ulong address, ulong endAddress)
{
- Remove(overlap);
-
// If the overlap extends outside of the clear range, make sure those parts still exist.
if (overlap.Address < address)
{
- Add(new BufferModifiedRange(overlap.Address, address - overlap.Address, overlap.SyncNumber, overlap.Parent));
+ if (overlap.EndAddress > endAddress)
+ {
+ Add(new BufferModifiedRange(endAddress, overlap.EndAddress - endAddress, overlap.SyncNumber, overlap.Parent));
+ }
+
+ overlap.Size = address - overlap.Address;
}
-
- if (overlap.EndAddress > endAddress)
+ else if (overlap.EndAddress > endAddress)
{
- Add(new BufferModifiedRange(endAddress, overlap.EndAddress - endAddress, overlap.SyncNumber, overlap.Parent));
+ overlap.Size = overlap.EndAddress - endAddress;
+ overlap.Address = endAddress;
+ }
+ else
+ {
+ Remove(overlap);
}
}
diff --git a/src/Ryujinx.Memory/Range/IRange.cs b/src/Ryujinx.Memory/Range/IRange.cs
index c85e21d1d..c8f50a921 100644
--- a/src/Ryujinx.Memory/Range/IRange.cs
+++ b/src/Ryujinx.Memory/Range/IRange.cs
@@ -24,8 +24,8 @@ namespace Ryujinx.Memory.Range
/// Check if this range overlaps with another.
///
/// Base address
- /// Size of the range
+ /// EndAddress of the range
/// True if overlapping, false otherwise
- bool OverlapsWith(ulong address, ulong size);
+ bool OverlapsWith(ulong address, ulong endAddress);
}
}