aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/OpenGL/OGLShader.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/OpenGL/OGLShader.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/OpenGL/OGLShader.cs')
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs22
1 files changed, 16 insertions, 6 deletions
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs
index ad717755..fe98aa09 100644
--- a/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs
+++ b/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs
@@ -118,20 +118,20 @@ namespace Ryujinx.Graphics.Gal.OpenGL
if (IsDualVp)
{
- ShaderDumper.Dump(Memory, Position + 0x50, Type, "a");
- ShaderDumper.Dump(Memory, PositionB + 0x50, Type, "b");
+ ShaderDumper.Dump(Memory, Position, Type, "a");
+ ShaderDumper.Dump(Memory, PositionB, Type, "b");
Program = Decompiler.Decompile(
Memory,
- Position + 0x50,
- PositionB + 0x50,
+ Position,
+ PositionB,
Type);
}
else
{
- ShaderDumper.Dump(Memory, Position + 0x50, Type);
+ ShaderDumper.Dump(Memory, Position, Type);
- Program = Decompiler.Decompile(Memory, Position + 0x50, Type);
+ Program = Decompiler.Decompile(Memory, Position, Type);
}
return new ShaderStage(
@@ -198,6 +198,16 @@ namespace Ryujinx.Graphics.Gal.OpenGL
private void Bind(ShaderStage Stage)
{
+ if (Stage.Type == GalShaderType.Geometry)
+ {
+ //Enhanced layouts are required for Geometry shaders
+ //skip this stage if current driver has no ARB_enhanced_layouts
+ if (!OGLExtension.HasEnhancedLayouts())
+ {
+ return;
+ }
+ }
+
switch (Stage.Type)
{
case GalShaderType.Vertex: Current.Vertex = Stage; break;