aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs')
-rw-r--r--src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs
index fcd95375..a41f761b 100644
--- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs
+++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderSpecializationState.cs
@@ -457,6 +457,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
/// <param name="channel">GPU channel</param>
/// <param name="poolState">Texture pool state</param>
/// <param name="graphicsState">Graphics state</param>
+ /// <param name="vertexAsCompute">Indicates that the vertex shader has been converted into a compute shader</param>
/// <param name="usesDrawParameters">Indicates whether the vertex shader accesses draw parameters</param>
/// <param name="checkTextures">Indicates whether texture descriptors should be checked</param>
/// <returns>True if the state matches, false otherwise</returns>
@@ -464,6 +465,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
GpuChannel channel,
ref GpuChannelPoolState poolState,
ref GpuChannelGraphicsState graphicsState,
+ bool vertexAsCompute,
bool usesDrawParameters,
bool checkTextures)
{
@@ -497,9 +499,25 @@ namespace Ryujinx.Graphics.Gpu.Shader
return false;
}
- if (!graphicsState.AttributeTypes.AsSpan().SequenceEqual(GraphicsState.AttributeTypes.AsSpan()))
+ if (ShaderCache.MayConvertVtgToCompute(ref channel.Capabilities) && !vertexAsCompute)
{
- return false;
+ for (int index = 0; index < graphicsState.AttributeTypes.Length; index++)
+ {
+ AttributeType lType = FilterAttributeType(channel, graphicsState.AttributeTypes[index]);
+ AttributeType rType = FilterAttributeType(channel, GraphicsState.AttributeTypes[index]);
+
+ if (lType != rType)
+ {
+ return false;
+ }
+ }
+ }
+ else
+ {
+ if (!graphicsState.AttributeTypes.AsSpan().SequenceEqual(GraphicsState.AttributeTypes.AsSpan()))
+ {
+ return false;
+ }
}
if (usesDrawParameters && graphicsState.HasConstantBufferDrawParameters != GraphicsState.HasConstantBufferDrawParameters)
@@ -530,6 +548,19 @@ namespace Ryujinx.Graphics.Gpu.Shader
return Matches(channel, ref poolState, checkTextures, isCompute: false);
}
+ private static AttributeType FilterAttributeType(GpuChannel channel, AttributeType type)
+ {
+ type &= ~(AttributeType.Packed | AttributeType.PackedRgb10A2Signed);
+
+ if (channel.Capabilities.SupportsScaledVertexFormats &&
+ (type == AttributeType.Sscaled || type == AttributeType.Uscaled))
+ {
+ type = AttributeType.Float;
+ }
+
+ return type;
+ }
+
/// <summary>
/// Checks if the recorded state matches the current GPU compute engine state.
/// </summary>