mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2025-03-13 13:10:18 +00:00
Better ModifiedSequence handling
This should handle PreciseEvents properly, and simplifies a few things.
This commit is contained in:
parent
6b22f41e10
commit
d727e819af
3 changed files with 36 additions and 26 deletions
|
@ -17,6 +17,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
protected GpuContext Context;
|
||||
protected PhysicalMemory PhysicalMemory;
|
||||
protected int SequenceNumber;
|
||||
protected int ModifiedSequenceNumber;
|
||||
|
||||
protected T1[] Items;
|
||||
protected T2[] DescriptorCache;
|
||||
|
@ -42,6 +43,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
private readonly CpuMultiRegionHandle _memoryTracking;
|
||||
private readonly Action<ulong, ulong> _modifiedDelegate;
|
||||
|
||||
private int _modifiedSequenceOffset;
|
||||
private bool _modified;
|
||||
|
||||
/// <summary>
|
||||
|
@ -104,11 +106,15 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
/// This causes invalidation of pool entries,
|
||||
/// if a modification of entries by the CPU is detected.
|
||||
/// </summary>
|
||||
public bool SynchronizeMemory()
|
||||
public void SynchronizeMemory()
|
||||
{
|
||||
_modified = false;
|
||||
_memoryTracking.QueryModified(_modifiedDelegate);
|
||||
return _modified;
|
||||
|
||||
if (_modified)
|
||||
{
|
||||
UpdateModifiedSequence();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -135,6 +141,15 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
InvalidateRangeImpl(mAddress, mSize);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates the modified sequence number using the current sequence number and offset,
|
||||
/// indicating that it has been modified.
|
||||
/// </summary>
|
||||
protected void UpdateModifiedSequence()
|
||||
{
|
||||
ModifiedSequenceNumber = SequenceNumber + _modifiedSequenceOffset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// An action to be performed when a precise memory access occurs to this resource.
|
||||
/// Makes sure that the dirty flags are checked.
|
||||
|
@ -146,7 +161,16 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
{
|
||||
if (write && Context.SequenceNumber == SequenceNumber)
|
||||
{
|
||||
//Common.Logging.Logger.Error?.Print(Common.Logging.LogClass.Gpu, "Precise action...");
|
||||
if (ModifiedSequenceNumber == SequenceNumber + _modifiedSequenceOffset)
|
||||
{
|
||||
// The modified sequence number is offset when PreciseActions occur so that
|
||||
// users checking it will see an increment and know the pool has changed since
|
||||
// their last look, even though the main SequenceNumber has not been changed.
|
||||
|
||||
_modifiedSequenceOffset++;
|
||||
}
|
||||
|
||||
// Force the pool to be checked again the next time it is used.
|
||||
SequenceNumber--;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
class SamplerPool : Pool<Sampler, SamplerDescriptor>
|
||||
{
|
||||
private float _forcedAnisotropy;
|
||||
private int _modifiedSequenceNumber;
|
||||
|
||||
/// <summary>
|
||||
/// Constructs a new instance of the sampler pool.
|
||||
|
@ -53,10 +52,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
|
||||
SequenceNumber = Context.SequenceNumber;
|
||||
|
||||
if (SynchronizeMemory())
|
||||
{
|
||||
_modifiedSequenceNumber = SequenceNumber;
|
||||
}
|
||||
SynchronizeMemory();
|
||||
}
|
||||
|
||||
Sampler sampler = Items[id];
|
||||
|
@ -78,7 +74,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
/// <summary>
|
||||
/// Checks if the pool was modified, and returns the last sequence number where a modification was detected.
|
||||
/// </summary>
|
||||
/// <returns>The last sequence number where a modification was detected</returns>
|
||||
/// <returns>A number that increments each time a modification is detected</returns>
|
||||
public int CheckModified()
|
||||
{
|
||||
if (SequenceNumber != Context.SequenceNumber)
|
||||
|
@ -99,16 +95,13 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
}
|
||||
}
|
||||
|
||||
_modifiedSequenceNumber = SequenceNumber;
|
||||
UpdateModifiedSequence();
|
||||
}
|
||||
|
||||
if (SynchronizeMemory())
|
||||
{
|
||||
_modifiedSequenceNumber = SequenceNumber;
|
||||
}
|
||||
SynchronizeMemory();
|
||||
}
|
||||
|
||||
return _modifiedSequenceNumber;
|
||||
return ModifiedSequenceNumber;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -14,7 +14,6 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
{
|
||||
private readonly GpuChannel _channel;
|
||||
private readonly ConcurrentQueue<Texture> _dereferenceQueue = new ConcurrentQueue<Texture>();
|
||||
private int _modifiedSequenceNumber;
|
||||
private TextureDescriptor _defaultDescriptor;
|
||||
|
||||
/// <summary>
|
||||
|
@ -106,10 +105,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
{
|
||||
SequenceNumber = Context.SequenceNumber;
|
||||
|
||||
if (SynchronizeMemory())
|
||||
{
|
||||
_modifiedSequenceNumber = SequenceNumber;
|
||||
}
|
||||
SynchronizeMemory();
|
||||
}
|
||||
|
||||
GetInternal(id, out Texture texture);
|
||||
|
@ -142,20 +138,17 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
/// <summary>
|
||||
/// Checks if the pool was modified, and returns the last sequence number where a modification was detected.
|
||||
/// </summary>
|
||||
/// <returns>The last sequence number where a modifiaction was detected</returns>
|
||||
/// <returns>A number that increments each time a modification is detected</returns>
|
||||
public int CheckModified()
|
||||
{
|
||||
if (SequenceNumber != Context.SequenceNumber)
|
||||
{
|
||||
SequenceNumber = Context.SequenceNumber;
|
||||
|
||||
if (SynchronizeMemory())
|
||||
{
|
||||
_modifiedSequenceNumber = SequenceNumber;
|
||||
}
|
||||
SynchronizeMemory();
|
||||
}
|
||||
|
||||
return _modifiedSequenceNumber;
|
||||
return ModifiedSequenceNumber;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
Loading…
Reference in a new issue