aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs35
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLExtension.cs11
2 files changed, 36 insertions, 10 deletions
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs
index e04a59d4..64f670a5 100644
--- a/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs
+++ b/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));
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLExtension.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLExtension.cs
index 69fce6d3..5ad42298 100644
--- a/Ryujinx.Graphics/Gal/OpenGL/OGLExtension.cs
+++ b/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)