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
This commit is contained in:
parent
bdb6cbb435
commit
cd203e98f2
15 changed files with 426 additions and 48 deletions
|
@ -442,6 +442,41 @@ namespace Ryujinx.Graphics.Gal.Shader
|
|||
return Signed ? ShaderIrInst.Asr : ShaderIrInst.Lsr;
|
||||
}
|
||||
|
||||
public static void Vmad(ShaderIrBlock Block, long OpCode)
|
||||
{
|
||||
ShaderIrNode OperA = GetOperGpr8(OpCode);
|
||||
|
||||
ShaderIrNode OperB;
|
||||
|
||||
if (((OpCode >> 50) & 1) != 0)
|
||||
{
|
||||
OperB = GetOperGpr20(OpCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
OperB = GetOperImm19_20(OpCode);
|
||||
}
|
||||
|
||||
ShaderIrOperGpr OperC = GetOperGpr39(OpCode);
|
||||
|
||||
ShaderIrNode Tmp = new ShaderIrOp(ShaderIrInst.Mul, OperA, OperB);
|
||||
|
||||
ShaderIrNode Final = new ShaderIrOp(ShaderIrInst.Add, Tmp, OperC);
|
||||
|
||||
int Shr = (int)((OpCode >> 51) & 3);
|
||||
|
||||
if (Shr != 0)
|
||||
{
|
||||
int Shift = (Shr == 2) ? 15 : 7;
|
||||
|
||||
Final = new ShaderIrOp(ShaderIrInst.Lsr, Final, new ShaderIrOperImm(Shift));
|
||||
}
|
||||
|
||||
Block.AddNode(new ShaderIrCmnt("Stubbed. Instruction is reduced to a * b + c"));
|
||||
|
||||
Block.AddNode(GetPredNode(new ShaderIrAsg(GetOperGpr0(OpCode), Final), OpCode));
|
||||
}
|
||||
|
||||
public static void Xmad_CR(ShaderIrBlock Block, long OpCode)
|
||||
{
|
||||
EmitXmad(Block, OpCode, ShaderOper.CR);
|
||||
|
@ -819,6 +854,8 @@ namespace Ryujinx.Graphics.Gal.Shader
|
|||
|
||||
OperA = GetAluFabsFneg(OperA, AbsA, NegA);
|
||||
|
||||
Block.AddNode(new ShaderIrCmnt("Stubbed."));
|
||||
|
||||
Block.AddNode(GetPredNode(new ShaderIrAsg(GetOperGpr0(OpCode), OperA), OpCode));
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue