aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/GpuResourceManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics/GpuResourceManager.cs')
-rw-r--r--Ryujinx.Graphics/GpuResourceManager.cs169
1 files changed, 0 insertions, 169 deletions
diff --git a/Ryujinx.Graphics/GpuResourceManager.cs b/Ryujinx.Graphics/GpuResourceManager.cs
deleted file mode 100644
index 16e9f579..00000000
--- a/Ryujinx.Graphics/GpuResourceManager.cs
+++ /dev/null
@@ -1,169 +0,0 @@
-using Ryujinx.Graphics.Gal;
-using Ryujinx.Graphics.Memory;
-using Ryujinx.Graphics.Texture;
-using System.Collections.Generic;
-
-namespace Ryujinx.Graphics
-{
- public class GpuResourceManager
- {
- private enum ImageType
- {
- None,
- Texture,
- TextureArrayLayer,
- ColorBuffer,
- ZetaBuffer
- }
-
- private NvGpu _gpu;
-
- private HashSet<long>[] _uploadedKeys;
-
- private Dictionary<long, ImageType> _imageTypes;
- private Dictionary<long, int> _mirroredTextures;
-
- public GpuResourceManager(NvGpu gpu)
- {
- _gpu = gpu;
-
- _uploadedKeys = new HashSet<long>[(int)NvGpuBufferType.Count];
-
- for (int index = 0; index < _uploadedKeys.Length; index++)
- {
- _uploadedKeys[index] = new HashSet<long>();
- }
-
- _imageTypes = new Dictionary<long, ImageType>();
- _mirroredTextures = new Dictionary<long, int>();
- }
-
- public void SendColorBuffer(NvGpuVmm vmm, long position, int attachment, GalImage newImage)
- {
- long size = (uint)ImageUtils.GetSize(newImage);
-
- _imageTypes[position] = ImageType.ColorBuffer;
-
- if (!TryReuse(vmm, position, newImage))
- {
- _gpu.Renderer.Texture.Create(position, (int)size, newImage);
- }
-
- _gpu.Renderer.RenderTarget.BindColor(position, attachment);
- }
-
- public void SendZetaBuffer(NvGpuVmm vmm, long position, GalImage newImage)
- {
- long size = (uint)ImageUtils.GetSize(newImage);
-
- _imageTypes[position] = ImageType.ZetaBuffer;
-
- if (!TryReuse(vmm, position, newImage))
- {
- _gpu.Renderer.Texture.Create(position, (int)size, newImage);
- }
-
- _gpu.Renderer.RenderTarget.BindZeta(position);
- }
-
- public void SendTexture(NvGpuVmm vmm, long position, GalImage newImage)
- {
- PrepareSendTexture(vmm, position, newImage);
-
- _imageTypes[position] = ImageType.Texture;
- }
-
- public bool TryGetTextureLayer(long position, out int layerIndex)
- {
- if (_mirroredTextures.TryGetValue(position, out layerIndex))
- {
- ImageType type = _imageTypes[position];
-
- // FIXME(thog): I'm actually unsure if we should deny all other image type, gpu testing needs to be done here.
- if (type != ImageType.Texture && type != ImageType.TextureArrayLayer)
- {
- layerIndex = -1;
- return false;
- }
-
- return true;
- }
-
- layerIndex = -1;
- return false;
- }
-
- public void SetTextureArrayLayer(long position, int layerIndex)
- {
- _imageTypes[position] = ImageType.TextureArrayLayer;
- _mirroredTextures[position] = layerIndex;
- }
-
- private void PrepareSendTexture(NvGpuVmm vmm, long position, GalImage newImage)
- {
- long size = ImageUtils.GetSize(newImage);
-
- bool skipCheck = false;
-
- if (_imageTypes.TryGetValue(position, out ImageType oldType))
- {
- if (oldType == ImageType.ColorBuffer || oldType == ImageType.ZetaBuffer)
- {
- // Avoid data destruction
- MemoryRegionModified(vmm, position, size, NvGpuBufferType.Texture);
-
- skipCheck = true;
- }
- }
-
- if (skipCheck || !MemoryRegionModified(vmm, position, size, NvGpuBufferType.Texture))
- {
- if (TryReuse(vmm, position, newImage))
- {
- return;
- }
- }
-
- byte[] data = ImageUtils.ReadTexture(vmm, newImage, position);
-
- _gpu.Renderer.Texture.Create(position, data, newImage);
- }
-
- private bool TryReuse(NvGpuVmm vmm, long position, GalImage newImage)
- {
- if (_gpu.Renderer.Texture.TryGetImage(position, out GalImage cachedImage) && cachedImage.TextureTarget == newImage.TextureTarget && cachedImage.SizeMatches(newImage))
- {
- _gpu.Renderer.RenderTarget.Reinterpret(position, newImage);
-
- return true;
- }
-
- return false;
- }
-
- public bool MemoryRegionModified(NvGpuVmm vmm, long position, long size, NvGpuBufferType type)
- {
- HashSet<long> uploaded = _uploadedKeys[(int)type];
-
- if (!uploaded.Add(position))
- {
- return false;
- }
-
- return vmm.IsRegionModified(position, size, type);
- }
-
- public void ClearPbCache()
- {
- for (int index = 0; index < _uploadedKeys.Length; index++)
- {
- _uploadedKeys[index].Clear();
- }
- }
-
- public void ClearPbCache(NvGpuBufferType type)
- {
- _uploadedKeys[(int)type].Clear();
- }
- }
-}