From f665ace2db1d4aa3103475feeec7211481d05c25 Mon Sep 17 00:00:00 2001 From: Marco Carvalho Date: Wed, 8 May 2024 15:29:37 -0300 Subject: [PATCH] Initialize all shader caches concurrently --- src/Ryujinx.Graphics.Gpu/GpuContext.cs | 9 ++++--- .../Shader/DiskCache/DiskCacheGuestStorage.cs | 5 ++-- .../Shader/DiskCache/DiskCacheHostStorage.cs | 24 ++++++++++++------- .../DiskCache/ParallelDiskCacheLoader.cs | 5 ++-- .../Shader/ShaderCache.cs | 5 ++-- 5 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/Ryujinx.Graphics.Gpu/GpuContext.cs b/src/Ryujinx.Graphics.Gpu/GpuContext.cs index 048d32fb79..8ed3f19588 100644 --- a/src/Ryujinx.Graphics.Gpu/GpuContext.cs +++ b/src/Ryujinx.Graphics.Gpu/GpuContext.cs @@ -8,7 +8,9 @@ using Ryujinx.Graphics.Gpu.Synchronization; using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Linq; using System.Threading; +using System.Threading.Tasks; namespace Ryujinx.Graphics.Gpu { @@ -274,14 +276,11 @@ namespace Ryujinx.Graphics.Gpu /// /// Initialize the GPU shader cache. /// - public void InitializeShaderCache(CancellationToken cancellationToken) + public async Task InitializeShaderCache(CancellationToken cancellationToken) { HostInitalized.WaitOne(); - foreach (var physicalMemory in PhysicalMemoryRegistry.Values) - { - physicalMemory.ShaderCache.Initialize(cancellationToken); - } + await Task.WhenAll(PhysicalMemoryRegistry.Values.Select(pm => pm.ShaderCache.Initialize(cancellationToken))); _gpuReadyEvent.Set(); } diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs index 59d2cfb3fe..28568c3951 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheGuestStorage.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Runtime.CompilerServices; +using System.Threading.Tasks; namespace Ryujinx.Graphics.Gpu.Shader.DiskCache { @@ -194,7 +195,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// Guest data file stream /// Guest shader index /// Guest code and constant buffer 1 data - public GuestCodeAndCbData LoadShader(Stream tocFileStream, Stream dataFileStream, int index) + public async Task LoadShader(Stream tocFileStream, Stream dataFileStream, int index) { if (_cache == null || index >= _cache.Length) { @@ -220,7 +221,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache } dataFileStream.Seek((long)entry.Offset, SeekOrigin.Begin); - dataFileStream.Read(cb1Data); + await dataFileStream.ReadAsync(cb1Data); BinarySerializer.ReadCompressed(dataFileStream, guestCode); _cache[index] = (guestCode, cb1Data); diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs index fbf48f017e..0683b8af6e 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Numerics; using System.Runtime.CompilerServices; +using System.Threading.Tasks; namespace Ryujinx.Graphics.Gpu.Shader.DiskCache { @@ -289,7 +290,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// /// GPU context /// Parallel disk cache loader - public void LoadShaders(GpuContext context, ParallelDiskCacheLoader loader) + public async Task LoadShaders(GpuContext context, ParallelDiskCacheLoader loader) { if (!CacheExists()) { @@ -301,11 +302,11 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache try { - using var tocFileStream = DiskCacheCommon.OpenFile(_basePath, SharedTocFileName, writable: false); - using var dataFileStream = DiskCacheCommon.OpenFile(_basePath, SharedDataFileName, writable: false); + await using var tocFileStream = DiskCacheCommon.OpenFile(_basePath, SharedTocFileName, writable: false); + await using var dataFileStream = DiskCacheCommon.OpenFile(_basePath, SharedDataFileName, writable: false); - using var guestTocFileStream = _guestStorage.OpenTocFileStream(); - using var guestDataFileStream = _guestStorage.OpenDataFileStream(); + await using var guestTocFileStream = _guestStorage.OpenTocFileStream(); + await using var guestDataFileStream = _guestStorage.OpenDataFileStream(); BinarySerializer tocReader = new(tocFileStream); BinarySerializer dataReader = new(dataFileStream); @@ -365,7 +366,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache dataReader.Read(ref stageEntry); - guestShaders[stageIndex] = _guestStorage.LoadShader( + guestShaders[stageIndex] = await _guestStorage.LoadShader( guestTocFileStream, guestDataFileStream, stageEntry.GuestCodeIndex); @@ -432,8 +433,15 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache { _guestStorage.ClearMemoryCache(); - hostTocFileStream?.Dispose(); - hostDataFileStream?.Dispose(); + if (hostTocFileStream != null) + { + await hostTocFileStream.DisposeAsync(); + } + + if (hostDataFileStream != null) + { + await hostDataFileStream.DisposeAsync(); + } } } diff --git a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs index 20f96462ea..7017bf9698 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/DiskCache/ParallelDiskCacheLoader.cs @@ -7,6 +7,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Threading; +using System.Threading.Tasks; using static Ryujinx.Graphics.Gpu.Shader.ShaderCache; namespace Ryujinx.Graphics.Gpu.Shader.DiskCache @@ -226,7 +227,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache /// /// Loads all shaders from the cache. /// - public void LoadShaders() + public async Task LoadShaders() { Thread[] workThreads = new Thread[ThreadCount]; @@ -254,7 +255,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache try { - _hostStorage.LoadShaders(_context, this); + await _hostStorage.LoadShaders(_context, this); } catch (DiskCacheLoadException diskCacheLoadException) { diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index 4fc66c4c06..a74c320b72 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading; +using System.Threading.Tasks; namespace Ryujinx.Graphics.Gpu.Shader { @@ -152,7 +153,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Initialize the cache. /// /// Cancellation token to cancel the shader cache initialization process - internal void Initialize(CancellationToken cancellationToken) + internal async Task Initialize(CancellationToken cancellationToken) { if (_diskCacheHostStorage.CacheEnabled) { @@ -164,7 +165,7 @@ namespace Ryujinx.Graphics.Gpu.Shader ShaderCacheStateUpdate, cancellationToken); - loader.LoadShaders(); + await loader.LoadShaders(); int errorCount = loader.ErrorCount; if (errorCount != 0)