mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2025-12-16 12:09:51 +00:00
reuse buffers instead of recreating
This commit is contained in:
parent
3d7f302a8a
commit
be1a05dead
@ -181,13 +181,13 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||||||
|
|
||||||
if (first.Address < address)
|
if (first.Address < address)
|
||||||
{
|
{
|
||||||
first.Size = address - first.Address;
|
|
||||||
|
|
||||||
if (first.EndAddress > endAddress)
|
if (first.EndAddress > endAddress)
|
||||||
{
|
{
|
||||||
Add(new BufferModifiedRange(endAddress, first.EndAddress - endAddress,
|
Add(new BufferModifiedRange(endAddress, first.EndAddress - endAddress,
|
||||||
first.SyncNumber, first.Parent));
|
first.SyncNumber, first.Parent));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
first.Size = address - first.Address;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -198,7 +198,14 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||||||
}
|
}
|
||||||
else
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferModifiedRange buffPre = null;
|
|
||||||
BufferModifiedRange buffPost = null;
|
|
||||||
bool extendsPost = false;
|
|
||||||
bool extendsPre = false;
|
|
||||||
|
|
||||||
if (first.Address < address)
|
if (first.Address < address)
|
||||||
{
|
{
|
||||||
buffPre = new BufferModifiedRange(first.Address, address - first.Address,
|
first.Size = address - first.Address;
|
||||||
first.SyncNumber, first.Parent);
|
first = first.Next;
|
||||||
extendsPre = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last.EndAddress > endAddress)
|
if (last.EndAddress > endAddress)
|
||||||
{
|
{
|
||||||
buffPost = new BufferModifiedRange(endAddress, last.EndAddress - endAddress,
|
last.Size = last.EndAddress - endAddress;
|
||||||
last.SyncNumber, last.Parent);
|
last.Address = endAddress;
|
||||||
extendsPost = true;
|
last = last.Previous;
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoveRange(first, last);
|
if (first.Address < last.Address)
|
||||||
|
|
||||||
if (extendsPre)
|
|
||||||
{
|
{
|
||||||
Add(buffPre);
|
RemoveRange(first.Next, last);
|
||||||
|
first.Address = address;
|
||||||
|
first.Size = size;
|
||||||
|
first.SyncNumber = syncNumber;
|
||||||
|
first.Parent = this;
|
||||||
}
|
}
|
||||||
|
else if (first.Address == last.Address)
|
||||||
if (extendsPost)
|
|
||||||
{
|
{
|
||||||
Add(buffPost);
|
first.Address = address;
|
||||||
|
first.Size = size;
|
||||||
|
first.SyncNumber = syncNumber;
|
||||||
|
first.Parent = this;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
Add(new BufferModifiedRange(address, size, syncNumber, this));
|
{
|
||||||
|
Add(new BufferModifiedRange(address, size, syncNumber, this));
|
||||||
|
}
|
||||||
|
|
||||||
Lock.ExitWriteLock();
|
Lock.ExitWriteLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -535,18 +543,25 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||||||
|
|
||||||
private void ClearPart(BufferModifiedRange overlap, ulong address, ulong endAddress)
|
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 the overlap extends outside of the clear range, make sure those parts still exist.
|
||||||
|
|
||||||
if (overlap.Address < address)
|
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;
|
||||||
}
|
}
|
||||||
|
else if (overlap.EndAddress > endAddress)
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,8 +24,8 @@ namespace Ryujinx.Memory.Range
|
|||||||
/// Check if this range overlaps with another.
|
/// Check if this range overlaps with another.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="address">Base address</param>
|
/// <param name="address">Base address</param>
|
||||||
/// <param name="size">Size of the range</param>
|
/// <param name="endAddress">EndAddress of the range</param>
|
||||||
/// <returns>True if overlapping, false otherwise</returns>
|
/// <returns>True if overlapping, false otherwise</returns>
|
||||||
bool OverlapsWith(ulong address, ulong size);
|
bool OverlapsWith(ulong address, ulong endAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user