Fix InvocationInfo on geometry shader and bindless default integer const (#2822)

* Fix InvocationInfo on geometry shader and bindless default integer const

* Shader cache version bump

* Consistency for the default value
This commit is contained in:
gdkchan 2021-11-08 11:39:30 -03:00 committed by GitHub
parent 81e9b86cdb
commit b7a1544e8b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 8 deletions

View file

@ -40,7 +40,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 = 2768; private const ulong ShaderCodeGenVersion = 2822;
// Progress reporting helpers // Progress reporting helpers
private volatile int _shaderCount; private volatile int _shaderCount;

View file

@ -18,12 +18,16 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
// TODO: Bindless texture support. For now we just return 0/do nothing. // TODO: Bindless texture support. For now we just return 0/do nothing.
if (isBindless) if (isBindless)
{ {
return texOp.Inst switch switch (texOp.Inst)
{ {
Instruction.ImageStore => "// imageStore(bindless)", case Instruction.ImageStore:
Instruction.ImageLoad => NumberFormatter.FormatFloat(0), return "// imageStore(bindless)";
_ => NumberFormatter.FormatInt(0) case Instruction.ImageLoad:
}; NumberFormatter.TryFormat(0, texOp.Format.GetComponentType(), out string imageConst);
return imageConst;
default:
return NumberFormatter.FormatInt(0);
}
} }
bool isArray = (texOp.Type & SamplerType.Array) != 0; bool isArray = (texOp.Type & SamplerType.Array) != 0;

View file

@ -95,9 +95,28 @@ namespace Ryujinx.Graphics.Shader.Instructions
if (context.Config.Stage != ShaderStage.Compute && context.Config.Stage != ShaderStage.Fragment) if (context.Config.Stage != ShaderStage.Compute && context.Config.Stage != ShaderStage.Fragment)
{ {
Operand primitiveId = Attribute(AttributeConsts.PrimitiveId); Operand primitiveId = Attribute(AttributeConsts.PrimitiveId);
Operand patchVerticesIn = Attribute(AttributeConsts.PatchVerticesIn); Operand patchVerticesIn;
patchVerticesIn = context.ShiftLeft(patchVerticesIn, Const(16)); if (context.Config.Stage == ShaderStage.TessellationEvaluation)
{
patchVerticesIn = context.ShiftLeft(Attribute(AttributeConsts.PatchVerticesIn), Const(16));
}
else
{
InputTopology inputTopology = context.Config.GpuAccessor.QueryPrimitiveTopology();
int inputVertices = inputTopology switch
{
InputTopology.Points => 1,
InputTopology.Lines or
InputTopology.LinesAdjacency => 2,
InputTopology.Triangles or
InputTopology.TrianglesAdjacency => 3,
_ => 1
};
patchVerticesIn = Const(inputVertices << 16);
}
src = context.BitwiseOr(primitiveId, patchVerticesIn); src = context.BitwiseOr(primitiveId, patchVerticesIn);
} }