mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2025-01-31 01:11:32 -08:00
3b46bb73f7
* dotnet format style --severity info Some changes were manually reverted. * dotnet format analyzers --serverity info Some changes have been minimally adapted. * Restore a few unused methods and variables * Silence dotnet format IDE0060 warnings * Silence dotnet format IDE0052 warnings * Address dotnet format CA1816 warnings * Address or silence dotnet format CA1069 warnings * Address or silence dotnet format CA2211 warnings * Address remaining dotnet format analyzer warnings * Address review comments * Address most dotnet format whitespace warnings * Apply dotnet format whitespace formatting A few of them have been manually reverted and the corresponding warning was silenced * Format if-blocks correctly * Run dotnet format whitespace after rebase * Run dotnet format style after rebase * Another rebase, another dotnet format run * Run dotnet format style after rebase * Run dotnet format after rebase and remove unused usings - analyzers - style - whitespace * Disable 'prefer switch expression' rule * Add comments to disabled warnings * Remove a few unused parameters * Replace MmeShadowScratch with Array256<uint> * Simplify properties and array initialization, Use const when possible, Remove trailing commas * Start working on disabled warnings * Fix and silence a few dotnet-format warnings again * Run dotnet format after rebase * Address IDE0251 warnings * Silence IDE0060 in .editorconfig * Revert "Simplify properties and array initialization, Use const when possible, Remove trailing commas" This reverts commit 9462e4136c0a2100dc28b20cf9542e06790aa67e. * dotnet format whitespace after rebase * First pass of dotnet format * Add unsafe dotnet format changes * Fix typos * Add trailing commas * Disable formatting for FormatTable * Address review feedback
139 lines
4.6 KiB
C#
139 lines
4.6 KiB
C#
using Ryujinx.Common;
|
|
using Ryujinx.Common.Logging;
|
|
using System;
|
|
using System.IO;
|
|
|
|
namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
|
{
|
|
/// <summary>
|
|
/// Represents a background disk cache writer.
|
|
/// </summary>
|
|
class BackgroundDiskCacheWriter : IDisposable
|
|
{
|
|
/// <summary>
|
|
/// Possible operation to do on the <see cref="_fileWriterWorkerQueue"/>.
|
|
/// </summary>
|
|
private enum CacheFileOperation
|
|
{
|
|
/// <summary>
|
|
/// Operation to add a shader to the cache.
|
|
/// </summary>
|
|
AddShader,
|
|
}
|
|
|
|
/// <summary>
|
|
/// Represents an operation to perform on the <see cref="_fileWriterWorkerQueue"/>.
|
|
/// </summary>
|
|
private readonly struct CacheFileOperationTask
|
|
{
|
|
/// <summary>
|
|
/// The type of operation to perform.
|
|
/// </summary>
|
|
public readonly CacheFileOperation Type;
|
|
|
|
/// <summary>
|
|
/// The data associated to this operation or null.
|
|
/// </summary>
|
|
public readonly object Data;
|
|
|
|
public CacheFileOperationTask(CacheFileOperation type, object data)
|
|
{
|
|
Type = type;
|
|
Data = data;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Background shader cache write information.
|
|
/// </summary>
|
|
private readonly struct AddShaderData
|
|
{
|
|
/// <summary>
|
|
/// Cached shader program.
|
|
/// </summary>
|
|
public readonly CachedShaderProgram Program;
|
|
|
|
/// <summary>
|
|
/// Binary host code.
|
|
/// </summary>
|
|
public readonly byte[] HostCode;
|
|
|
|
/// <summary>
|
|
/// Creates a new background shader cache write information.
|
|
/// </summary>
|
|
/// <param name="program">Cached shader program</param>
|
|
/// <param name="hostCode">Binary host code</param>
|
|
public AddShaderData(CachedShaderProgram program, byte[] hostCode)
|
|
{
|
|
Program = program;
|
|
HostCode = hostCode;
|
|
}
|
|
}
|
|
|
|
private readonly GpuContext _context;
|
|
private readonly DiskCacheHostStorage _hostStorage;
|
|
private readonly AsyncWorkQueue<CacheFileOperationTask> _fileWriterWorkerQueue;
|
|
|
|
/// <summary>
|
|
/// Creates a new background disk cache writer.
|
|
/// </summary>
|
|
/// <param name="context">GPU context</param>
|
|
/// <param name="hostStorage">Disk cache host storage</param>
|
|
public BackgroundDiskCacheWriter(GpuContext context, DiskCacheHostStorage hostStorage)
|
|
{
|
|
_context = context;
|
|
_hostStorage = hostStorage;
|
|
_fileWriterWorkerQueue = new AsyncWorkQueue<CacheFileOperationTask>(ProcessTask, "GPU.BackgroundDiskCacheWriter");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Processes a shader cache background operation.
|
|
/// </summary>
|
|
/// <param name="task">Task to process</param>
|
|
private void ProcessTask(CacheFileOperationTask task)
|
|
{
|
|
switch (task.Type)
|
|
{
|
|
case CacheFileOperation.AddShader:
|
|
AddShaderData data = (AddShaderData)task.Data;
|
|
try
|
|
{
|
|
_hostStorage.AddShader(_context, data.Program, data.HostCode);
|
|
}
|
|
catch (DiskCacheLoadException diskCacheLoadException)
|
|
{
|
|
Logger.Error?.Print(LogClass.Gpu, $"Error writing shader to disk cache. {diskCacheLoadException.Message}");
|
|
}
|
|
catch (IOException ioException)
|
|
{
|
|
Logger.Error?.Print(LogClass.Gpu, $"Error writing shader to disk cache. {ioException.Message}");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds a shader program to be cached in the background.
|
|
/// </summary>
|
|
/// <param name="program">Shader program to cache</param>
|
|
/// <param name="hostCode">Host binary code of the program</param>
|
|
public void AddShader(CachedShaderProgram program, byte[] hostCode)
|
|
{
|
|
_fileWriterWorkerQueue.Add(new CacheFileOperationTask(CacheFileOperation.AddShader, new AddShaderData(program, hostCode)));
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Dispose(true);
|
|
}
|
|
|
|
protected virtual void Dispose(bool disposing)
|
|
{
|
|
if (disposing)
|
|
{
|
|
_fileWriterWorkerQueue.Dispose();
|
|
}
|
|
}
|
|
}
|
|
}
|