OGLTexture.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. int SwizzleR = (int)OGLEnumConverter.GetTextureSwizzle(Texture.XSource);
  46. int SwizzleG = (int)OGLEnumConverter.GetTextureSwizzle(Texture.YSource);
  47. int SwizzleB = (int)OGLEnumConverter.GetTextureSwizzle(Texture.ZSource);
  48. int SwizzleA = (int)OGLEnumConverter.GetTextureSwizzle(Texture.WSource);
  49. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleR, SwizzleR);
  50. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleG, SwizzleG);
  51. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleB, SwizzleB);
  52. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureSwizzleA, SwizzleA);
  53. }
  54. public void Bind(int Index)
  55. {
  56. int Handle = EnsureTextureInitialized(Index);
  57. GL.BindTexture(TextureTarget.Texture2D, Handle);
  58. }
  59. public static void Set(GalTextureSampler Sampler)
  60. {
  61. int WrapS = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressU);
  62. int WrapT = (int)OGLEnumConverter.GetTextureWrapMode(Sampler.AddressV);
  63. int MinFilter = (int)OGLEnumConverter.GetTextureMinFilter(Sampler.MinFilter, Sampler.MipFilter);
  64. int MagFilter = (int)OGLEnumConverter.GetTextureMagFilter(Sampler.MagFilter);
  65. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, WrapS);
  66. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, WrapT);
  67. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, MinFilter);
  68. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, MagFilter);
  69. float[] Color = new float[]
  70. {
  71. Sampler.BorderColor.Red,
  72. Sampler.BorderColor.Green,
  73. Sampler.BorderColor.Blue,
  74. Sampler.BorderColor.Alpha
  75. };
  76. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, Color);
  77. }
  78. private static bool IsCompressedTextureFormat(GalTextureFormat Format)
  79. {
  80. switch (Format)
  81. {
  82. case GalTextureFormat.BC1:
  83. case GalTextureFormat.BC2:
  84. case GalTextureFormat.BC3:
  85. case GalTextureFormat.BC4:
  86. case GalTextureFormat.BC5:
  87. return true;
  88. }
  89. return false;
  90. }
  91. private int EnsureTextureInitialized(int TexIndex)
  92. {
  93. int Handle = Textures[TexIndex];
  94. if (Handle == 0)
  95. {
  96. Handle = Textures[TexIndex] = GL.GenTexture();
  97. }
  98. return Handle;
  99. }
  100. }
  101. }