Fix VertexId and InstanceId on Vulkan (#3833)
* Fix VertexId and InstanceId on Vulkan * Shader cache version bump
This commit is contained in:
parent
a6a67a2b7a
commit
51a27032f0
6 changed files with 38 additions and 4 deletions
|
@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||||
private const ushort FileFormatVersionMajor = 1;
|
private const ushort FileFormatVersionMajor = 1;
|
||||||
private const ushort FileFormatVersionMinor = 2;
|
private const ushort FileFormatVersionMinor = 2;
|
||||||
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
|
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
|
||||||
private const uint CodeGenVersion = 3807;
|
private const uint CodeGenVersion = 3833;
|
||||||
|
|
||||||
private const string SharedTocFileName = "shared.toc";
|
private const string SharedTocFileName = "shared.toc";
|
||||||
private const string SharedDataFileName = "shared.data";
|
private const string SharedDataFileName = "shared.data";
|
||||||
|
|
|
@ -48,6 +48,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
|
||||||
{ AttributeConsts.TessCoordY, new BuiltInAttribute("gl_TessCoord.y", VariableType.F32) },
|
{ AttributeConsts.TessCoordY, new BuiltInAttribute("gl_TessCoord.y", VariableType.F32) },
|
||||||
{ AttributeConsts.InstanceId, new BuiltInAttribute("gl_InstanceID", VariableType.S32) },
|
{ AttributeConsts.InstanceId, new BuiltInAttribute("gl_InstanceID", VariableType.S32) },
|
||||||
{ AttributeConsts.VertexId, new BuiltInAttribute("gl_VertexID", VariableType.S32) },
|
{ AttributeConsts.VertexId, new BuiltInAttribute("gl_VertexID", VariableType.S32) },
|
||||||
|
{ AttributeConsts.BaseInstance, new BuiltInAttribute("gl_BaseInstance", VariableType.S32) },
|
||||||
|
{ AttributeConsts.BaseVertex, new BuiltInAttribute("gl_BaseVertex", VariableType.S32) },
|
||||||
|
{ AttributeConsts.InstanceIndex, new BuiltInAttribute("gl_InstanceIndex", VariableType.S32) },
|
||||||
|
{ AttributeConsts.VertexIndex, new BuiltInAttribute("gl_VertexIndex", VariableType.S32) },
|
||||||
{ AttributeConsts.FrontFacing, new BuiltInAttribute("gl_FrontFacing", VariableType.Bool) },
|
{ AttributeConsts.FrontFacing, new BuiltInAttribute("gl_FrontFacing", VariableType.Bool) },
|
||||||
|
|
||||||
// Special.
|
// Special.
|
||||||
|
|
|
@ -704,8 +704,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
|
||||||
AttributeConsts.ClipDistance0 => BuiltIn.ClipDistance,
|
AttributeConsts.ClipDistance0 => BuiltIn.ClipDistance,
|
||||||
AttributeConsts.PointCoordX => BuiltIn.PointCoord,
|
AttributeConsts.PointCoordX => BuiltIn.PointCoord,
|
||||||
AttributeConsts.TessCoordX => BuiltIn.TessCoord,
|
AttributeConsts.TessCoordX => BuiltIn.TessCoord,
|
||||||
AttributeConsts.InstanceId => BuiltIn.InstanceId, // FIXME: Invalid
|
AttributeConsts.InstanceId => BuiltIn.InstanceId,
|
||||||
AttributeConsts.VertexId => BuiltIn.VertexId, // FIXME: Invalid
|
AttributeConsts.VertexId => BuiltIn.VertexId,
|
||||||
|
AttributeConsts.BaseInstance => BuiltIn.BaseInstance,
|
||||||
|
AttributeConsts.BaseVertex => BuiltIn.BaseVertex,
|
||||||
|
AttributeConsts.InstanceIndex => BuiltIn.InstanceIndex,
|
||||||
|
AttributeConsts.VertexIndex => BuiltIn.VertexIndex,
|
||||||
AttributeConsts.FrontFacing => BuiltIn.FrontFacing,
|
AttributeConsts.FrontFacing => BuiltIn.FrontFacing,
|
||||||
AttributeConsts.FragmentOutputDepth => BuiltIn.FragDepth,
|
AttributeConsts.FragmentOutputDepth => BuiltIn.FragDepth,
|
||||||
AttributeConsts.ThreadKill => BuiltIn.HelperInvocation,
|
AttributeConsts.ThreadKill => BuiltIn.HelperInvocation,
|
||||||
|
|
|
@ -51,7 +51,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
offset |= AttributeConsts.LoadOutputMask;
|
offset |= AttributeConsts.LoadOutputMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
Operand src = op.P ? AttributePerPatch(offset) : Attribute(offset);
|
Operand src = op.P ? AttributePerPatch(offset) : CreateInputAttribute(context, offset);
|
||||||
|
|
||||||
context.Copy(Register(rd), src);
|
context.Copy(Register(rd), src);
|
||||||
}
|
}
|
||||||
|
@ -312,5 +312,22 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
||||||
|
|
||||||
return attr;
|
return attr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Operand CreateInputAttribute(EmitterContext context, int attr)
|
||||||
|
{
|
||||||
|
if (context.Config.Options.TargetApi == TargetApi.Vulkan)
|
||||||
|
{
|
||||||
|
if (attr == AttributeConsts.InstanceId)
|
||||||
|
{
|
||||||
|
return context.ISubtract(Attribute(AttributeConsts.InstanceIndex), Attribute(AttributeConsts.BaseInstance));
|
||||||
|
}
|
||||||
|
else if (attr == AttributeConsts.VertexId)
|
||||||
|
{
|
||||||
|
return Attribute(AttributeConsts.VertexIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Attribute(attr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -95,5 +95,10 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||||
public const int LtMask = 0x2000040;
|
public const int LtMask = 0x2000040;
|
||||||
|
|
||||||
public const int ThreadKill = 0x2000044;
|
public const int ThreadKill = 0x2000044;
|
||||||
|
|
||||||
|
public const int BaseInstance = 0x2000050;
|
||||||
|
public const int BaseVertex = 0x2000054;
|
||||||
|
public const int InstanceIndex = 0x2000058;
|
||||||
|
public const int VertexIndex = 0x200005c;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -27,6 +27,10 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||||
{ AttributeConsts.TessCoordY, new AttributeInfo(AttributeConsts.TessCoordX, 1, 3, AggregateType.Vector | AggregateType.FP32) },
|
{ AttributeConsts.TessCoordY, new AttributeInfo(AttributeConsts.TessCoordX, 1, 3, AggregateType.Vector | AggregateType.FP32) },
|
||||||
{ AttributeConsts.InstanceId, new AttributeInfo(AttributeConsts.InstanceId, 0, 1, AggregateType.S32) },
|
{ AttributeConsts.InstanceId, new AttributeInfo(AttributeConsts.InstanceId, 0, 1, AggregateType.S32) },
|
||||||
{ AttributeConsts.VertexId, new AttributeInfo(AttributeConsts.VertexId, 0, 1, AggregateType.S32) },
|
{ AttributeConsts.VertexId, new AttributeInfo(AttributeConsts.VertexId, 0, 1, AggregateType.S32) },
|
||||||
|
{ AttributeConsts.BaseInstance, new AttributeInfo(AttributeConsts.BaseInstance, 0, 1, AggregateType.S32) },
|
||||||
|
{ AttributeConsts.BaseVertex, new AttributeInfo(AttributeConsts.BaseVertex, 0, 1, AggregateType.S32) },
|
||||||
|
{ AttributeConsts.InstanceIndex, new AttributeInfo(AttributeConsts.InstanceIndex, 0, 1, AggregateType.S32) },
|
||||||
|
{ AttributeConsts.VertexIndex, new AttributeInfo(AttributeConsts.VertexIndex, 0, 1, AggregateType.S32) },
|
||||||
{ AttributeConsts.FrontFacing, new AttributeInfo(AttributeConsts.FrontFacing, 0, 1, AggregateType.Bool) },
|
{ AttributeConsts.FrontFacing, new AttributeInfo(AttributeConsts.FrontFacing, 0, 1, AggregateType.Bool) },
|
||||||
|
|
||||||
// Special.
|
// Special.
|
||||||
|
|
Reference in a new issue