TextureStorage.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. using OpenTK.Graphics.OpenGL;
  2. using Ryujinx.Common.Logging;
  3. using Ryujinx.Graphics.GAL;
  4. namespace Ryujinx.Graphics.OpenGL
  5. {
  6. class TextureStorage
  7. {
  8. public int Handle { get; private set; }
  9. private readonly Renderer _renderer;
  10. private readonly TextureCreateInfo _info;
  11. public Target Target => _info.Target;
  12. private int _viewsCount;
  13. public TextureStorage(Renderer renderer, TextureCreateInfo info)
  14. {
  15. _renderer = renderer;
  16. _info = info;
  17. Handle = GL.GenTexture();
  18. CreateImmutableStorage();
  19. }
  20. private void CreateImmutableStorage()
  21. {
  22. TextureTarget target = _info.Target.Convert();
  23. GL.ActiveTexture(TextureUnit.Texture0);
  24. GL.BindTexture(target, Handle);
  25. FormatInfo format = FormatTable.GetFormatInfo(_info.Format);
  26. SizedInternalFormat internalFormat;
  27. if (format.IsCompressed)
  28. {
  29. internalFormat = (SizedInternalFormat)format.PixelFormat;
  30. }
  31. else
  32. {
  33. internalFormat = (SizedInternalFormat)format.PixelInternalFormat;
  34. }
  35. switch (_info.Target)
  36. {
  37. case Target.Texture1D:
  38. GL.TexStorage1D(
  39. TextureTarget1d.Texture1D,
  40. _info.Levels,
  41. internalFormat,
  42. _info.Width);
  43. break;
  44. case Target.Texture1DArray:
  45. GL.TexStorage2D(
  46. TextureTarget2d.Texture1DArray,
  47. _info.Levels,
  48. internalFormat,
  49. _info.Width,
  50. _info.Height);
  51. break;
  52. case Target.Texture2D:
  53. GL.TexStorage2D(
  54. TextureTarget2d.Texture2D,
  55. _info.Levels,
  56. internalFormat,
  57. _info.Width,
  58. _info.Height);
  59. break;
  60. case Target.Texture2DArray:
  61. GL.TexStorage3D(
  62. TextureTarget3d.Texture2DArray,
  63. _info.Levels,
  64. internalFormat,
  65. _info.Width,
  66. _info.Height,
  67. _info.Depth);
  68. break;
  69. case Target.Texture2DMultisample:
  70. GL.TexStorage2DMultisample(
  71. TextureTargetMultisample2d.Texture2DMultisample,
  72. _info.Samples,
  73. internalFormat,
  74. _info.Width,
  75. _info.Height,
  76. true);
  77. break;
  78. case Target.Texture2DMultisampleArray:
  79. GL.TexStorage3DMultisample(
  80. TextureTargetMultisample3d.Texture2DMultisampleArray,
  81. _info.Samples,
  82. internalFormat,
  83. _info.Width,
  84. _info.Height,
  85. _info.Depth,
  86. true);
  87. break;
  88. case Target.Texture3D:
  89. GL.TexStorage3D(
  90. TextureTarget3d.Texture3D,
  91. _info.Levels,
  92. internalFormat,
  93. _info.Width,
  94. _info.Height,
  95. _info.Depth);
  96. break;
  97. case Target.Cubemap:
  98. GL.TexStorage2D(
  99. TextureTarget2d.TextureCubeMap,
  100. _info.Levels,
  101. internalFormat,
  102. _info.Width,
  103. _info.Height);
  104. break;
  105. case Target.CubemapArray:
  106. GL.TexStorage3D(
  107. (TextureTarget3d)All.TextureCubeMapArray,
  108. _info.Levels,
  109. internalFormat,
  110. _info.Width,
  111. _info.Height,
  112. _info.Depth);
  113. break;
  114. default:
  115. Logger.PrintDebug(LogClass.Gpu, $"Invalid or unsupported texture target: {target}.");
  116. break;
  117. }
  118. }
  119. public ITexture CreateDefaultView()
  120. {
  121. return CreateView(_info, 0, 0);
  122. }
  123. public ITexture CreateView(TextureCreateInfo info, int firstLayer, int firstLevel)
  124. {
  125. IncrementViewsCount();
  126. return new TextureView(_renderer, this, info, firstLayer, firstLevel);
  127. }
  128. private void IncrementViewsCount()
  129. {
  130. _viewsCount++;
  131. }
  132. public void DecrementViewsCount()
  133. {
  134. // If we don't have any views, then the storage is now useless, delete it.
  135. if (--_viewsCount == 0)
  136. {
  137. Dispose();
  138. }
  139. }
  140. public void Dispose()
  141. {
  142. if (Handle != 0)
  143. {
  144. GL.DeleteTexture(Handle);
  145. Handle = 0;
  146. }
  147. }
  148. }
  149. }