using OpenTK.Graphics.OpenGL; using Ryujinx.Common.Logging; using System; namespace Ryujinx.Graphics.Gal.OpenGL { static class OglExtension { // Private lazy backing variables private static Lazy _enhancedLayouts = new Lazy(() => HasExtension("GL_ARB_enhanced_layouts")); private static Lazy _textureMirrorClamp = new Lazy(() => HasExtension("GL_EXT_texture_mirror_clamp")); private static Lazy _viewportArray = new Lazy(() => HasExtension("GL_ARB_viewport_array")); private static Lazy _nvidiaDriver = new Lazy(() => IsNvidiaDriver()); // Public accessors public static bool EnhancedLayouts => _enhancedLayouts.Value; public static bool TextureMirrorClamp => _textureMirrorClamp.Value; public static bool ViewportArray => _viewportArray.Value; public static bool NvidiaDriver => _nvidiaDriver.Value; private static bool HasExtension(string name) { int numExtensions = GL.GetInteger(GetPName.NumExtensions); for (int extension = 0; extension < numExtensions; extension++) { if (GL.GetString(StringNameIndexed.Extensions, extension) == name) { return true; } } Logger.PrintInfo(LogClass.Gpu, $"OpenGL extension {name} unavailable. You may experience some performance degradation"); return false; } private static bool IsNvidiaDriver() { return GL.GetString(StringName.Vendor).Equals("NVIDIA Corporation"); } public static class Required { // Public accessors public static bool EnhancedLayouts => _enhancedLayoutsRequired.Value; public static bool TextureMirrorClamp => _textureMirrorClampRequired.Value; public static bool ViewportArray => _viewportArrayRequired.Value; // Private lazy backing variables private static Lazy _enhancedLayoutsRequired = new Lazy(() => HasExtensionRequired(OglExtension.EnhancedLayouts, "GL_ARB_enhanced_layouts")); private static Lazy _textureMirrorClampRequired = new Lazy(() => HasExtensionRequired(OglExtension.TextureMirrorClamp, "GL_EXT_texture_mirror_clamp")); private static Lazy _viewportArrayRequired = new Lazy(() => HasExtensionRequired(OglExtension.ViewportArray, "GL_ARB_viewport_array")); private static bool HasExtensionRequired(bool value, string name) { if (value) { return true; } Logger.PrintWarning(LogClass.Gpu, $"Required OpenGL extension {name} unavailable. You may experience some rendering issues"); return false; } } } }