aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2021-11-08 11:39:30 -0300
committerGitHub <noreply@github.com>2021-11-08 11:39:30 -0300
commitb7a1544e8b4e538272c491a746bdd19ec188a0c3 (patch)
treeb325765ccd98613cb63350cb4d66bb19db38f0db
parent81e9b86cdb4b2a01cc41b8e8a4dff2c9e3c13843 (diff)
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
-rw-r--r--Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs2
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs14
-rw-r--r--Ryujinx.Graphics.Shader/Instructions/InstEmitMove.cs25
3 files changed, 32 insertions, 9 deletions
diff --git a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
index be5e7ab9..67a397b3 100644
--- a/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
+++ b/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs
@@ -40,7 +40,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
/// <summary>
/// Version of the codegen (to be changed when codegen or guest format change).
/// </summary>
- private const ulong ShaderCodeGenVersion = 2768;
+ private const ulong ShaderCodeGenVersion = 2822;
// Progress reporting helpers
private volatile int _shaderCount;
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs
index f976ec5e..abca03aa 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs
@@ -18,12 +18,16 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
// TODO: Bindless texture support. For now we just return 0/do nothing.
if (isBindless)
{
- return texOp.Inst switch
+ switch (texOp.Inst)
{
- Instruction.ImageStore => "// imageStore(bindless)",
- Instruction.ImageLoad => NumberFormatter.FormatFloat(0),
- _ => NumberFormatter.FormatInt(0)
- };
+ case Instruction.ImageStore:
+ return "// imageStore(bindless)";
+ 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;
diff --git a/Ryujinx.Graphics.Shader/Instructions/InstEmitMove.cs b/Ryujinx.Graphics.Shader/Instructions/InstEmitMove.cs
index 240fd6b1..51b70601 100644
--- a/Ryujinx.Graphics.Shader/Instructions/InstEmitMove.cs
+++ b/Ryujinx.Graphics.Shader/Instructions/InstEmitMove.cs
@@ -95,9 +95,28 @@ namespace Ryujinx.Graphics.Shader.Instructions
if (context.Config.Stage != ShaderStage.Compute && context.Config.Stage != ShaderStage.Fragment)
{
Operand primitiveId = Attribute(AttributeConsts.PrimitiveId);
- Operand patchVerticesIn = Attribute(AttributeConsts.PatchVerticesIn);
-
- patchVerticesIn = context.ShiftLeft(patchVerticesIn, Const(16));
+ Operand patchVerticesIn;
+
+ 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);
}