OGLTexture.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 Texture)
  12. {
  13. GL.ActiveTexture(TextureUnit.Texture0 + Index);
  14. int Handle = EnsureTextureInitialized(Index);
  15. GL.BindTexture(TextureTarget.Texture2D, Handle);
  16. const int Border = 0;
  17. if (IsCompressedTextureFormat(Texture.Format))
  18. {
  19. PixelInternalFormat InternalFmt = OGLEnumConverter.GetCompressedTextureFormat(Texture.Format);
  20. GL.CompressedTexImage2D(
  21. TextureTarget.Texture2D,
  22. 0,
  23. InternalFmt,
  24. Texture.Width,
  25. Texture.Height,
  26. Border,
  27. Texture.Data.Length,
  28. Texture.Data);
  29. }
  30. else
  31. {
  32. const PixelInternalFormat InternalFmt = PixelInternalFormat.Rgba;
  33. (PixelFormat, PixelType) Format = OGLEnumConverter.GetTextureFormat(Texture.Format);
  34. GL.TexImage2D(
  35. TextureTarget.Texture2D,
  36. 0,
  37. InternalFmt,
  38. Texture.Width,
  39. Texture.Height,
  40. Border,
  41. Format.Item1,
  42. Format.Item2,
  43. Texture.Data);
  44. }
  45. }
  46. public void Set(int Index, GalTextureSampler Sampler)
  47. {
  48. int Handle = EnsureTextureInitialized(Index);
  49. GL.BindTexture(TextureTarget.Texture2D, Handle);
  50. int WrapS = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressU);
  51. int WrapT = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressV);
  52. int MinFilter = (int)OGLEnumConverter.GetTextureMinFilter(Sampler.MinFilter, Sampler.MipFilter);
  53. int MagFilter = (int)OGLEnumConverter.GetTextureMagFilter(Sampler.MagFilter);
  54. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, WrapS);
  55. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, WrapT);
  56. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, MinFilter);
  57. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, MagFilter);
  58. float[] Color = new float[]
  59. {
  60. Sampler.BorderColor.Red,
  61. Sampler.BorderColor.Green,
  62. Sampler.BorderColor.Blue,
  63. Sampler.BorderColor.Alpha
  64. };
  65. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, Color);
  66. }
  67. private static bool IsCompressedTextureFormat(GalTextureFormat Format)
  68. {
  69. return Format == GalTextureFormat.BC1 ||
  70. Format == GalTextureFormat.BC2 ||
  71. Format == GalTextureFormat.BC3;
  72. }
  73. private int EnsureTextureInitialized(int TexIndex)
  74. {
  75. int Handle = Textures[TexIndex];
  76. if (Handle == 0)
  77. {
  78. Handle = Textures[TexIndex] = GL.GenTexture();
  79. }
  80. return Handle;
  81. }
  82. }
  83. }