Pass all inputs when geometry shader passthrough is enabled (#2362)

* Pass all inputs when geometry shader passthrough is enabled

* Shader cache version bump
This commit is contained in:
gdkchan 2021-06-23 18:04:59 -03:00 committed by GitHub
parent eb23933331
commit 49edf14a3e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 29 deletions

View file

@ -36,7 +36,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
/// <summary> /// <summary>
/// Version of the codegen (to be changed when codegen or guest format change). /// Version of the codegen (to be changed when codegen or guest format change).
/// </summary> /// </summary>
private const ulong ShaderCodeGenVersion = 2367; private const ulong ShaderCodeGenVersion = 2362;
// Progress reporting helpers // Progress reporting helpers
private volatile int _shaderCount; private volatile int _shaderCount;

View file

@ -131,7 +131,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
context.AppendLine(); context.AppendLine();
} }
if (info.IAttributes.Count != 0) if (info.IAttributes.Count != 0 || context.Config.GpPassthrough)
{ {
DeclareInputAttributes(context, info); DeclareInputAttributes(context, info);
@ -371,45 +371,64 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
private static void DeclareInputAttributes(CodeGenContext context, StructuredProgramInfo info) private static void DeclareInputAttributes(CodeGenContext context, StructuredProgramInfo info)
{ {
string suffix = context.Config.Stage == ShaderStage.Geometry ? "[]" : string.Empty; if (context.Config.GpPassthrough)
foreach (int attr in info.IAttributes.OrderBy(x => x))
{ {
string iq = string.Empty; for (int attr = 0; attr < MaxAttributes; attr++)
if (context.Config.Stage == ShaderStage.Fragment)
{ {
iq = context.Config.ImapTypes[attr].GetFirstUsedType() switch DeclareInputAttribute(context, info, attr);
{
PixelImap.Constant => "flat ",
PixelImap.ScreenLinear => "noperspective ",
_ => string.Empty
};
} }
string pass = context.Config.GpPassthrough ? "passthrough, " : string.Empty; foreach (int attr in info.IAttributes.OrderBy(x => x).Where(x => x >= MaxAttributes))
string name = $"{DefaultNames.IAttributePrefix}{attr}";
if ((context.Config.Flags & TranslationFlags.Feedback) != 0)
{ {
for (int c = 0; c < 4; c++) DeclareInputAttribute(context, info, attr);
{
char swzMask = "xyzw"[c];
context.AppendLine($"layout ({pass}location = {attr}, component = {c}) {iq}in float {name}_{swzMask}{suffix};");
}
} }
else }
else
{
foreach (int attr in info.IAttributes.OrderBy(x => x))
{ {
context.AppendLine($"layout ({pass}location = {attr}) {iq}in vec4 {name}{suffix};"); DeclareInputAttribute(context, info, 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.Stage == ShaderStage.Fragment)
{
iq = context.Config.ImapTypes[attr].GetFirstUsedType() switch
{
PixelImap.Constant => "flat ",
PixelImap.ScreenLinear => "noperspective ",
_ => string.Empty
};
}
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++)
{
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) 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); DeclareUsedOutputAttributes(context, info);
} }
@ -423,7 +442,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
{ {
foreach (int attr in info.OAttributes.OrderBy(x => x)) foreach (int attr in info.OAttributes.OrderBy(x => x))
{ {
context.AppendLine($"layout (location = {attr}) out vec4 {DefaultNames.OAttributePrefix}{attr};"); DeclareOutputAttribute(context, attr);
} }
} }