forked from Mirror/Ryujinx
Improve the speed of redundant ASTC texture data updates (#1636)
This commit is contained in:
parent
49f970d5bd
commit
cf0f0fc4e7
1 changed files with 30 additions and 1 deletions
|
@ -16,6 +16,11 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
/// </summary>
|
||||
class Texture : IRange, IDisposable
|
||||
{
|
||||
// How many updates we need before switching to the byte-by-byte comparison
|
||||
// modification check method.
|
||||
// This method uses much more memory so we want to avoid it if possible.
|
||||
private const int ByteComparisonSwitchThreshold = 4;
|
||||
|
||||
private GpuContext _context;
|
||||
|
||||
private SizeInfo _sizeInfo;
|
||||
|
@ -51,6 +56,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
private int _firstLevel;
|
||||
|
||||
private bool _hasData;
|
||||
private int _updateCount;
|
||||
private byte[] _currentData;
|
||||
|
||||
private ITexture _arrayViewTexture;
|
||||
private Target _arrayViewTarget;
|
||||
|
@ -545,7 +552,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the memory for this texture was modified, and returns true if it was.
|
||||
/// Checks if the memory for this texture was modified, and returns true if it was.
|
||||
/// The modified flags are consumed as a result.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
|
@ -591,6 +598,27 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
|
||||
IsModified = false;
|
||||
|
||||
// If the host does not support ASTC compression, we need to do the decompression.
|
||||
// The decompression is slow, so we want to avoid it as much as possible.
|
||||
// This does a byte-by-byte check and skips the update if the data is equal in this case.
|
||||
// This improves the speed on applications that overwrites ASTC data without changing anything.
|
||||
if (Info.FormatInfo.Format.IsAstc() && !_context.Capabilities.SupportsAstcCompression)
|
||||
{
|
||||
if (_updateCount < ByteComparisonSwitchThreshold)
|
||||
{
|
||||
_updateCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool dataMatches = _currentData != null && data.SequenceEqual(_currentData);
|
||||
_currentData = data.ToArray();
|
||||
if (dataMatches)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data = ConvertToHostCompatibleFormat(data);
|
||||
|
||||
HostTexture.SetData(data);
|
||||
|
@ -1132,6 +1160,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||
/// </summary>
|
||||
private void DisposeTextures()
|
||||
{
|
||||
_currentData = null;
|
||||
HostTexture.Release();
|
||||
|
||||
_arrayViewTexture?.Release();
|
||||
|
|
Reference in a new issue