| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- using Ryujinx.Graphics.GAL;
- using System;
- namespace Ryujinx.Graphics.Gpu.Image
- {
- /// <summary>
- /// Cached sampler entry for sampler pools.
- /// </summary>
- class Sampler : IDisposable
- {
- /// <summary>
- /// True if the sampler is disposed, false otherwise.
- /// </summary>
- public bool IsDisposed { get; private set; }
- /// <summary>
- /// Host sampler object.
- /// </summary>
- private readonly ISampler _hostSampler;
- /// <summary>
- /// Host sampler object, with anisotropy forced.
- /// </summary>
- private readonly ISampler _anisoSampler;
- /// <summary>
- /// Creates a new instance of the cached sampler.
- /// </summary>
- /// <param name="context">The GPU context the sampler belongs to</param>
- /// <param name="descriptor">The Maxwell sampler descriptor</param>
- public Sampler(GpuContext context, SamplerDescriptor descriptor)
- {
- MinFilter minFilter = descriptor.UnpackMinFilter();
- MagFilter magFilter = descriptor.UnpackMagFilter();
- bool seamlessCubemap = descriptor.UnpackSeamlessCubemap();
- AddressMode addressU = descriptor.UnpackAddressU();
- AddressMode addressV = descriptor.UnpackAddressV();
- AddressMode addressP = descriptor.UnpackAddressP();
- CompareMode compareMode = descriptor.UnpackCompareMode();
- CompareOp compareOp = descriptor.UnpackCompareOp();
- ColorF color = new ColorF(
- descriptor.BorderColorR,
- descriptor.BorderColorG,
- descriptor.BorderColorB,
- descriptor.BorderColorA);
- float minLod = descriptor.UnpackMinLod();
- float maxLod = descriptor.UnpackMaxLod();
- float mipLodBias = descriptor.UnpackMipLodBias();
- float maxRequestedAnisotropy = descriptor.UnpackMaxAnisotropy();
- float maxSupportedAnisotropy = context.Capabilities.MaximumSupportedAnisotropy;
- _hostSampler = context.Renderer.CreateSampler(new SamplerCreateInfo(
- minFilter,
- magFilter,
- seamlessCubemap,
- addressU,
- addressV,
- addressP,
- compareMode,
- compareOp,
- color,
- minLod,
- maxLod,
- mipLodBias,
- Math.Min(maxRequestedAnisotropy, maxSupportedAnisotropy)));
- if (GraphicsConfig.MaxAnisotropy >= 0 && GraphicsConfig.MaxAnisotropy <= 16 && (minFilter == MinFilter.LinearMipmapNearest || minFilter == MinFilter.LinearMipmapLinear))
- {
- maxRequestedAnisotropy = GraphicsConfig.MaxAnisotropy;
- _anisoSampler = context.Renderer.CreateSampler(new SamplerCreateInfo(
- minFilter,
- magFilter,
- seamlessCubemap,
- addressU,
- addressV,
- addressP,
- compareMode,
- compareOp,
- color,
- minLod,
- maxLod,
- mipLodBias,
- Math.Min(maxRequestedAnisotropy, maxSupportedAnisotropy)));
- }
- }
- /// <summary>
- /// Gets a host sampler for the given texture.
- /// </summary>
- /// <param name="texture">Texture to be sampled</param>
- /// <returns>A host sampler</returns>
- public ISampler GetHostSampler(Texture texture)
- {
- return _anisoSampler != null && texture?.CanForceAnisotropy == true ? _anisoSampler : _hostSampler;
- }
- /// <summary>
- /// Disposes the host sampler object.
- /// </summary>
- public void Dispose()
- {
- IsDisposed = true;
- _hostSampler.Dispose();
- _anisoSampler?.Dispose();
- }
- }
- }
|