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