From 2ebe929fa5b9047cf925eb7d02ac4134c0f8a325 Mon Sep 17 00:00:00 2001
From: MutantAura <44103205+MutantAura@users.noreply.github.com>
Date: Sun, 26 May 2024 19:06:41 +0100
Subject: [PATCH] misc: Change disk shader cache compression algorithm to
`Brotli` (RFC 7932) (#6841)
* Prefer `Brotli` compression for disk shader cache.
* Final default case for decompression switch.
* Prefer fastest compression.
---
.../Shader/DiskCache/BinarySerializer.cs | 39 +++++++++++++++++--
.../Shader/DiskCache/CompressionAlgorithm.cs | 5 +++
.../Shader/DiskCache/DiskCacheCommon.cs | 2 +-
3 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs
index c4a648fe4..ab4508f6d 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/BinarySerializer.cs
@@ -125,9 +125,18 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
CompressionAlgorithm algorithm = CompressionAlgorithm.None;
Read(ref algorithm);
- if (algorithm == CompressionAlgorithm.Deflate)
+ switch (algorithm)
{
- _activeStream = new DeflateStream(_stream, CompressionMode.Decompress, true);
+ case CompressionAlgorithm.None:
+ break;
+ case CompressionAlgorithm.Deflate:
+ _activeStream = new DeflateStream(_stream, CompressionMode.Decompress, true);
+ break;
+ case CompressionAlgorithm.Brotli:
+ _activeStream = new BrotliStream(_stream, CompressionMode.Decompress, true);
+ break;
+ default:
+ throw new ArgumentException($"Invalid compression algorithm \"{algorithm}\"");
}
}
@@ -139,9 +148,18 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
{
Write(ref algorithm);
- if (algorithm == CompressionAlgorithm.Deflate)
+ switch (algorithm)
{
- _activeStream = new DeflateStream(_stream, CompressionLevel.Fastest, true);
+ case CompressionAlgorithm.None:
+ break;
+ case CompressionAlgorithm.Deflate:
+ _activeStream = new DeflateStream(_stream, CompressionLevel.Fastest, true);
+ break;
+ case CompressionAlgorithm.Brotli:
+ _activeStream = new BrotliStream(_stream, CompressionLevel.Fastest, true);
+ break;
+ default:
+ throw new ArgumentException($"Invalid compression algorithm \"{algorithm}\"");
}
}
@@ -187,6 +205,14 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
}
stream.Dispose();
break;
+ case CompressionAlgorithm.Brotli:
+ stream = new BrotliStream(stream, CompressionMode.Decompress, true);
+ for (int offset = 0; offset < data.Length;)
+ {
+ offset += stream.Read(data[offset..]);
+ }
+ stream.Dispose();
+ break;
}
}
@@ -210,6 +236,11 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
stream.Write(data);
stream.Dispose();
break;
+ case CompressionAlgorithm.Brotli:
+ stream = new BrotliStream(stream, CompressionLevel.Fastest, true);
+ stream.Write(data);
+ stream.Dispose();
+ break;
}
}
}
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/CompressionAlgorithm.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/CompressionAlgorithm.cs
index 96ddbb513..86d3de07d 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/CompressionAlgorithm.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/CompressionAlgorithm.cs
@@ -14,5 +14,10 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
/// Deflate compression (RFC 1951).
///
Deflate,
+
+ ///
+ /// Brotli compression (RFC 7932).
+ ///
+ Brotli,
}
}
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheCommon.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheCommon.cs
index c4ce0b870..cecfe9acf 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheCommon.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheCommon.cs
@@ -51,7 +51,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
/// Compression algorithm
public static CompressionAlgorithm GetCompressionAlgorithm()
{
- return CompressionAlgorithm.Deflate;
+ return CompressionAlgorithm.Brotli;
}
}
}