aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/OpenGL
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
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')
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLExtension.cs43
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs22
2 files changed, 59 insertions, 6 deletions
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLExtension.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLExtension.cs
new file mode 100644
index 00000000..69fce6d3
--- /dev/null
+++ b/Ryujinx.Graphics/Gal/OpenGL/OGLExtension.cs
@@ -0,0 +1,43 @@
+using OpenTK.Graphics.OpenGL;
+
+namespace Ryujinx.Graphics.Gal.OpenGL
+{
+ static class OGLExtension
+ {
+ private static bool Initialized = false;
+
+ private static bool EnhancedLayouts;
+
+ public static bool HasEnhancedLayouts()
+ {
+ EnsureInitialized();
+
+ return EnhancedLayouts;
+ }
+
+ private static void EnsureInitialized()
+ {
+ if (Initialized)
+ {
+ return;
+ }
+
+ EnhancedLayouts = HasExtension("GL_ARB_enhanced_layouts");
+ }
+
+ private static bool HasExtension(string Name)
+ {
+ int NumExtensions = GL.GetInteger(GetPName.NumExtensions);
+
+ for (int Extension = 0; Extension < NumExtensions; Extension++)
+ {
+ if (GL.GetString(StringNameIndexed.Extensions, Extension) == Name)
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+} \ No newline at end of file
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;