| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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 == ShaderStage.TessellationControl ||
- stage == ShaderStage.TessellationEvaluation ||
- stage == ShaderStage.Geometry);
- }
- return false;
- }
- }
- }
|