Sampler.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using OpenTK.Graphics.OpenGL;
  2. using Ryujinx.Graphics.GAL;
  3. namespace Ryujinx.Graphics.OpenGL.Image
  4. {
  5. class Sampler : ISampler
  6. {
  7. public int Handle { get; private set; }
  8. public Sampler(SamplerCreateInfo info)
  9. {
  10. Handle = GL.GenSampler();
  11. GL.SamplerParameter(Handle, SamplerParameterName.TextureMinFilter, (int)info.MinFilter.Convert());
  12. GL.SamplerParameter(Handle, SamplerParameterName.TextureMagFilter, (int)info.MagFilter.Convert());
  13. if (HwCapabilities.SupportsSeamlessCubemapPerTexture)
  14. {
  15. GL.SamplerParameter(Handle, (SamplerParameterName)ArbSeamlessCubemapPerTexture.TextureCubeMapSeamless, info.SeamlessCubemap ? 1 : 0);
  16. }
  17. GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapS, (int)info.AddressU.Convert());
  18. GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapT, (int)info.AddressV.Convert());
  19. GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapR, (int)info.AddressP.Convert());
  20. GL.SamplerParameter(Handle, SamplerParameterName.TextureCompareMode, (int)info.CompareMode.Convert());
  21. GL.SamplerParameter(Handle, SamplerParameterName.TextureCompareFunc, (int)info.CompareOp.Convert());
  22. unsafe
  23. {
  24. float* borderColor = stackalloc float[4]
  25. {
  26. info.BorderColor.Red,
  27. info.BorderColor.Green,
  28. info.BorderColor.Blue,
  29. info.BorderColor.Alpha
  30. };
  31. GL.SamplerParameter(Handle, SamplerParameterName.TextureBorderColor, borderColor);
  32. }
  33. GL.SamplerParameter(Handle, SamplerParameterName.TextureMinLod, info.MinLod);
  34. GL.SamplerParameter(Handle, SamplerParameterName.TextureMaxLod, info.MaxLod);
  35. GL.SamplerParameter(Handle, SamplerParameterName.TextureLodBias, info.MipLodBias);
  36. GL.SamplerParameter(Handle, SamplerParameterName.TextureMaxAnisotropyExt, info.MaxAnisotropy);
  37. }
  38. public void Bind(int unit)
  39. {
  40. GL.BindSampler(unit, Handle);
  41. }
  42. public void Dispose()
  43. {
  44. if (Handle != 0)
  45. {
  46. GL.DeleteSampler(Handle);
  47. Handle = 0;
  48. }
  49. }
  50. }
  51. }