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 }