aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs38
1 files changed, 38 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
index 5c045d9b..11f7085d 100644
--- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
+++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
@@ -353,6 +353,11 @@ namespace Ryujinx.Graphics.Gpu.Shader
}
}
+ if (!_context.Capabilities.SupportsGeometryShader)
+ {
+ TryRemoveGeometryStage(translatorContexts);
+ }
+
CachedShaderStage[] shaders = new CachedShaderStage[Constants.ShaderStages + 1];
List<ShaderSource> shaderSources = new List<ShaderSource>();
@@ -422,6 +427,39 @@ namespace Ryujinx.Graphics.Gpu.Shader
}
/// <summary>
+ /// Tries to eliminate the geometry stage from the array of translator contexts.
+ /// </summary>
+ /// <param name="translatorContexts">Array of translator contexts</param>
+ public static void TryRemoveGeometryStage(TranslatorContext[] translatorContexts)
+ {
+ if (translatorContexts[4] != null)
+ {
+ // We have a geometry shader, but geometry shaders are not supported.
+ // Try to eliminate the geometry shader.
+
+ ShaderProgramInfo info = translatorContexts[4].Translate().Info;
+
+ if (info.Identification == ShaderIdentification.GeometryLayerPassthrough)
+ {
+ // We managed to identify that this geometry shader is only used to set the output Layer value,
+ // we can set the Layer on the previous stage instead (usually the vertex stage) and eliminate it.
+
+ for (int i = 3; i >= 1; i--)
+ {
+ if (translatorContexts[i] != null)
+ {
+ translatorContexts[i].SetGeometryShaderLayerInputAttribute(info.GpLayerInputAttribute);
+ translatorContexts[i].SetLastInVertexPipeline(translatorContexts[5] != null);
+ break;
+ }
+ }
+
+ translatorContexts[4] = null;
+ }
+ }
+ }
+
+ /// <summary>
/// Creates a shader source for use with the backend from a translated shader program.
/// </summary>
/// <param name="program">Translated shader program</param>