forked from MeloNX/MeloNX
* dotnet format style --severity info Some changes were manually reverted. * Restore a few unused methods and variables * Silence dotnet format IDE0060 warnings * Silence dotnet format IDE0052 warnings * Silence dotnet format IDE0059 warnings * Address or silence dotnet format CA1069 warnings * Address or silence dotnet format CA2211 warnings * Address review comments * Fix formatting for switch expressions * Address most dotnet format whitespace warnings * Apply dotnet format whitespace formatting A few of them have been manually reverted and the corresponding warning was silenced * Format if-blocks correctly * Run dotnet format whitespace after rebase * Run dotnet format style after rebase * Run dotnet format whitespace after rebase * Run dotnet format style after rebase * Run dotnet format after rebase and remove unused usings - analyzers - style - whitespace * Disable 'prefer switch expression' rule * Add comments to disabled warnings * Fix naming rule violation, Convert shader properties to auto-property and convert values to const * Simplify properties and array initialization, Use const when possible, Remove trailing commas * Run dotnet format after rebase * Address IDE0251 warnings * Address a few disabled IDE0060 warnings * Silence IDE0060 in .editorconfig * Run dotnet format after rebase * Revert "Simplify properties and array initialization, Use const when possible, Remove trailing commas" This reverts commit 9462e4136c0a2100dc28b20cf9542e06790aa67e. * dotnet format whitespace after rebase * First dotnet format pass * Fix naming rule violations * Add trailing commas * Remove unused members and most unnecessary value assignments * Remove more unnecessary assignments * Remove NRE suppressor
85 lines
4.7 KiB
C#
85 lines
4.7 KiB
C#
using Ryujinx.Graphics.Shader.IntermediateRepresentation;
|
|
using Ryujinx.Graphics.Shader.Translation;
|
|
using static Spv.Specification;
|
|
|
|
namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
|
|
{
|
|
static class IoMap
|
|
{
|
|
// At least 16 attributes are guaranteed by the spec.
|
|
private const int MaxAttributes = 16;
|
|
|
|
public static (BuiltIn, AggregateType) GetSpirvBuiltIn(IoVariable ioVariable)
|
|
{
|
|
return ioVariable switch
|
|
{
|
|
IoVariable.BaseInstance => (BuiltIn.BaseInstance, AggregateType.S32),
|
|
IoVariable.BaseVertex => (BuiltIn.BaseVertex, AggregateType.S32),
|
|
IoVariable.ClipDistance => (BuiltIn.ClipDistance, AggregateType.Array | AggregateType.FP32),
|
|
IoVariable.CtaId => (BuiltIn.WorkgroupId, AggregateType.Vector3 | AggregateType.U32),
|
|
IoVariable.DrawIndex => (BuiltIn.DrawIndex, AggregateType.S32),
|
|
IoVariable.FragmentCoord => (BuiltIn.FragCoord, AggregateType.Vector4 | AggregateType.FP32),
|
|
IoVariable.FragmentOutputDepth => (BuiltIn.FragDepth, AggregateType.FP32),
|
|
IoVariable.FrontFacing => (BuiltIn.FrontFacing, AggregateType.Bool),
|
|
IoVariable.InstanceId => (BuiltIn.InstanceId, AggregateType.S32),
|
|
IoVariable.InstanceIndex => (BuiltIn.InstanceIndex, AggregateType.S32),
|
|
IoVariable.InvocationId => (BuiltIn.InvocationId, AggregateType.S32),
|
|
IoVariable.Layer => (BuiltIn.Layer, AggregateType.S32),
|
|
IoVariable.PatchVertices => (BuiltIn.PatchVertices, AggregateType.S32),
|
|
IoVariable.PointCoord => (BuiltIn.PointCoord, AggregateType.Vector2 | AggregateType.FP32),
|
|
IoVariable.PointSize => (BuiltIn.PointSize, AggregateType.FP32),
|
|
IoVariable.Position => (BuiltIn.Position, AggregateType.Vector4 | AggregateType.FP32),
|
|
IoVariable.PrimitiveId => (BuiltIn.PrimitiveId, AggregateType.S32),
|
|
IoVariable.SubgroupEqMask => (BuiltIn.SubgroupEqMask, AggregateType.Vector4 | AggregateType.U32),
|
|
IoVariable.SubgroupGeMask => (BuiltIn.SubgroupGeMask, AggregateType.Vector4 | AggregateType.U32),
|
|
IoVariable.SubgroupGtMask => (BuiltIn.SubgroupGtMask, AggregateType.Vector4 | AggregateType.U32),
|
|
IoVariable.SubgroupLaneId => (BuiltIn.SubgroupLocalInvocationId, AggregateType.U32),
|
|
IoVariable.SubgroupLeMask => (BuiltIn.SubgroupLeMask, AggregateType.Vector4 | AggregateType.U32),
|
|
IoVariable.SubgroupLtMask => (BuiltIn.SubgroupLtMask, AggregateType.Vector4 | AggregateType.U32),
|
|
IoVariable.TessellationCoord => (BuiltIn.TessCoord, AggregateType.Vector3 | AggregateType.FP32),
|
|
IoVariable.TessellationLevelInner => (BuiltIn.TessLevelInner, AggregateType.Array | AggregateType.FP32),
|
|
IoVariable.TessellationLevelOuter => (BuiltIn.TessLevelOuter, AggregateType.Array | AggregateType.FP32),
|
|
IoVariable.ThreadId => (BuiltIn.LocalInvocationId, AggregateType.Vector3 | AggregateType.U32),
|
|
IoVariable.ThreadKill => (BuiltIn.HelperInvocation, AggregateType.Bool),
|
|
IoVariable.VertexId => (BuiltIn.VertexId, AggregateType.S32),
|
|
IoVariable.VertexIndex => (BuiltIn.VertexIndex, AggregateType.S32),
|
|
IoVariable.ViewportIndex => (BuiltIn.ViewportIndex, AggregateType.S32),
|
|
IoVariable.ViewportMask => (BuiltIn.ViewportMaskNV, AggregateType.Array | AggregateType.S32),
|
|
_ => (default, AggregateType.Invalid),
|
|
};
|
|
}
|
|
|
|
public static int GetSpirvBuiltInArrayLength(IoVariable ioVariable)
|
|
{
|
|
return ioVariable switch
|
|
{
|
|
IoVariable.ClipDistance => 8,
|
|
IoVariable.TessellationLevelInner => 2,
|
|
IoVariable.TessellationLevelOuter => 4,
|
|
IoVariable.ViewportMask => 1,
|
|
IoVariable.UserDefined => MaxAttributes,
|
|
_ => 1,
|
|
};
|
|
}
|
|
|
|
public static bool IsPerVertex(IoVariable ioVariable, ShaderStage stage, bool isOutput)
|
|
{
|
|
switch (ioVariable)
|
|
{
|
|
case IoVariable.Layer:
|
|
case IoVariable.ViewportIndex:
|
|
case IoVariable.PointSize:
|
|
case IoVariable.Position:
|
|
case IoVariable.UserDefined:
|
|
case IoVariable.ClipDistance:
|
|
case IoVariable.PointCoord:
|
|
case IoVariable.ViewportMask:
|
|
return !isOutput &&
|
|
stage is ShaderStage.TessellationControl or ShaderStage.TessellationEvaluation or ShaderStage.Geometry;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|