TextureStorage.cs 5.2 KB

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