Update shader cache handling to process old versions
This commit is contained in:
parent
4e501f1a70
commit
95a0344eb4
5 changed files with 93 additions and 7 deletions
|
@ -50,6 +50,10 @@ namespace Ryujinx.Graphics.GAL
|
||||||
public readonly bool SupportsViewportSwizzle;
|
public readonly bool SupportsViewportSwizzle;
|
||||||
public readonly bool SupportsIndirectParameters;
|
public readonly bool SupportsIndirectParameters;
|
||||||
public readonly bool SupportsDepthClipControl;
|
public readonly bool SupportsDepthClipControl;
|
||||||
|
public readonly bool SupportsExtendedDynamicState;
|
||||||
|
public readonly bool SupportsExtendedDynamicState2;
|
||||||
|
public readonly bool SupportsLogicOpDynamicState;
|
||||||
|
public readonly bool SupportsPatchControlPointsDynamicState;
|
||||||
|
|
||||||
public readonly int UniformBufferSetIndex;
|
public readonly int UniformBufferSetIndex;
|
||||||
public readonly int StorageBufferSetIndex;
|
public readonly int StorageBufferSetIndex;
|
||||||
|
@ -116,6 +120,10 @@ namespace Ryujinx.Graphics.GAL
|
||||||
bool supportsViewportSwizzle,
|
bool supportsViewportSwizzle,
|
||||||
bool supportsIndirectParameters,
|
bool supportsIndirectParameters,
|
||||||
bool supportsDepthClipControl,
|
bool supportsDepthClipControl,
|
||||||
|
bool supportsExtendedDynamicState,
|
||||||
|
bool supportsExtendedDynamicState2,
|
||||||
|
bool supportsLogicOpDynamicState,
|
||||||
|
bool supportsPatchControlPointsDynamicState,
|
||||||
int uniformBufferSetIndex,
|
int uniformBufferSetIndex,
|
||||||
int storageBufferSetIndex,
|
int storageBufferSetIndex,
|
||||||
int textureSetIndex,
|
int textureSetIndex,
|
||||||
|
@ -177,6 +185,10 @@ namespace Ryujinx.Graphics.GAL
|
||||||
SupportsViewportSwizzle = supportsViewportSwizzle;
|
SupportsViewportSwizzle = supportsViewportSwizzle;
|
||||||
SupportsIndirectParameters = supportsIndirectParameters;
|
SupportsIndirectParameters = supportsIndirectParameters;
|
||||||
SupportsDepthClipControl = supportsDepthClipControl;
|
SupportsDepthClipControl = supportsDepthClipControl;
|
||||||
|
SupportsExtendedDynamicState = supportsExtendedDynamicState;
|
||||||
|
SupportsExtendedDynamicState2 = supportsExtendedDynamicState2;
|
||||||
|
SupportsLogicOpDynamicState = supportsLogicOpDynamicState;
|
||||||
|
SupportsPatchControlPointsDynamicState = supportsPatchControlPointsDynamicState;
|
||||||
UniformBufferSetIndex = uniformBufferSetIndex;
|
UniformBufferSetIndex = uniformBufferSetIndex;
|
||||||
StorageBufferSetIndex = storageBufferSetIndex;
|
StorageBufferSetIndex = storageBufferSetIndex;
|
||||||
TextureSetIndex = textureSetIndex;
|
TextureSetIndex = textureSetIndex;
|
||||||
|
|
|
@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||||
private const ushort FileFormatVersionMajor = 1;
|
private const ushort FileFormatVersionMajor = 1;
|
||||||
private const ushort FileFormatVersionMinor = 2;
|
private const ushort FileFormatVersionMinor = 2;
|
||||||
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
|
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
|
||||||
private const uint CodeGenVersion = 7331;
|
private const uint CodeGenVersion = 7332;
|
||||||
|
|
||||||
private const string SharedTocFileName = "shared.toc";
|
private const string SharedTocFileName = "shared.toc";
|
||||||
private const string SharedDataFileName = "shared.data";
|
private const string SharedDataFileName = "shared.data";
|
||||||
|
|
|
@ -232,10 +232,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||||
|
|
||||||
for (int index = 0; index < ThreadCount; index++)
|
for (int index = 0; index < ThreadCount; index++)
|
||||||
{
|
{
|
||||||
workThreads[index] = new Thread(ProcessAsyncQueue)
|
workThreads[index] = new Thread(ProcessAsyncQueue) { Name = $"GPU.AsyncTranslationThread.{index}", };
|
||||||
{
|
|
||||||
Name = $"GPU.AsyncTranslationThread.{index}",
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int programCount = _hostStorage.GetProgramCount();
|
int programCount = _hostStorage.GetProgramCount();
|
||||||
|
@ -305,6 +302,9 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||||
using var streams = _hostStorage.GetOutputStreams(_context);
|
using var streams = _hostStorage.GetOutputStreams(_context);
|
||||||
|
|
||||||
int packagedShaders = 0;
|
int packagedShaders = 0;
|
||||||
|
ProgramPipelineState previousPipelineState = default;
|
||||||
|
ProgramPipelineState currentPipelineState = default;
|
||||||
|
|
||||||
foreach (var kv in _programList)
|
foreach (var kv in _programList)
|
||||||
{
|
{
|
||||||
if (!Active)
|
if (!Active)
|
||||||
|
@ -314,11 +314,55 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||||
|
|
||||||
(CachedShaderProgram program, byte[] binaryCode) = kv.Value;
|
(CachedShaderProgram program, byte[] binaryCode) = kv.Value;
|
||||||
|
|
||||||
|
if (program.SpecializationState.PipelineState.HasValue && _context.Capabilities.SupportsExtendedDynamicState)
|
||||||
|
{
|
||||||
|
currentPipelineState = program.SpecializationState.PipelineState.Value;
|
||||||
|
|
||||||
|
if (_context.Capabilities.SupportsExtendedDynamicState)
|
||||||
|
{
|
||||||
|
currentPipelineState.StencilTest = default;
|
||||||
|
|
||||||
|
currentPipelineState.CullMode = 0;
|
||||||
|
currentPipelineState.FrontFace = 0;
|
||||||
|
currentPipelineState.DepthTest = default;
|
||||||
|
currentPipelineState.Topology = ConvertToClass(currentPipelineState.Topology);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_context.Capabilities.SupportsExtendedDynamicState2)
|
||||||
|
{
|
||||||
|
currentPipelineState.PrimitiveRestartEnable = false;
|
||||||
|
currentPipelineState.BiasEnable = 0;
|
||||||
|
currentPipelineState.RasterizerDiscard = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_context.Capabilities.SupportsLogicOpDynamicState)
|
||||||
|
{
|
||||||
|
currentPipelineState.LogicOp = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_context.Capabilities.SupportsPatchControlPointsDynamicState)
|
||||||
|
{
|
||||||
|
currentPipelineState.PatchControlPoints = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentPipelineState = program.SpecializationState.PipelineState.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (currentPipelineState.Equals(previousPipelineState) || !_context.Capabilities.SupportsExtendedDynamicState)
|
||||||
|
{
|
||||||
_hostStorage.AddShader(_context, program, binaryCode, streams);
|
_hostStorage.AddShader(_context, program, binaryCode, streams);
|
||||||
|
|
||||||
_stateChangeCallback(ShaderCacheState.Packaging, ++packagedShaders, _programList.Count);
|
_stateChangeCallback(ShaderCacheState.Packaging, ++packagedShaders, _programList.Count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_context.Capabilities.SupportsExtendedDynamicState)
|
||||||
|
{
|
||||||
|
previousPipelineState = currentPipelineState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Logger.Info?.Print(LogClass.Gpu, $"Rebuilt {_programList.Count} shaders successfully.");
|
Logger.Info?.Print(LogClass.Gpu, $"Rebuilt {_programList.Count} shaders successfully.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -343,6 +387,28 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||||
_stateChangeCallback(ShaderCacheState.Loaded, programCount, programCount);
|
_stateChangeCallback(ShaderCacheState.Loaded, programCount, programCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PrimitiveTopology ConvertToClass(PrimitiveTopology topology)
|
||||||
|
{
|
||||||
|
return topology switch
|
||||||
|
{
|
||||||
|
PrimitiveTopology.Points => PrimitiveTopology.Points,
|
||||||
|
PrimitiveTopology.Lines or
|
||||||
|
PrimitiveTopology.LineStrip or
|
||||||
|
PrimitiveTopology.LinesAdjacency or
|
||||||
|
PrimitiveTopology.LineStripAdjacency => PrimitiveTopology.Lines,
|
||||||
|
PrimitiveTopology.Triangles or
|
||||||
|
PrimitiveTopology.TriangleStrip or
|
||||||
|
PrimitiveTopology.TriangleFan or
|
||||||
|
PrimitiveTopology.TrianglesAdjacency or
|
||||||
|
PrimitiveTopology.TriangleStripAdjacency or
|
||||||
|
PrimitiveTopology.Polygon => PrimitiveTopology.TriangleStrip,
|
||||||
|
PrimitiveTopology.Patches => PrimitiveTopology.Patches,
|
||||||
|
PrimitiveTopology.Quads => PrimitiveTopology.Quads,
|
||||||
|
PrimitiveTopology.QuadStrip => PrimitiveTopology.QuadStrip,
|
||||||
|
PrimitiveTopology.LineLoop => PrimitiveTopology.LineLoop,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Enqueues a host program for compilation.
|
/// Enqueues a host program for compilation.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -187,6 +187,10 @@ namespace Ryujinx.Graphics.OpenGL
|
||||||
supportsViewportSwizzle: HwCapabilities.SupportsViewportSwizzle,
|
supportsViewportSwizzle: HwCapabilities.SupportsViewportSwizzle,
|
||||||
supportsIndirectParameters: HwCapabilities.SupportsIndirectParameters,
|
supportsIndirectParameters: HwCapabilities.SupportsIndirectParameters,
|
||||||
supportsDepthClipControl: true,
|
supportsDepthClipControl: true,
|
||||||
|
supportsExtendedDynamicState: false,
|
||||||
|
supportsExtendedDynamicState2: false,
|
||||||
|
supportsLogicOpDynamicState: false,
|
||||||
|
supportsPatchControlPointsDynamicState: false,
|
||||||
uniformBufferSetIndex: 0,
|
uniformBufferSetIndex: 0,
|
||||||
storageBufferSetIndex: 1,
|
storageBufferSetIndex: 1,
|
||||||
textureSetIndex: 2,
|
textureSetIndex: 2,
|
||||||
|
|
|
@ -793,6 +793,10 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
supportsViewportSwizzle: false,
|
supportsViewportSwizzle: false,
|
||||||
supportsIndirectParameters: true,
|
supportsIndirectParameters: true,
|
||||||
supportsDepthClipControl: Capabilities.SupportsDepthClipControl,
|
supportsDepthClipControl: Capabilities.SupportsDepthClipControl,
|
||||||
|
supportsExtendedDynamicState: Capabilities.SupportsExtendedDynamicState,
|
||||||
|
supportsExtendedDynamicState2: Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2,
|
||||||
|
supportsLogicOpDynamicState: Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2LogicOp,
|
||||||
|
supportsPatchControlPointsDynamicState: Capabilities.SupportsExtendedDynamicState2.ExtendedDynamicState2PatchControlPoints,
|
||||||
uniformBufferSetIndex: PipelineBase.UniformSetIndex,
|
uniformBufferSetIndex: PipelineBase.UniformSetIndex,
|
||||||
storageBufferSetIndex: PipelineBase.StorageSetIndex,
|
storageBufferSetIndex: PipelineBase.StorageSetIndex,
|
||||||
textureSetIndex: PipelineBase.TextureSetIndex,
|
textureSetIndex: PipelineBase.TextureSetIndex,
|
||||||
|
|
Loading…
Reference in a new issue