aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-01-17 01:13:24 -0300
committerGitHub <noreply@github.com>2023-01-17 05:13:24 +0100
commit86fd0643c26433362a25acceb4fa1fcee07dd0b2 (patch)
tree8d12fb6b0629c195a0a3c1014f46cfe8f22cd3e6 /Ryujinx.Graphics.Gpu
parent43a83a401ea8101bf6d001fe6fe188e1c106245e (diff)
Implement support for page sizes > 4KB (#4252)
* Implement support for page sizes > 4KB * Check and work around more alignment issues * Was not meant to change this * Use MemoryBlock.GetPageSize() value for signal handler code * Do not take the path for private allocations if host supports 4KB pages * Add Flags attribute on MemoryMapFlags * Fix dirty region size with 16kb pages Would accidentally report a size that was too high (generally 16k instead of 4k, uploading 4x as much data) Co-authored-by: riperiperi <rhy3756547@hotmail.com>
Diffstat (limited to 'Ryujinx.Graphics.Gpu')
-rw-r--r--Ryujinx.Graphics.Gpu/Image/TextureGroup.cs8
-rw-r--r--Ryujinx.Graphics.Gpu/Memory/Buffer.cs15
-rw-r--r--Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs5
3 files changed, 19 insertions, 9 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs b/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs
index c167dc0d..896e11a5 100644
--- a/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs
+++ b/Ryujinx.Graphics.Gpu/Image/TextureGroup.cs
@@ -1420,6 +1420,14 @@ namespace Ryujinx.Graphics.Gpu.Image
/// <param name="size">The size of the flushing memory access</param>
public void FlushAction(TextureGroupHandle handle, ulong address, ulong size)
{
+ // If the page size is larger than 4KB, we will have a lot of false positives for flushing.
+ // Let's avoid flushing textures that are unlikely to be read from CPU to improve performance
+ // on those platforms.
+ if (!_physicalMemory.Supports4KBPages && !Storage.Info.IsLinear && !_context.IsGpuThread())
+ {
+ return;
+ }
+
// There is a small gap here where the action is removed but _actionRegistered is still 1.
// In this case it will skip registering the action, but here we are already handling it,
// so there shouldn't be any issue as it's the same handler for all actions.
diff --git a/Ryujinx.Graphics.Gpu/Memory/Buffer.cs b/Ryujinx.Graphics.Gpu/Memory/Buffer.cs
index 842249f3..a624386e 100644
--- a/Ryujinx.Graphics.Gpu/Memory/Buffer.cs
+++ b/Ryujinx.Graphics.Gpu/Memory/Buffer.cs
@@ -470,19 +470,16 @@ namespace Ryujinx.Graphics.Gpu.Memory
return false;
}
- if (address < Address)
- {
- address = Address;
- }
+ ulong maxAddress = Math.Max(address, Address);
+ ulong minEndAddress = Math.Min(address + size, Address + Size);
- ulong maxSize = Address + Size - address;
-
- if (size > maxSize)
+ if (maxAddress >= minEndAddress)
{
- size = maxSize;
+ // Access doesn't overlap.
+ return false;
}
- ForceDirty(address, size);
+ ForceDirty(maxAddress, minEndAddress - maxAddress);
return true;
}
diff --git a/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs b/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs
index 051838f1..c1fc0c5c 100644
--- a/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs
+++ b/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs
@@ -22,6 +22,11 @@ namespace Ryujinx.Graphics.Gpu.Memory
private int _referenceCount;
/// <summary>
+ /// Indicates whenever the memory manager supports 4KB pages.
+ /// </summary>
+ public bool Supports4KBPages => _cpuMemory.Supports4KBPages;
+
+ /// <summary>
/// In-memory shader cache.
/// </summary>
public ShaderCache ShaderCache { get; }