Sampler.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapS, (int)info.AddressU.Convert());
  14. GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapT, (int)info.AddressV.Convert());
  15. GL.SamplerParameter(Handle, SamplerParameterName.TextureWrapR, (int)info.AddressP.Convert());
  16. GL.SamplerParameter(Handle, SamplerParameterName.TextureCompareMode, (int)info.CompareMode.Convert());
  17. GL.SamplerParameter(Handle, SamplerParameterName.TextureCompareFunc, (int)info.CompareOp.Convert());
  18. unsafe
  19. {
  20. float* borderColor = stackalloc float[4]
  21. {
  22. info.BorderColor.Red,
  23. info.BorderColor.Green,
  24. info.BorderColor.Blue,
  25. info.BorderColor.Alpha
  26. };
  27. GL.SamplerParameter(Handle, SamplerParameterName.TextureBorderColor, borderColor);
  28. }
  29. GL.SamplerParameter(Handle, SamplerParameterName.TextureMinLod, info.MinLod);
  30. GL.SamplerParameter(Handle, SamplerParameterName.TextureMaxLod, info.MaxLod);
  31. GL.SamplerParameter(Handle, SamplerParameterName.TextureLodBias, info.MipLodBias);
  32. GL.SamplerParameter(Handle, SamplerParameterName.TextureMaxAnisotropyExt, info.MaxAnisotropy);
  33. }
  34. public void Bind(int unit)
  35. {
  36. GL.BindSampler(unit, Handle);
  37. }
  38. public void Dispose()
  39. {
  40. if (Handle != 0)
  41. {
  42. GL.DeleteSampler(Handle);
  43. Handle = 0;
  44. }
  45. }
  46. }
  47. }