| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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 Tex)
- {
- GL.ActiveTexture(TextureUnit.Texture0 + Index);
- int Handle = EnsureTextureInitialized(Index);
- GL.BindTexture(TextureTarget.Texture2D, Handle);
- int W = Tex.Width;
- int H = Tex.Height;
- byte[] Data = Tex.Data;
- int Length = Data.Length;
- if (IsCompressedTextureFormat(Tex.Format))
- {
- PixelInternalFormat Pif = OGLEnumConverter.GetCompressedTextureFormat(Tex.Format);
- GL.CompressedTexImage2D(TextureTarget.Texture2D, 0, Pif, W, H, 0, Length, Data);
- }
- else
- {
- //TODO: Get those from Texture format.
- const PixelInternalFormat Pif = PixelInternalFormat.Rgba;
- const PixelFormat Pf = PixelFormat.Rgba;
- const PixelType Pt = PixelType.UnsignedByte;
- GL.TexImage2D(TextureTarget.Texture2D, 0, Pif, W, H, 0, Pf, Pt, 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;
- }
- }
- }
|