Add seamless cubemap flag in sampler parameters. (#1658)

* Add seamless cubemap flag in sampler parameters.

* Check for the extension
This commit is contained in:
riperiperi 2020-11-02 20:03:06 +00:00 committed by GitHub
parent e1da7df207
commit 4c6feb652f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 21 deletions

View File

@ -5,6 +5,8 @@ namespace Ryujinx.Graphics.GAL
public MinFilter MinFilter { get; } public MinFilter MinFilter { get; }
public MagFilter MagFilter { get; } public MagFilter MagFilter { get; }
public bool SeamlessCubemap { get; }
public AddressMode AddressU { get; } public AddressMode AddressU { get; }
public AddressMode AddressV { get; } public AddressMode AddressV { get; }
public AddressMode AddressP { get; } public AddressMode AddressP { get; }
@ -22,6 +24,7 @@ namespace Ryujinx.Graphics.GAL
public SamplerCreateInfo( public SamplerCreateInfo(
MinFilter minFilter, MinFilter minFilter,
MagFilter magFilter, MagFilter magFilter,
bool seamlessCubemap,
AddressMode addressU, AddressMode addressU,
AddressMode addressV, AddressMode addressV,
AddressMode addressP, AddressMode addressP,
@ -33,18 +36,19 @@ namespace Ryujinx.Graphics.GAL
float mipLodBias, float mipLodBias,
float maxAnisotropy) float maxAnisotropy)
{ {
MinFilter = minFilter; MinFilter = minFilter;
MagFilter = magFilter; MagFilter = magFilter;
AddressU = addressU; SeamlessCubemap = seamlessCubemap;
AddressV = addressV; AddressU = addressU;
AddressP = addressP; AddressV = addressV;
CompareMode = compareMode; AddressP = addressP;
CompareOp = compareOp; CompareMode = compareMode;
BorderColor = borderColor; CompareOp = compareOp;
MinLod = minLod; BorderColor = borderColor;
MaxLod = maxLod; MinLod = minLod;
MipLodBias = mipLodBias; MaxLod = maxLod;
MaxAnisotropy = maxAnisotropy; MipLodBias = mipLodBias;
MaxAnisotropy = maxAnisotropy;
} }
} }
} }

View File

@ -23,6 +23,8 @@ namespace Ryujinx.Graphics.Gpu.Image
MinFilter minFilter = descriptor.UnpackMinFilter(); MinFilter minFilter = descriptor.UnpackMinFilter();
MagFilter magFilter = descriptor.UnpackMagFilter(); MagFilter magFilter = descriptor.UnpackMagFilter();
bool seamlessCubemap = descriptor.UnpackSeamlessCubemap();
AddressMode addressU = descriptor.UnpackAddressU(); AddressMode addressU = descriptor.UnpackAddressU();
AddressMode addressV = descriptor.UnpackAddressV(); AddressMode addressV = descriptor.UnpackAddressV();
AddressMode addressP = descriptor.UnpackAddressP(); AddressMode addressP = descriptor.UnpackAddressP();
@ -49,6 +51,7 @@ namespace Ryujinx.Graphics.Gpu.Image
HostSampler = context.Renderer.CreateSampler(new SamplerCreateInfo( HostSampler = context.Renderer.CreateSampler(new SamplerCreateInfo(
minFilter, minFilter,
magFilter, magFilter,
seamlessCubemap,
addressU, addressU,
addressV, addressV,
addressP, addressP,

View File

@ -184,6 +184,15 @@ namespace Ryujinx.Graphics.Gpu.Image
return MinFilter.Nearest; return MinFilter.Nearest;
} }
/// <summary>
/// Unpacks the seamless cubemap flag.
/// </summary>
/// <returns>The seamless cubemap flag</returns>
public bool UnpackSeamlessCubemap()
{
return (Word1 & (1 << 9)) != 0;
}
/// <summary> /// <summary>
/// Unpacks the reduction filter, used with texture minification linear filtering. /// Unpacks the reduction filter, used with texture minification linear filtering.
/// This describes how the final value will be computed from neighbouring pixels. /// This describes how the final value will be computed from neighbouring pixels.

View File

@ -5,10 +5,11 @@ namespace Ryujinx.Graphics.OpenGL
{ {
static class HwCapabilities static class HwCapabilities
{ {
private static readonly Lazy<bool> _supportsAstcCompression = new Lazy<bool>(() => HasExtension("GL_KHR_texture_compression_astc_ldr")); private static readonly Lazy<bool> _supportsAstcCompression = new Lazy<bool>(() => HasExtension("GL_KHR_texture_compression_astc_ldr"));
private static readonly Lazy<bool> _supportsImageLoadFormatted = new Lazy<bool>(() => HasExtension("GL_EXT_shader_image_load_formatted")); private static readonly Lazy<bool> _supportsImageLoadFormatted = new Lazy<bool>(() => HasExtension("GL_EXT_shader_image_load_formatted"));
private static readonly Lazy<bool> _supportsPolygonOffsetClamp = new Lazy<bool>(() => HasExtension("GL_EXT_polygon_offset_clamp")); private static readonly Lazy<bool> _supportsPolygonOffsetClamp = new Lazy<bool>(() => HasExtension("GL_EXT_polygon_offset_clamp"));
private static readonly Lazy<bool> _supportsViewportSwizzle = new Lazy<bool>(() => HasExtension("GL_NV_viewport_swizzle")); private static readonly Lazy<bool> _supportsViewportSwizzle = new Lazy<bool>(() => HasExtension("GL_NV_viewport_swizzle"));
private static readonly Lazy<bool> _supportsSeamlessCubemapPerTexture = new Lazy<bool>(() => HasExtension("GL_ARB_seamless_cubemap_per_texture"));
private static readonly Lazy<int> _maximumComputeSharedMemorySize = new Lazy<int>(() => GetLimit(All.MaxComputeSharedMemorySize)); private static readonly Lazy<int> _maximumComputeSharedMemorySize = new Lazy<int>(() => GetLimit(All.MaxComputeSharedMemorySize));
private static readonly Lazy<int> _storageBufferOffsetAlignment = new Lazy<int>(() => GetLimit(All.ShaderStorageBufferOffsetAlignment)); private static readonly Lazy<int> _storageBufferOffsetAlignment = new Lazy<int>(() => GetLimit(All.ShaderStorageBufferOffsetAlignment));
@ -27,11 +28,12 @@ namespace Ryujinx.Graphics.OpenGL
private static Lazy<float> _maxSupportedAnisotropy = new Lazy<float>(GL.GetFloat((GetPName)All.MaxTextureMaxAnisotropy)); private static Lazy<float> _maxSupportedAnisotropy = new Lazy<float>(GL.GetFloat((GetPName)All.MaxTextureMaxAnisotropy));
public static bool SupportsAstcCompression => _supportsAstcCompression.Value; public static bool SupportsAstcCompression => _supportsAstcCompression.Value;
public static bool SupportsImageLoadFormatted => _supportsImageLoadFormatted.Value; public static bool SupportsImageLoadFormatted => _supportsImageLoadFormatted.Value;
public static bool SupportsPolygonOffsetClamp => _supportsPolygonOffsetClamp.Value; public static bool SupportsPolygonOffsetClamp => _supportsPolygonOffsetClamp.Value;
public static bool SupportsViewportSwizzle => _supportsViewportSwizzle.Value; public static bool SupportsViewportSwizzle => _supportsViewportSwizzle.Value;
public static bool SupportsNonConstantTextureOffset => _gpuVendor.Value == GpuVendor.Nvidia; public static bool SupportsSeamlessCubemapPerTexture => _supportsSeamlessCubemapPerTexture.Value;
public static bool SupportsNonConstantTextureOffset => _gpuVendor.Value == GpuVendor.Nvidia;
public static int MaximumComputeSharedMemorySize => _maximumComputeSharedMemorySize.Value; public static int MaximumComputeSharedMemorySize => _maximumComputeSharedMemorySize.Value;
public static int StorageBufferOffsetAlignment => _storageBufferOffsetAlignment.Value; public static int StorageBufferOffsetAlignment => _storageBufferOffsetAlignment.Value;

View File

@ -14,6 +14,11 @@ namespace Ryujinx.Graphics.OpenGL.Image
GL.SamplerParameter(Handle, SamplerParameterName.TextureMinFilter, (int)info.MinFilter.Convert()); GL.SamplerParameter(Handle, SamplerParameterName.TextureMinFilter, (int)info.MinFilter.Convert());
GL.SamplerParameter(Handle, SamplerParameterName.TextureMagFilter, (int)info.MagFilter.Convert()); GL.SamplerParameter(Handle, SamplerParameterName.TextureMagFilter, (int)info.MagFilter.Convert());
if (HwCapabilities.SupportsSeamlessCubemapPerTexture)
{
GL.SamplerParameter(Handle, (SamplerParameterName)ArbSeamlessCubemapPerTexture.TextureCubeMapSeamless, info.SeamlessCubemap ? 1 : 0);
}
GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapS, (int)info.AddressU.Convert()); GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapS, (int)info.AddressU.Convert());
GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapT, (int)info.AddressV.Convert()); GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapT, (int)info.AddressV.Convert());
GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapR, (int)info.AddressP.Convert()); GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapR, (int)info.AddressP.Convert());