From 9303a7e9aebd21282f9f3e391c596093fd104a02 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Fri, 20 Jul 2018 17:24:28 -0300 Subject: [PATCH] Skip repeated cache tests between same sync --- Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs | 46 ++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs index c3e7a77fcb..d4525cdb8f 100644 --- a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs +++ b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs @@ -25,6 +25,10 @@ namespace Ryujinx.HLE.Gpu.Engines private HashSet FrameBuffers; + private List UploadedIndexes; + private List UploadedVertices; + private List UploadedTextures; + public NvGpuEngine3d(NvGpu Gpu) { this.Gpu = Gpu; @@ -57,6 +61,10 @@ namespace Ryujinx.HLE.Gpu.Engines } FrameBuffers = new HashSet(); + + UploadedIndexes = new List(); + UploadedVertices = new List(); + UploadedTextures = new List(); } public void CallMethod(NvGpuVmm Vmm, NvGpuPBEntry PBEntry) @@ -516,10 +524,12 @@ namespace Ryujinx.HLE.Gpu.Engines if (Gpu.Renderer.Texture.TryGetCachedTexture(Key, Size, out GalTexture Texture)) { - if (NewTexture.Equals(Texture) && !Vmm.IsRegionModified(Key, Size, NvGpuBufferType.Texture)) + if (NewTexture.Equals(Texture) && !QueryKeyUpload(Vmm, Key, Size, NvGpuBufferType.Texture)) { Gpu.Renderer.Texture.Bind(Key, TexIndex); + UploadedIndexes.Add(Key); + HasCachedTexture = true; } } @@ -593,7 +603,7 @@ namespace Ryujinx.HLE.Gpu.Engines bool IboCached = Gpu.Renderer.Rasterizer.IsIboCached(IboKey, (uint)IbSize); - if (!IboCached || Vmm.IsRegionModified(IboKey, (uint)IbSize, NvGpuBufferType.Index)) + if (!IboCached || QueryKeyUpload(Vmm, IboKey, (uint)IbSize, NvGpuBufferType.Index)) { IntPtr DataAddress = Vmm.GetHostAddress(IndexPosition, IbSize); @@ -657,7 +667,7 @@ namespace Ryujinx.HLE.Gpu.Engines bool VboCached = Gpu.Renderer.Rasterizer.IsVboCached(VboKey, VbSize); - if (!VboCached || Vmm.IsRegionModified(VboKey, VbSize, NvGpuBufferType.Vertex)) + if (!VboCached || QueryKeyUpload(Vmm, VboKey, VbSize, NvGpuBufferType.Vertex)) { IntPtr DataAddress = Vmm.GetHostAddress(VertexPosition, VbSize); @@ -692,6 +702,10 @@ namespace Ryujinx.HLE.Gpu.Engines if (Mode == 0) { + UploadedIndexes.Clear(); + UploadedVertices.Clear(); + UploadedTextures.Clear(); + //Write mode. Vmm.WriteInt32(Position, Seq); } @@ -774,5 +788,31 @@ namespace Ryujinx.HLE.Gpu.Engines { return FrameBuffers.Contains(Position); } + + private bool QueryKeyUpload(NvGpuVmm Vmm, long Key, long Size, NvGpuBufferType Type) + { + List UploadedKeys = TypeUploadedList(Type); + + if (UploadedKeys.Contains(Key)) + { + return false; + } + + UploadedKeys.Add(Key); + + return Vmm.IsRegionModified(Key, Size, Type); + } + + private List TypeUploadedList(NvGpuBufferType Type) + { + switch (Type) + { + case NvGpuBufferType.Index: return UploadedIndexes; + case NvGpuBufferType.Vertex: return UploadedVertices; + case NvGpuBufferType.Texture: return UploadedTextures; + + default: throw new ArgumentException(nameof(Type)); + } + } } } \ No newline at end of file