aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/Shader/ShaderHeader.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/ShaderHeader.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/ShaderHeader.cs')
-rw-r--r--Ryujinx.Graphics/Gal/Shader/ShaderHeader.cs73
1 files changed, 73 insertions, 0 deletions
diff --git a/Ryujinx.Graphics/Gal/Shader/ShaderHeader.cs b/Ryujinx.Graphics/Gal/Shader/ShaderHeader.cs
new file mode 100644
index 00000000..8e5057ed
--- /dev/null
+++ b/Ryujinx.Graphics/Gal/Shader/ShaderHeader.cs
@@ -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);
+ }
+ }
+} \ No newline at end of file