forked from Mirror/Ryujinx
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:
parent
eb23933331
commit
49edf14a3e
2 changed files with 48 additions and 29 deletions
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Reference in a new issue