| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- using OpenTK.Graphics.OpenGL;
- namespace Ryujinx.Graphics.Gal.OpenGL
- {
- class OGLTexture
- {
- private int[] Textures;
- public OGLTexture()
- {
- Textures = new int[80];
- }
- public void Set(int Index, GalTexture Texture)
- {
- GL.ActiveTexture(TextureUnit.Texture0 + Index);
- int Handle = EnsureTextureInitialized(Index);
- GL.BindTexture(TextureTarget.Texture2D, Handle);
- const int Border = 0;
- if (IsCompressedTextureFormat(Texture.Format))
- {
- PixelInternalFormat InternalFmt = OGLEnumConverter.GetCompressedTextureFormat(Texture.Format);
- GL.CompressedTexImage2D(
- TextureTarget.Texture2D,
- 0,
- InternalFmt,
- Texture.Width,
- Texture.Height,
- Border,
- Texture.Data.Length,
- Texture.Data);
- }
- else
- {
- const PixelInternalFormat InternalFmt = PixelInternalFormat.Rgba;
- (PixelFormat, PixelType) Format = OGLEnumConverter.GetTextureFormat(Texture.Format);
- GL.TexImage2D(
- TextureTarget.Texture2D,
- 0,
- InternalFmt,
- Texture.Width,
- Texture.Height,
- Border,
- Format.Item1,
- Format.Item2,
- Texture.Data);
- }
- }
- public void Set(int Index, GalTextureSampler Sampler)
- {
- int Handle = EnsureTextureInitialized(Index);
- GL.BindTexture(TextureTarget.Texture2D, Handle);
- int WrapS = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressU);
- int WrapT = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressV);
- int MinFilter = (int)OGLEnumConverter.GetTextureMinFilter(Sampler.MinFilter, Sampler.MipFilter);
- int MagFilter = (int)OGLEnumConverter.GetTextureMagFilter(Sampler.MagFilter);
- GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, WrapS);
- GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, WrapT);
- GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, MinFilter);
- GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, MagFilter);
- float[] Color = new float[]
- {
- Sampler.BorderColor.Red,
- Sampler.BorderColor.Green,
- Sampler.BorderColor.Blue,
- Sampler.BorderColor.Alpha
- };
- GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, Color);
- }
- private static bool IsCompressedTextureFormat(GalTextureFormat Format)
- {
- return Format == GalTextureFormat.BC1 ||
- Format == GalTextureFormat.BC2 ||
- Format == GalTextureFormat.BC3;
- }
- private int EnsureTextureInitialized(int TexIndex)
- {
- int Handle = Textures[TexIndex];
- if (Handle == 0)
- {
- Handle = Textures[TexIndex] = GL.GenTexture();
- }
- return Handle;
- }
- }
- }
|