|
|
@@ -1,3 +1,4 @@
|
|
|
+using Ryujinx.Common.Logging;
|
|
|
using System;
|
|
|
using System.Collections;
|
|
|
using System.Collections.Generic;
|
|
|
@@ -47,11 +48,17 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|
|
{
|
|
|
private const int MinCountForDeletion = 32;
|
|
|
private const int MaxCapacity = 2048;
|
|
|
+ private const ulong GiB = 1024 * 1024 * 1024;
|
|
|
+ private ulong MaxTextureSizeCapacity = 4UL * GiB;
|
|
|
private const ulong MinTextureSizeCapacity = 512 * 1024 * 1024;
|
|
|
- private const ulong MaxTextureSizeCapacity = 4UL * 1024 * 1024 * 1024;
|
|
|
- private const ulong DefaultTextureSizeCapacity = 1UL * 1024 * 1024 * 1024;
|
|
|
+ private const ulong DefaultTextureSizeCapacity = 1 * GiB;
|
|
|
+ private const ulong TextureSizeCapacity6GiB = 4 * GiB;
|
|
|
+ private const ulong TextureSizeCapacity8GiB = 6 * GiB;
|
|
|
+ private const ulong TextureSizeCapacity12GiB = 12 * GiB;
|
|
|
+
|
|
|
+
|
|
|
private const float MemoryScaleFactor = 0.50f;
|
|
|
- private ulong _maxCacheMemoryUsage = 0;
|
|
|
+ private ulong _maxCacheMemoryUsage = DefaultTextureSizeCapacity;
|
|
|
|
|
|
private readonly LinkedList<Texture> _textures;
|
|
|
private ulong _totalSize;
|
|
|
@@ -66,18 +73,38 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|
|
/// </summary>
|
|
|
/// <remarks>
|
|
|
/// If the backend GPU has 0 memory capacity, the cache size defaults to `DefaultTextureSizeCapacity`.
|
|
|
+ ///
|
|
|
+ /// Reads the current Device total CPU Memory, to determine the maximum amount of Vram available. Capped to 50% of Current GPU Memory.
|
|
|
/// </remarks>
|
|
|
/// <param name="context">The GPU context that the cache belongs to</param>
|
|
|
- public void Initialize(GpuContext context)
|
|
|
+ /// <param name="cpuMemorySize">The amount of physical CPU Memory Avaiable on the device.</param>
|
|
|
+ public void Initialize(GpuContext context, ulong cpuMemorySize)
|
|
|
{
|
|
|
- var cacheMemory = (ulong)(context.Capabilities.MaximumGpuMemory * MemoryScaleFactor);
|
|
|
-
|
|
|
- _maxCacheMemoryUsage = Math.Clamp(cacheMemory, MinTextureSizeCapacity, MaxTextureSizeCapacity);
|
|
|
+ var cpuMemorySizeGiB = cpuMemorySize / GiB;
|
|
|
|
|
|
- if (context.Capabilities.MaximumGpuMemory == 0)
|
|
|
+ if (cpuMemorySizeGiB < 6 || context.Capabilities.MaximumGpuMemory == 0)
|
|
|
{
|
|
|
_maxCacheMemoryUsage = DefaultTextureSizeCapacity;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else if (cpuMemorySizeGiB == 6)
|
|
|
+ {
|
|
|
+ MaxTextureSizeCapacity = TextureSizeCapacity6GiB;
|
|
|
+ }
|
|
|
+ else if (cpuMemorySizeGiB == 8)
|
|
|
+ {
|
|
|
+ MaxTextureSizeCapacity = TextureSizeCapacity8GiB;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ MaxTextureSizeCapacity = TextureSizeCapacity12GiB;
|
|
|
+ }
|
|
|
+
|
|
|
+ var cacheMemory = (ulong)(context.Capabilities.MaximumGpuMemory * MemoryScaleFactor);
|
|
|
+
|
|
|
+ _maxCacheMemoryUsage = Math.Clamp(cacheMemory, MinTextureSizeCapacity, MaxTextureSizeCapacity);
|
|
|
+
|
|
|
+ Logger.Info?.Print(LogClass.Gpu, $"AutoDelete Cache Allocated VRAM : {_maxCacheMemoryUsage / GiB} GiB");
|
|
|
}
|
|
|
|
|
|
/// <summary>
|