Initial support for shader attribute indexing (#2546)

* Initial support for shader attribute indexing

* Support output indexing too, other improvements

* Fix order

* Address feedback
This commit is contained in:
gdkchan 2021-08-26 20:44:47 -03:00 committed by GitHub
parent ec3e848d79
commit ee1038e542
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 298 additions and 86 deletions

View file

@ -402,14 +402,23 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
private static void DeclareInputAttributes(CodeGenContext context, StructuredProgramInfo info)
{
int usedAttribtes = context.Config.UsedInputAttributes;
while (usedAttribtes != 0)
if (context.Config.UsedFeatures.HasFlag(FeatureFlags.IaIndexing))
{
int index = BitOperations.TrailingZeroCount(usedAttribtes);
string suffix = context.Config.Stage == ShaderStage.Geometry ? "[]" : string.Empty;
DeclareInputAttribute(context, info, index);
context.AppendLine($"layout (location = 0) in vec4 {DefaultNames.IAttributePrefix}{suffix}[{Constants.MaxAttributes}];");
}
else
{
int usedAttributes = context.Config.UsedInputAttributes;
while (usedAttributes != 0)
{
int index = BitOperations.TrailingZeroCount(usedAttributes);
usedAttribtes &= ~(1 << index);
DeclareInputAttribute(context, info, index);
usedAttributes &= ~(1 << index);
}
}
}
@ -448,14 +457,21 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
private static void DeclareOutputAttributes(CodeGenContext context, StructuredProgramInfo info)
{
int usedAttribtes = context.Config.UsedOutputAttributes;
while (usedAttribtes != 0)
if (context.Config.UsedFeatures.HasFlag(FeatureFlags.OaIndexing))
{
int index = BitOperations.TrailingZeroCount(usedAttribtes);
context.AppendLine($"layout (location = 0) out vec4 {DefaultNames.OAttributePrefix}[{Constants.MaxAttributes}];");
}
else
{
int usedAttributes = context.Config.UsedOutputAttributes;
while (usedAttributes != 0)
{
int index = BitOperations.TrailingZeroCount(usedAttributes);
DeclareOutputAttribute(context, index);
DeclareOutputAttribute(context, index);
usedAttribtes &= ~(1 << index);
usedAttributes &= ~(1 << index);
}
}
}