IntermmediatePool.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using Ryujinx.Graphics.GAL;
  2. using System;
  3. using System.Collections.Generic;
  4. namespace Ryujinx.Graphics.OpenGL.Image
  5. {
  6. class IntermmediatePool : IDisposable
  7. {
  8. private readonly Renderer _renderer;
  9. private readonly List<TextureView> _entries;
  10. public IntermmediatePool(Renderer renderer)
  11. {
  12. _renderer = renderer;
  13. _entries = new List<TextureView>();
  14. }
  15. public TextureView GetOrCreateWithAtLeast(
  16. Target target,
  17. int blockWidth,
  18. int blockHeight,
  19. int bytesPerPixel,
  20. Format format,
  21. int width,
  22. int height,
  23. int depth,
  24. int levels)
  25. {
  26. TextureView entry;
  27. for (int i = 0; i < _entries.Count; i++)
  28. {
  29. entry = _entries[i];
  30. if (entry.Target == target && entry.Format == format)
  31. {
  32. if (entry.Width < width || entry.Height < height || entry.Info.Depth < depth || entry.Info.Levels < levels)
  33. {
  34. width = Math.Max(width, entry.Width);
  35. height = Math.Max(height, entry.Height);
  36. depth = Math.Max(depth, entry.Info.Depth);
  37. levels = Math.Max(levels, entry.Info.Levels);
  38. entry.Dispose();
  39. entry = CreateNew(target, blockWidth, blockHeight, bytesPerPixel, format, width, height, depth, levels);
  40. _entries[i] = entry;
  41. }
  42. return entry;
  43. }
  44. }
  45. entry = CreateNew(target, blockWidth, blockHeight, bytesPerPixel, format, width, height, depth, levels);
  46. _entries.Add(entry);
  47. return entry;
  48. }
  49. private TextureView CreateNew(
  50. Target target,
  51. int blockWidth,
  52. int blockHeight,
  53. int bytesPerPixel,
  54. Format format,
  55. int width,
  56. int height,
  57. int depth,
  58. int levels)
  59. {
  60. return (TextureView)_renderer.CreateTexture(new TextureCreateInfo(
  61. width,
  62. height,
  63. depth,
  64. levels,
  65. 1,
  66. blockWidth,
  67. blockHeight,
  68. bytesPerPixel,
  69. format,
  70. DepthStencilMode.Depth,
  71. target,
  72. SwizzleComponent.Red,
  73. SwizzleComponent.Green,
  74. SwizzleComponent.Blue,
  75. SwizzleComponent.Alpha), 1f);
  76. }
  77. public void Dispose()
  78. {
  79. foreach (TextureView entry in _entries)
  80. {
  81. entry.Dispose();
  82. }
  83. _entries.Clear();
  84. }
  85. }
  86. }