aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs2
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs71
2 files changed, 46 insertions, 27 deletions
diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
index b080a8bb..a4408192 100644
--- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
+++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
@@ -36,7 +36,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
/// <summary>
/// Version of the codegen (to be changed when codegen or guest format change).
/// </summary>
- private const ulong ShaderCodeGenVersion = 2367;
+ private const ulong ShaderCodeGenVersion = 2362;
// Progress reporting helpers
private volatile int _shaderCount;
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
index cb17f18d..2e993ef0 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
@@ -131,7 +131,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
context.AppendLine();
}
- if (info.IAttributes.Count != 0)
+ if (info.IAttributes.Count != 0 || context.Config.GpPassthrough)
{
DeclareInputAttributes(context, info);
@@ -371,45 +371,64 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
private static void DeclareInputAttributes(CodeGenContext context, StructuredProgramInfo info)
{
- string suffix = context.Config.Stage == ShaderStage.Geometry ? "[]" : string.Empty;
-
- foreach (int attr in info.IAttributes.OrderBy(x => x))
+ if (context.Config.GpPassthrough)
{
- string iq = string.Empty;
-
- if (context.Config.Stage == ShaderStage.Fragment)
+ for (int attr = 0; attr < MaxAttributes; attr++)
{
- iq = context.Config.ImapTypes[attr].GetFirstUsedType() switch
- {
- PixelImap.Constant => "flat ",
- PixelImap.ScreenLinear => "noperspective ",
- _ => string.Empty
- };
+ DeclareInputAttribute(context, info, attr);
}
- string pass = context.Config.GpPassthrough ? "passthrough, " : string.Empty;
+ foreach (int attr in info.IAttributes.OrderBy(x => x).Where(x => x >= MaxAttributes))
+ {
+ DeclareInputAttribute(context, info, attr);
+ }
+ }
+ else
+ {
+ foreach (int attr in info.IAttributes.OrderBy(x => x))
+ {
+ DeclareInputAttribute(context, info, attr);
+ }
+ }
+ }
- string name = $"{DefaultNames.IAttributePrefix}{attr}";
+ private static void DeclareInputAttribute(CodeGenContext context, StructuredProgramInfo info, int attr)
+ {
+ string suffix = context.Config.Stage == ShaderStage.Geometry ? "[]" : string.Empty;
+ string iq = string.Empty;
- if ((context.Config.Flags & TranslationFlags.Feedback) != 0)
+ if (context.Config.Stage == ShaderStage.Fragment)
+ {
+ iq = context.Config.ImapTypes[attr].GetFirstUsedType() switch
{
- for (int c = 0; c < 4; c++)
- {
- char swzMask = "xyzw"[c];
+ PixelImap.Constant => "flat ",
+ PixelImap.ScreenLinear => "noperspective ",
+ _ => string.Empty
+ };
+ }
- context.AppendLine($"layout ({pass}location = {attr}, component = {c}) {iq}in float {name}_{swzMask}{suffix};");
- }
- }
- else
+ string pass = context.Config.GpPassthrough && !info.OAttributes.Contains(attr) ? "passthrough, " : string.Empty;
+
+ string name = $"{DefaultNames.IAttributePrefix}{attr}";
+
+ if ((context.Config.Flags & TranslationFlags.Feedback) != 0)
+ {
+ for (int c = 0; c < 4; c++)
{
- context.AppendLine($"layout ({pass}location = {attr}) {iq}in vec4 {name}{suffix};");
+ char swzMask = "xyzw"[c];
+
+ context.AppendLine($"layout ({pass}location = {attr}, component = {c}) {iq}in float {name}_{swzMask}{suffix};");
}
}
+ else
+ {
+ context.AppendLine($"layout ({pass}location = {attr}) {iq}in vec4 {name}{suffix};");
+ }
}
private static void DeclareOutputAttributes(CodeGenContext context, StructuredProgramInfo info)
{
- if (context.Config.Stage == ShaderStage.Fragment)
+ if (context.Config.Stage == ShaderStage.Fragment || context.Config.GpPassthrough)
{
DeclareUsedOutputAttributes(context, info);
}
@@ -423,7 +442,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
{
foreach (int attr in info.OAttributes.OrderBy(x => x))
{
- context.AppendLine($"layout (location = {attr}) out vec4 {DefaultNames.OAttributePrefix}{attr};");
+ DeclareOutputAttribute(context, attr);
}
}