diff --git a/Ryujinx.Graphics.OpenGL/HwCapabilities.cs b/Ryujinx.Graphics.OpenGL/HwCapabilities.cs index f958946e7..883542d6c 100644 --- a/Ryujinx.Graphics.OpenGL/HwCapabilities.cs +++ b/Ryujinx.Graphics.OpenGL/HwCapabilities.cs @@ -5,10 +5,75 @@ namespace Ryujinx.Graphics.OpenGL { static class HwCapabilities { - private static Lazy _astcCompression = new Lazy(() => HasExtension("GL_KHR_texture_compression_astc_ldr")); + private static Lazy _astcCompression = new Lazy(SupportsAstcCompressionImpl); public static bool SupportsAstcCompression => _astcCompression.Value; + private static bool SupportsAstcCompressionImpl() + { + // The NVIDIA driver has software decompression support for ASTC textures, + // but the extension is not exposed, so we check the list of compressed + // formats too, since the support is indicated there. + return SupportsAnyAstcFormat() || HasExtension("GL_KHR_texture_compression_astc_ldr"); + } + + private static bool SupportsAnyAstcFormat() + { + int formatsCount = GL.GetInteger(GetPName.NumCompressedTextureFormats); + + int[] formats = new int[formatsCount]; + + GL.GetInteger(GetPName.CompressedTextureFormats, formats); + + foreach (int format in formats) + { + if (IsAstcFormat(format)) + { + return true; + } + } + + return false; + } + + private static bool IsAstcFormat(int format) + { + switch ((All)format) + { + case All.CompressedRgbaAstc4X4Khr: + case All.CompressedRgbaAstc5X4Khr: + case All.CompressedRgbaAstc5X5Khr: + case All.CompressedRgbaAstc6X5Khr: + case All.CompressedRgbaAstc6X6Khr: + case All.CompressedRgbaAstc8X5Khr: + case All.CompressedRgbaAstc8X6Khr: + case All.CompressedRgbaAstc8X8Khr: + case All.CompressedRgbaAstc10X5Khr: + case All.CompressedRgbaAstc10X6Khr: + case All.CompressedRgbaAstc10X8Khr: + case All.CompressedRgbaAstc10X10Khr: + case All.CompressedRgbaAstc12X10Khr: + case All.CompressedRgbaAstc12X12Khr: + case All.CompressedSrgb8Alpha8Astc4X4Khr: + case All.CompressedSrgb8Alpha8Astc5X4Khr: + case All.CompressedSrgb8Alpha8Astc5X5Khr: + case All.CompressedSrgb8Alpha8Astc6X5Khr: + case All.CompressedSrgb8Alpha8Astc6X6Khr: + case All.CompressedSrgb8Alpha8Astc8X5Khr: + case All.CompressedSrgb8Alpha8Astc8X6Khr: + case All.CompressedSrgb8Alpha8Astc8X8Khr: + case All.CompressedSrgb8Alpha8Astc10X5Khr: + case All.CompressedSrgb8Alpha8Astc10X6Khr: + case All.CompressedSrgb8Alpha8Astc10X8Khr: + case All.CompressedSrgb8Alpha8Astc10X10Khr: + case All.CompressedSrgb8Alpha8Astc12X10Khr: + case All.CompressedSrgb8Alpha8Astc12X12Khr: + return true; + } + + return false; + } + private static bool HasExtension(string name) { int numExtensions = GL.GetInteger(GetPName.NumExtensions);