Kaynağa Gözat

Use mirrored texture wraps when available (#361)

ReinUsesLisp 7 yıl önce
ebeveyn
işleme
43c4e7c78d

+ 25 - 10
Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs

@@ -215,16 +215,31 @@ namespace Ryujinx.Graphics.Gal.OpenGL
         {
             switch (Wrap)
             {
-                case GalTextureWrap.Repeat:              return TextureWrapMode.Repeat;
-                case GalTextureWrap.MirroredRepeat:      return TextureWrapMode.MirroredRepeat;
-                case GalTextureWrap.ClampToEdge:         return TextureWrapMode.ClampToEdge;
-                case GalTextureWrap.ClampToBorder:       return TextureWrapMode.ClampToBorder;
-                case GalTextureWrap.Clamp:               return TextureWrapMode.Clamp;
-
-                //TODO: Those needs extensions (and are currently wrong).
-                case GalTextureWrap.MirrorClampToEdge:   return TextureWrapMode.ClampToEdge;
-                case GalTextureWrap.MirrorClampToBorder: return TextureWrapMode.ClampToBorder;
-                case GalTextureWrap.MirrorClamp:         return TextureWrapMode.Clamp;
+                case GalTextureWrap.Repeat:         return TextureWrapMode.Repeat;
+                case GalTextureWrap.MirroredRepeat: return TextureWrapMode.MirroredRepeat;
+                case GalTextureWrap.ClampToEdge:    return TextureWrapMode.ClampToEdge;
+                case GalTextureWrap.ClampToBorder:  return TextureWrapMode.ClampToBorder;
+                case GalTextureWrap.Clamp:          return TextureWrapMode.Clamp;
+            }
+
+            if (OGLExtension.HasTextureMirrorClamp())
+            {
+                switch (Wrap)
+                {
+                    case GalTextureWrap.MirrorClampToEdge:   return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampToEdgeExt;
+                    case GalTextureWrap.MirrorClampToBorder: return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampToBorderExt;
+                    case GalTextureWrap.MirrorClamp:         return (TextureWrapMode)ExtTextureMirrorClamp.MirrorClampExt;
+                }
+            }
+            else
+            {
+                //Fallback to non-mirrored clamps
+                switch (Wrap)
+                {
+                    case GalTextureWrap.MirrorClampToEdge:   return TextureWrapMode.ClampToEdge;
+                    case GalTextureWrap.MirrorClampToBorder: return TextureWrapMode.ClampToBorder;
+                    case GalTextureWrap.MirrorClamp:         return TextureWrapMode.Clamp;
+                }
             }
 
             throw new ArgumentException(nameof(Wrap));

+ 11 - 0
Ryujinx.Graphics/Gal/OpenGL/OGLExtension.cs

@@ -8,6 +8,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
 
         private static bool EnhancedLayouts;
 
+        private static bool TextureMirrorClamp;
+
         public static bool HasEnhancedLayouts()
         {
             EnsureInitialized();
@@ -15,6 +17,13 @@ namespace Ryujinx.Graphics.Gal.OpenGL
             return EnhancedLayouts;
         }
 
+        public static bool HasTextureMirrorClamp()
+        {
+            EnsureInitialized();
+
+            return TextureMirrorClamp;
+        }
+
         private static void EnsureInitialized()
         {
             if (Initialized)
@@ -23,6 +32,8 @@ namespace Ryujinx.Graphics.Gal.OpenGL
             }
 
             EnhancedLayouts = HasExtension("GL_ARB_enhanced_layouts");
+
+            TextureMirrorClamp = HasExtension("GL_EXT_texture_mirror_clamp");
         }
 
         private static bool HasExtension(string Name)