| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- using Ryujinx.Graphics.GAL;
- using System;
- using System.Collections.Generic;
- namespace Ryujinx.Graphics.OpenGL.Image
- {
- class IntermediatePool : IDisposable
- {
- private readonly OpenGLRenderer _renderer;
- private readonly List<TextureView> _entries;
- public IntermediatePool(OpenGLRenderer renderer)
- {
- _renderer = renderer;
- _entries = [];
- }
- public TextureView GetOrCreateWithAtLeast(
- Target target,
- int blockWidth,
- int blockHeight,
- int bytesPerPixel,
- Format format,
- int width,
- int height,
- int depth,
- int levels,
- int samples)
- {
- TextureView entry;
- for (int i = 0; i < _entries.Count; i++)
- {
- entry = _entries[i];
- if (entry.Target == target && entry.Format == format && entry.Info.Samples == samples)
- {
- if (entry.Width < width ||
- entry.Height < height ||
- entry.Info.Depth < depth ||
- entry.Info.Levels < levels)
- {
- width = Math.Max(width, entry.Width);
- height = Math.Max(height, entry.Height);
- depth = Math.Max(depth, entry.Info.Depth);
- levels = Math.Max(levels, entry.Info.Levels);
- entry.Dispose();
- entry = CreateNew(target, blockWidth, blockHeight, bytesPerPixel, format, width, height, depth, levels, samples);
- _entries[i] = entry;
- }
- return entry;
- }
- }
- entry = CreateNew(target, blockWidth, blockHeight, bytesPerPixel, format, width, height, depth, levels, samples);
- _entries.Add(entry);
- return entry;
- }
- private TextureView CreateNew(
- Target target,
- int blockWidth,
- int blockHeight,
- int bytesPerPixel,
- Format format,
- int width,
- int height,
- int depth,
- int levels,
- int samples)
- {
- return (TextureView)_renderer.CreateTexture(new TextureCreateInfo(
- width,
- height,
- depth,
- levels,
- samples,
- blockWidth,
- blockHeight,
- bytesPerPixel,
- format,
- DepthStencilMode.Depth,
- target,
- SwizzleComponent.Red,
- SwizzleComponent.Green,
- SwizzleComponent.Blue,
- SwizzleComponent.Alpha));
- }
- public void Dispose()
- {
- foreach (TextureView entry in _entries)
- {
- entry.Dispose();
- }
- _entries.Clear();
- }
- }
- }
|