aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2018-07-19 02:33:27 -0300
committergdkchan <gab.dark.100@gmail.com>2018-07-19 02:33:27 -0300
commitcd203e98f2bed076798972da1d108bb64b1884ec (patch)
tree691de94399ec3720e7b952543ab9cef80e839c5f /Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs
parentbdb6cbb43514f6d8eb96847a22b70709ae705827 (diff)
Implement Geometry shaders (#280)
* Implement Geometry shaders * Add EmitVertex() and EndPrimitive() * Read output geometry data from header * Stub Vmad * Add Iadd_I32 * Stub Mov_S (S2R) * Stub Isberd * Change vertex index to gpr39 in Abuf * Add stub messages for consistency * Do not print input block when there is no attributes * Use GL_ARB_enhanced_layouts * Skip geometry shaders when there's no GL_ARB_enhanced_layouts * Address feedback * Address feedback
Diffstat (limited to 'Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs')
-rw-r--r--Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs20
1 files changed, 20 insertions, 0 deletions
diff --git a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs
index 4c9e59cf..c6b71fb0 100644
--- a/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs
+++ b/Ryujinx.Graphics/Gal/Shader/ShaderDecodeMove.cs
@@ -85,6 +85,16 @@ namespace Ryujinx.Graphics.Gal.Shader
EmitI2i(Block, OpCode, ShaderOper.RR);
}
+ public static void Isberd(ShaderIrBlock Block, long OpCode)
+ {
+ //This instruction seems to be used to translate from an address to a vertex index in a GS
+ //Stub it as such
+
+ Block.AddNode(new ShaderIrCmnt("Stubbed."));
+
+ Block.AddNode(GetPredNode(new ShaderIrAsg(GetOperGpr0(OpCode), GetOperGpr8(OpCode)), OpCode));
+ }
+
public static void Mov_C(ShaderIrBlock Block, long OpCode)
{
ShaderIrOperCbuf Cbuf = GetOperCbuf34(OpCode);
@@ -128,6 +138,16 @@ namespace Ryujinx.Graphics.Gal.Shader
EmitSel(Block, OpCode, ShaderOper.RR);
}
+ public static void Mov_S(ShaderIrBlock Block, long OpCode)
+ {
+ Block.AddNode(new ShaderIrCmnt("Stubbed."));
+
+ //Zero is used as a special number to get a valid "0 * 0 + VertexIndex" in a GS
+ ShaderIrNode Source = new ShaderIrOperImm(0);
+
+ Block.AddNode(GetPredNode(new ShaderIrAsg(GetOperGpr0(OpCode), Source), OpCode));
+ }
+
private static void EmitF2f(ShaderIrBlock Block, long OpCode, ShaderOper Oper)
{
bool NegA = ((OpCode >> 45) & 1) != 0;