diff options
author | gdkchan <gab.dark.100@gmail.com> | 2020-05-27 20:03:07 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-28 09:03:07 +1000 |
commit | a15b951721d7c52c30a8e8864e91353ec6fc65f4 (patch) | |
tree | daba23b1f6a22f4c72faa5268a73029e9fc665f7 /Ryujinx.Graphics.OpenGL/Pipeline.cs | |
parent | 83d94b21d077e2d31faee74711ff38e0c0499afa (diff) |
Fix wrong face culling once and for all (#1277)
* Viewport swizzle support on NV and clip origin
* Initialize default viewport swizzle state, emulate viewport swizzle on shaders when not supported
* Address PR feedback
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Pipeline.cs')
-rw-r--r-- | Ryujinx.Graphics.OpenGL/Pipeline.cs | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Pipeline.cs b/Ryujinx.Graphics.OpenGL/Pipeline.cs index ee4ce298..6c511e09 100644 --- a/Ryujinx.Graphics.OpenGL/Pipeline.cs +++ b/Ryujinx.Graphics.OpenGL/Pipeline.cs @@ -650,6 +650,13 @@ namespace Ryujinx.Graphics.OpenGL _vertexArray.SetIndexBuffer(buffer.Handle); } + public void SetOrigin(Origin origin) + { + ClipOrigin clipOrigin = origin == Origin.UpperLeft ? ClipOrigin.UpperLeft : ClipOrigin.LowerLeft; + + SetOrigin(clipOrigin); + } + public void SetPointSize(float size) { GL.PointSize(size); @@ -854,8 +861,6 @@ namespace Ryujinx.Graphics.OpenGL public void SetViewports(int first, ReadOnlySpan<Viewport> viewports) { - bool flipY = false; - float[] viewportArray = new float[viewports.Length * 4]; double[] depthRangeArray = new double[viewports.Length * 2]; @@ -869,17 +874,14 @@ namespace Ryujinx.Graphics.OpenGL viewportArray[viewportElemIndex + 0] = viewport.Region.X; viewportArray[viewportElemIndex + 1] = viewport.Region.Y; - // OpenGL does not support per-viewport flipping, so - // instead we decide that based on the viewport 0 value. - // It will apply to all viewports. - if (index == 0) + if (HwCapabilities.SupportsViewportSwizzle) { - flipY = viewport.Region.Height < 0; - } - - if (viewport.SwizzleY == ViewportSwizzle.NegativeY) - { - flipY = !flipY; + GL.NV.ViewportSwizzle( + index, + viewport.SwizzleX.Convert(), + viewport.SwizzleY.Convert(), + viewport.SwizzleZ.Convert(), + viewport.SwizzleW.Convert()); } viewportArray[viewportElemIndex + 2] = MathF.Abs(viewport.Region.Width); @@ -892,8 +894,6 @@ namespace Ryujinx.Graphics.OpenGL GL.ViewportArray(first, viewports.Length, viewportArray); GL.DepthRangeArray(first, viewports.Length, depthRangeArray); - - SetOrigin(flipY ? ClipOrigin.UpperLeft : ClipOrigin.LowerLeft); } public void TextureBarrier() |