Use mirrored texture wraps when available (#361)

This commit is contained in:
ReinUsesLisp 2018-08-25 16:39:08 -03:00 committed by gdkchan
parent a42ab2e40c
commit 43c4e7c78d
2 changed files with 35 additions and 9 deletions

View file

@ -215,16 +215,31 @@ namespace Ryujinx.Graphics.Gal.OpenGL
{ {
switch (Wrap) switch (Wrap)
{ {
case GalTextureWrap.Repeat: return TextureWrapMode.Repeat; case GalTextureWrap.Repeat: return TextureWrapMode.Repeat;
case GalTextureWrap.MirroredRepeat: return TextureWrapMode.MirroredRepeat; case GalTextureWrap.MirroredRepeat: return TextureWrapMode.MirroredRepeat;
case GalTextureWrap.ClampToEdge: return TextureWrapMode.ClampToEdge; case GalTextureWrap.ClampToEdge: return TextureWrapMode.ClampToEdge;
case GalTextureWrap.ClampToBorder: return TextureWrapMode.ClampToBorder; case GalTextureWrap.ClampToBorder: return TextureWrapMode.ClampToBorder;
case GalTextureWrap.Clamp: return TextureWrapMode.Clamp; case GalTextureWrap.Clamp: return TextureWrapMode.Clamp;
}
//TODO: Those needs extensions (and are currently wrong). if (OGLExtension.HasTextureMirrorClamp())
case GalTextureWrap.MirrorClampToEdge: return TextureWrapMode.ClampToEdge; {
case GalTextureWrap.MirrorClampToBorder: return TextureWrapMode.ClampToBorder; switch (Wrap)
case GalTextureWrap.MirrorClamp: return TextureWrapMode.Clamp; {
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)); throw new ArgumentException(nameof(Wrap));

View file

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