ImageHandler.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using OpenTK.Graphics.OpenGL;
  2. using Ryujinx.Graphics.Texture;
  3. using System;
  4. namespace Ryujinx.Graphics.Gal.OpenGL
  5. {
  6. class ImageHandler
  7. {
  8. private static int CopyBuffer = 0;
  9. private static int CopyBufferSize = 0;
  10. public GalImage Image { get; private set; }
  11. public int Width => Image.Width;
  12. public int Height => Image.Height;
  13. public GalImageFormat Format => Image.Format;
  14. public PixelInternalFormat InternalFormat { get; private set; }
  15. public PixelFormat PixelFormat { get; private set; }
  16. public PixelType PixelType { get; private set; }
  17. public int Handle { get; private set; }
  18. private bool Initialized;
  19. public ImageHandler()
  20. {
  21. Handle = GL.GenTexture();
  22. }
  23. public ImageHandler(int Handle, GalImage Image)
  24. {
  25. this.Handle = Handle;
  26. this.Image = Image;
  27. }
  28. public void EnsureSetup(GalImage NewImage)
  29. {
  30. if (Width == NewImage.Width &&
  31. Height == NewImage.Height &&
  32. Format == NewImage.Format &&
  33. Initialized)
  34. {
  35. return;
  36. }
  37. PixelInternalFormat InternalFmt;
  38. PixelFormat PixelFormat;
  39. PixelType PixelType;
  40. if (ImageUtils.IsCompressed(NewImage.Format))
  41. {
  42. InternalFmt = (PixelInternalFormat)OGLEnumConverter.GetCompressedImageFormat(NewImage.Format);
  43. PixelFormat = default(PixelFormat);
  44. PixelType = default(PixelType);
  45. }
  46. else
  47. {
  48. (InternalFmt, PixelFormat, PixelType) = OGLEnumConverter.GetImageFormat(NewImage.Format);
  49. }
  50. GL.BindTexture(TextureTarget.Texture2D, Handle);
  51. if (Initialized)
  52. {
  53. if (CopyBuffer == 0)
  54. {
  55. CopyBuffer = GL.GenBuffer();
  56. }
  57. int CurrentSize = Math.Max(ImageUtils.GetSize(NewImage),
  58. ImageUtils.GetSize(Image));
  59. GL.BindBuffer(BufferTarget.PixelPackBuffer, CopyBuffer);
  60. GL.BindBuffer(BufferTarget.PixelUnpackBuffer, CopyBuffer);
  61. if (CopyBufferSize < CurrentSize)
  62. {
  63. CopyBufferSize = CurrentSize;
  64. GL.BufferData(BufferTarget.PixelPackBuffer, CurrentSize, IntPtr.Zero, BufferUsageHint.StreamCopy);
  65. }
  66. if (ImageUtils.IsCompressed(Image.Format))
  67. {
  68. GL.GetCompressedTexImage(TextureTarget.Texture2D, 0, IntPtr.Zero);
  69. }
  70. else
  71. {
  72. GL.GetTexImage(TextureTarget.Texture2D, 0, this.PixelFormat, this.PixelType, IntPtr.Zero);
  73. }
  74. GL.DeleteTexture(Handle);
  75. Handle = GL.GenTexture();
  76. GL.BindTexture(TextureTarget.Texture2D, Handle);
  77. }
  78. const int MinFilter = (int)TextureMinFilter.Linear;
  79. const int MagFilter = (int)TextureMagFilter.Linear;
  80. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, MinFilter);
  81. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, MagFilter);
  82. const int Level = 0;
  83. const int Border = 0;
  84. if (ImageUtils.IsCompressed(NewImage.Format))
  85. {
  86. Console.WriteLine("Hit");
  87. GL.CompressedTexImage2D(
  88. TextureTarget.Texture2D,
  89. Level,
  90. (InternalFormat)InternalFmt,
  91. NewImage.Width,
  92. NewImage.Height,
  93. Border,
  94. ImageUtils.GetSize(NewImage),
  95. IntPtr.Zero);
  96. }
  97. else
  98. {
  99. GL.TexImage2D(
  100. TextureTarget.Texture2D,
  101. Level,
  102. InternalFmt,
  103. NewImage.Width,
  104. NewImage.Height,
  105. Border,
  106. PixelFormat,
  107. PixelType,
  108. IntPtr.Zero);
  109. }
  110. if (Initialized)
  111. {
  112. GL.BindBuffer(BufferTarget.PixelPackBuffer, 0);
  113. GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0);
  114. }
  115. Image = NewImage;
  116. this.InternalFormat = InternalFmt;
  117. this.PixelFormat = PixelFormat;
  118. this.PixelType = PixelType;
  119. Initialized = true;
  120. }
  121. public bool HasColor => ImageUtils.HasColor(Image.Format);
  122. public bool HasDepth => ImageUtils.HasDepth(Image.Format);
  123. public bool HasStencil => ImageUtils.HasStencil(Image.Format);
  124. }
  125. }