OGLTexture.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using OpenTK.Graphics.OpenGL;
  2. namespace Ryujinx.Graphics.Gal.OpenGL
  3. {
  4. class OGLTexture
  5. {
  6. private int[] Textures;
  7. public OGLTexture()
  8. {
  9. Textures = new int[80];
  10. }
  11. public void Set(int Index, GalTexture Tex)
  12. {
  13. GL.ActiveTexture(TextureUnit.Texture0 + Index);
  14. int Handle = EnsureTextureInitialized(Index);
  15. GL.BindTexture(TextureTarget.Texture2D, Handle);
  16. int W = Tex.Width;
  17. int H = Tex.Height;
  18. byte[] Data = Tex.Data;
  19. int Length = Data.Length;
  20. if (IsCompressedTextureFormat(Tex.Format))
  21. {
  22. PixelInternalFormat Pif = OGLEnumConverter.GetCompressedTextureFormat(Tex.Format);
  23. GL.CompressedTexImage2D(TextureTarget.Texture2D, 0, Pif, W, H, 0, Length, Data);
  24. }
  25. else
  26. {
  27. //TODO: Get those from Texture format.
  28. const PixelInternalFormat Pif = PixelInternalFormat.Rgba;
  29. const PixelFormat Pf = PixelFormat.Rgba;
  30. const PixelType Pt = PixelType.UnsignedByte;
  31. GL.TexImage2D(TextureTarget.Texture2D, 0, Pif, W, H, 0, Pf, Pt, Data);
  32. }
  33. }
  34. public void Set(int Index, GalTextureSampler Sampler)
  35. {
  36. int Handle = EnsureTextureInitialized(Index);
  37. GL.BindTexture(TextureTarget.Texture2D, Handle);
  38. int WrapS = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressU);
  39. int WrapT = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressV);
  40. int MinFilter = (int)OGLEnumConverter.GetTextureMinFilter(Sampler.MinFilter, Sampler.MipFilter);
  41. int MagFilter = (int)OGLEnumConverter.GetTextureMagFilter(Sampler.MagFilter);
  42. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, WrapS);
  43. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, WrapT);
  44. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, MinFilter);
  45. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, MagFilter);
  46. float[] Color = new float[]
  47. {
  48. Sampler.BorderColor.Red,
  49. Sampler.BorderColor.Green,
  50. Sampler.BorderColor.Blue,
  51. Sampler.BorderColor.Alpha
  52. };
  53. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, Color);
  54. }
  55. private static bool IsCompressedTextureFormat(GalTextureFormat Format)
  56. {
  57. return Format == GalTextureFormat.BC1 ||
  58. Format == GalTextureFormat.BC2 ||
  59. Format == GalTextureFormat.BC3;
  60. }
  61. private int EnsureTextureInitialized(int TexIndex)
  62. {
  63. int Handle = Textures[TexIndex];
  64. if (Handle == 0)
  65. {
  66. Handle = Textures[TexIndex] = GL.GenTexture();
  67. }
  68. return Handle;
  69. }
  70. }
  71. }