diff options
Diffstat (limited to 'Ryujinx.Graphics/GpuResourceManager.cs')
| -rw-r--r-- | Ryujinx.Graphics/GpuResourceManager.cs | 86 |
1 files changed, 52 insertions, 34 deletions
diff --git a/Ryujinx.Graphics/GpuResourceManager.cs b/Ryujinx.Graphics/GpuResourceManager.cs index ba35910d..0a8d2014 100644 --- a/Ryujinx.Graphics/GpuResourceManager.cs +++ b/Ryujinx.Graphics/GpuResourceManager.cs @@ -7,10 +7,20 @@ namespace Ryujinx.Graphics { public class GpuResourceManager { + private enum ImageType + { + None, + Texture, + ColorBuffer, + ZetaBuffer + } + private NvGpu Gpu; private HashSet<long>[] UploadedKeys; + private Dictionary<long, ImageType> ImageTypes; + public GpuResourceManager(NvGpu Gpu) { this.Gpu = Gpu; @@ -21,26 +31,21 @@ namespace Ryujinx.Graphics { UploadedKeys[Index] = new HashSet<long>(); } + + ImageTypes = new Dictionary<long, ImageType>(); } public void SendColorBuffer(NvGpuVmm Vmm, long Position, int Attachment, GalImage NewImage) { long Size = (uint)ImageUtils.GetSize(NewImage); - MarkAsCached(Vmm, Position, Size, NvGpuBufferType.Texture); + ImageTypes[Position] = ImageType.ColorBuffer; - bool IsCached = Gpu.Renderer.Texture.TryGetImage(Position, out GalImage CachedImage); - - if (IsCached && CachedImage.SizeMatches(NewImage)) + if (!TryReuse(Vmm, Position, NewImage)) { - Gpu.Renderer.RenderTarget.Reinterpret(Position, NewImage); - Gpu.Renderer.RenderTarget.BindColor(Position, Attachment, NewImage); - - return; + Gpu.Renderer.Texture.Create(Position, (int)Size, NewImage); } - Gpu.Renderer.Texture.Create(Position, (int)Size, NewImage); - Gpu.Renderer.RenderTarget.BindColor(Position, Attachment, NewImage); } @@ -48,38 +53,49 @@ namespace Ryujinx.Graphics { long Size = (uint)ImageUtils.GetSize(NewImage); - MarkAsCached(Vmm, Position, Size, NvGpuBufferType.Texture); + ImageTypes[Position] = ImageType.ZetaBuffer; - bool IsCached = Gpu.Renderer.Texture.TryGetImage(Position, out GalImage CachedImage); - - if (IsCached && CachedImage.SizeMatches(NewImage)) + if (!TryReuse(Vmm, Position, NewImage)) { - Gpu.Renderer.RenderTarget.Reinterpret(Position, NewImage); - Gpu.Renderer.RenderTarget.BindZeta(Position, NewImage); - - return; + Gpu.Renderer.Texture.Create(Position, (int)Size, NewImage); } - Gpu.Renderer.Texture.Create(Position, (int)Size, NewImage); - Gpu.Renderer.RenderTarget.BindZeta(Position, NewImage); } public void SendTexture(NvGpuVmm Vmm, long Position, GalImage NewImage, int TexIndex = -1) { - long Size = (uint)ImageUtils.GetSize(NewImage); + PrepareSendTexture(Vmm, Position, NewImage); + + if (TexIndex >= 0) + { + Gpu.Renderer.Texture.Bind(Position, TexIndex, NewImage); + } + + ImageTypes[Position] = ImageType.Texture; + } + + private void PrepareSendTexture(NvGpuVmm Vmm, long Position, GalImage NewImage) + { + long Size = ImageUtils.GetSize(NewImage); - if (!MemoryRegionModified(Vmm, Position, Size, NvGpuBufferType.Texture)) + bool SkipCheck = false; + + if (ImageTypes.TryGetValue(Position, out ImageType OldType)) { - if (Gpu.Renderer.Texture.TryGetImage(Position, out GalImage CachedImage) && CachedImage.SizeMatches(NewImage)) + if (OldType == ImageType.ColorBuffer || OldType == ImageType.ZetaBuffer) { - Gpu.Renderer.RenderTarget.Reinterpret(Position, NewImage); + //Avoid data destruction + MemoryRegionModified(Vmm, Position, Size, NvGpuBufferType.Texture); - if (TexIndex >= 0) - { - Gpu.Renderer.Texture.Bind(Position, TexIndex, NewImage); - } + SkipCheck = true; + } + } + if (SkipCheck || !MemoryRegionModified(Vmm, Position, Size, NvGpuBufferType.Texture)) + { + if (TryReuse(Vmm, Position, NewImage)) + { return; } } @@ -87,16 +103,18 @@ namespace Ryujinx.Graphics byte[] Data = ImageUtils.ReadTexture(Vmm, NewImage, Position); Gpu.Renderer.Texture.Create(Position, Data, NewImage); + } - if (TexIndex >= 0) + private bool TryReuse(NvGpuVmm Vmm, long Position, GalImage NewImage) + { + if (Gpu.Renderer.Texture.TryGetImage(Position, out GalImage CachedImage) && CachedImage.SizeMatches(NewImage)) { - Gpu.Renderer.Texture.Bind(Position, TexIndex, NewImage); + Gpu.Renderer.RenderTarget.Reinterpret(Position, NewImage); + + return true; } - } - private void MarkAsCached(NvGpuVmm Vmm, long Position, long Size, NvGpuBufferType Type) - { - Vmm.IsRegionModified(Position, Size, Type); + return false; } private bool MemoryRegionModified(NvGpuVmm Vmm, long Position, long Size, NvGpuBufferType Type) |
