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
73
Ryujinx.Graphics/Gal/Shader/ShaderHeader.cs
Normal file
73
Ryujinx.Graphics/Gal/Shader/ShaderHeader.cs
Normal file
|
@ -0,0 +1,73 @@
|
|||
namespace Ryujinx.Graphics.Gal.Shader
|
||||
{
|
||||
class ShaderHeader
|
||||
{
|
||||
public const int PointList = 1;
|
||||
public const int LineStrip = 6;
|
||||
public const int TriangleStrip = 7;
|
||||
|
||||
public int SphType { get; private set; }
|
||||
public int Version { get; private set; }
|
||||
public int ShaderType { get; private set; }
|
||||
public bool MrtEnable { get; private set; }
|
||||
public bool KillsPixels { get; private set; }
|
||||
public bool DoesGlobalStore { get; private set; }
|
||||
public int SassVersion { get; private set; }
|
||||
public bool DoesLoadOrStore { get; private set; }
|
||||
public bool DoesFp64 { get; private set; }
|
||||
public int StreamOutMask { get; private set; }
|
||||
|
||||
public int ShaderLocalMemoryLowSize { get; private set; }
|
||||
public int PerPatchAttributeCount { get; private set; }
|
||||
|
||||
public int ShaderLocalMemoryHighSize { get; private set; }
|
||||
public int ThreadsPerInputPrimitive { get; private set; }
|
||||
|
||||
public int ShaderLocalMemoryCrsSize { get; private set; }
|
||||
public int OutputTopology { get; private set; }
|
||||
|
||||
public int MaxOutputVertexCount { get; private set; }
|
||||
public int StoreReqStart { get; private set; }
|
||||
public int StoreReqEnd { get; private set; }
|
||||
|
||||
public ShaderHeader(IGalMemory Memory, long Position)
|
||||
{
|
||||
uint CommonWord0 = (uint)Memory.ReadInt32(Position + 0);
|
||||
uint CommonWord1 = (uint)Memory.ReadInt32(Position + 4);
|
||||
uint CommonWord2 = (uint)Memory.ReadInt32(Position + 8);
|
||||
uint CommonWord3 = (uint)Memory.ReadInt32(Position + 12);
|
||||
uint CommonWord4 = (uint)Memory.ReadInt32(Position + 16);
|
||||
|
||||
SphType = ReadBits(CommonWord0, 0, 5);
|
||||
Version = ReadBits(CommonWord0, 5, 5);
|
||||
ShaderType = ReadBits(CommonWord0, 10, 4);
|
||||
MrtEnable = ReadBits(CommonWord0, 14, 1) != 0;
|
||||
KillsPixels = ReadBits(CommonWord0, 15, 1) != 0;
|
||||
DoesGlobalStore = ReadBits(CommonWord0, 16, 1) != 0;
|
||||
SassVersion = ReadBits(CommonWord0, 17, 4);
|
||||
DoesLoadOrStore = ReadBits(CommonWord0, 26, 1) != 0;
|
||||
DoesFp64 = ReadBits(CommonWord0, 27, 1) != 0;
|
||||
StreamOutMask = ReadBits(CommonWord0, 28, 4);
|
||||
|
||||
ShaderLocalMemoryLowSize = ReadBits(CommonWord1, 0, 24);
|
||||
PerPatchAttributeCount = ReadBits(CommonWord1, 24, 8);
|
||||
|
||||
ShaderLocalMemoryHighSize = ReadBits(CommonWord2, 0, 24);
|
||||
ThreadsPerInputPrimitive = ReadBits(CommonWord2, 24, 8);
|
||||
|
||||
ShaderLocalMemoryCrsSize = ReadBits(CommonWord3, 0, 24);
|
||||
OutputTopology = ReadBits(CommonWord3, 24, 4);
|
||||
|
||||
MaxOutputVertexCount = ReadBits(CommonWord4, 0, 12);
|
||||
StoreReqStart = ReadBits(CommonWord4, 12, 8);
|
||||
StoreReqEnd = ReadBits(CommonWord4, 24, 8);
|
||||
}
|
||||
|
||||
private static int ReadBits(uint Word, int Offset, int BitWidth)
|
||||
{
|
||||
uint Mask = (1u << BitWidth) - 1u;
|
||||
|
||||
return (int)((Word >> Offset) & Mask);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue