IntermmediatePool.cs 3.0 KB

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