OGLTexture.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. Bind(Index);
  15. const int Level = 0; //TODO: Support mipmap textures.
  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. Level,
  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 Format, PixelType Type) = OGLEnumConverter.GetTextureFormat(Texture.Format);
  34. GL.TexImage2D(
  35. TextureTarget.Texture2D,
  36. Level,
  37. InternalFmt,
  38. Texture.Width,
  39. Texture.Height,
  40. Border,
  41. Format,
  42. Type,
  43. Texture.Data);
  44. }
  45. }
  46. public void Bind(int Index)
  47. {
  48. int Handle = EnsureTextureInitialized(Index);
  49. GL.BindTexture(TextureTarget.Texture2D, Handle);
  50. }
  51. public static void Set(GalTextureSampler Sampler)
  52. {
  53. int WrapS = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressU);
  54. int WrapT = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressV);
  55. int MinFilter = (int)OGLEnumConverter.GetTextureMinFilter(Sampler.MinFilter, Sampler.MipFilter);
  56. int MagFilter = (int)OGLEnumConverter.GetTextureMagFilter(Sampler.MagFilter);
  57. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, WrapS);
  58. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, WrapT);
  59. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, MinFilter);
  60. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, MagFilter);
  61. float[] Color = new float[]
  62. {
  63. Sampler.BorderColor.Red,
  64. Sampler.BorderColor.Green,
  65. Sampler.BorderColor.Blue,
  66. Sampler.BorderColor.Alpha
  67. };
  68. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, Color);
  69. }
  70. private static bool IsCompressedTextureFormat(GalTextureFormat Format)
  71. {
  72. switch (Format)
  73. {
  74. case GalTextureFormat.BC1:
  75. case GalTextureFormat.BC2:
  76. case GalTextureFormat.BC3:
  77. case GalTextureFormat.BC4:
  78. case GalTextureFormat.BC5:
  79. return true;
  80. }
  81. return false;
  82. }
  83. private int EnsureTextureInitialized(int TexIndex)
  84. {
  85. int Handle = Textures[TexIndex];
  86. if (Handle == 0)
  87. {
  88. Handle = Textures[TexIndex] = GL.GenTexture();
  89. }
  90. return Handle;
  91. }
  92. }
  93. }