ImageHandler.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using OpenTK.Graphics.OpenGL;
  2. using System;
  3. namespace Ryujinx.Graphics.Gal.OpenGL
  4. {
  5. class ImageHandler
  6. {
  7. //TODO: Use a variable value here
  8. public const int MaxBpp = 16;
  9. private static int CopyBuffer = 0;
  10. private static int CopyBufferSize = 0;
  11. public GalImage Image { get; private set; }
  12. public int Width => Image.Width;
  13. public int Height => Image.Height;
  14. public GalImageFormat Format => Image.Format;
  15. public PixelInternalFormat InternalFormat { get; private set; }
  16. public PixelFormat PixelFormat { get; private set; }
  17. public PixelType PixelType { get; private set; }
  18. public int Handle { get; private set; }
  19. private bool Initialized;
  20. public ImageHandler()
  21. {
  22. Handle = GL.GenTexture();
  23. }
  24. public ImageHandler(int Handle, GalImage Image)
  25. {
  26. this.Handle = Handle;
  27. this.Image = Image;
  28. }
  29. public void EnsureSetup(GalImage Image)
  30. {
  31. if (Width != Image.Width ||
  32. Height != Image.Height ||
  33. Format != Image.Format ||
  34. !Initialized)
  35. {
  36. (PixelInternalFormat InternalFormat, PixelFormat PixelFormat, PixelType PixelType) =
  37. OGLEnumConverter.GetImageFormat(Image.Format);
  38. GL.BindTexture(TextureTarget.Texture2D, Handle);
  39. if (Initialized)
  40. {
  41. if (CopyBuffer == 0)
  42. {
  43. CopyBuffer = GL.GenBuffer();
  44. }
  45. int MaxWidth = Math.Max(Image.Width, Width);
  46. int MaxHeight = Math.Max(Image.Height, Height);
  47. int CurrentSize = MaxWidth * MaxHeight * MaxBpp;
  48. GL.BindBuffer(BufferTarget.PixelPackBuffer, CopyBuffer);
  49. GL.BindBuffer(BufferTarget.PixelUnpackBuffer, CopyBuffer);
  50. if (CopyBufferSize < CurrentSize)
  51. {
  52. CopyBufferSize = CurrentSize;
  53. GL.BufferData(BufferTarget.PixelPackBuffer, CurrentSize, IntPtr.Zero, BufferUsageHint.StreamCopy);
  54. }
  55. GL.GetTexImage(TextureTarget.Texture2D, 0, this.PixelFormat, this.PixelType, IntPtr.Zero);
  56. GL.DeleteTexture(Handle);
  57. Handle = GL.GenTexture();
  58. GL.BindTexture(TextureTarget.Texture2D, Handle);
  59. }
  60. const int MinFilter = (int)TextureMinFilter.Linear;
  61. const int MagFilter = (int)TextureMagFilter.Linear;
  62. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, MinFilter);
  63. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, MagFilter);
  64. const int Level = 0;
  65. const int Border = 0;
  66. GL.TexImage2D(
  67. TextureTarget.Texture2D,
  68. Level,
  69. InternalFormat,
  70. Image.Width,
  71. Image.Height,
  72. Border,
  73. PixelFormat,
  74. PixelType,
  75. IntPtr.Zero);
  76. if (Initialized)
  77. {
  78. GL.BindBuffer(BufferTarget.PixelPackBuffer, 0);
  79. GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0);
  80. }
  81. this.Image = Image;
  82. this.InternalFormat = InternalFormat;
  83. this.PixelFormat = PixelFormat;
  84. this.PixelType = PixelType;
  85. Initialized = true;
  86. }
  87. }
  88. public bool HasColor { get => ImageFormatConverter.HasColor(Format); }
  89. public bool HasDepth { get => ImageFormatConverter.HasDepth(Format); }
  90. public bool HasStencil { get => ImageFormatConverter.HasStencil(Format); }
  91. }
  92. }