From 81f6120dfb0ddac28835a1125a9c2c38fbfae4a9 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Thu, 9 Aug 2018 14:03:50 -0300 Subject: [PATCH] Move clear values from VertexEndGl to ClearBuffers --- Ryujinx.Graphics/Gal/GalPipelineState.cs | 2 -- Ryujinx.Graphics/Gal/IGalRasterizer.cs | 6 +++++- Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs | 12 ------------ Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs | 12 +++++++++++- Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs | 19 ++++++++++++++----- Ryujinx.HLE/Gpu/Engines/NvGpuEngine3dReg.cs | 1 + 6 files changed, 31 insertions(+), 21 deletions(-) diff --git a/Ryujinx.Graphics/Gal/GalPipelineState.cs b/Ryujinx.Graphics/Gal/GalPipelineState.cs index a23b69093c..d1ffbe76de 100644 --- a/Ryujinx.Graphics/Gal/GalPipelineState.cs +++ b/Ryujinx.Graphics/Gal/GalPipelineState.cs @@ -28,11 +28,9 @@ public GalCullFace CullFace; public bool DepthTestEnabled; - public float DepthClear; public GalComparisonOp DepthFunc; public bool StencilTestEnabled; - public int StencilClear; public GalComparisonOp StencilBackFuncFunc; public int StencilBackFuncRef; diff --git a/Ryujinx.Graphics/Gal/IGalRasterizer.cs b/Ryujinx.Graphics/Gal/IGalRasterizer.cs index 022db021f0..89e50b1f1b 100644 --- a/Ryujinx.Graphics/Gal/IGalRasterizer.cs +++ b/Ryujinx.Graphics/Gal/IGalRasterizer.cs @@ -7,7 +7,11 @@ namespace Ryujinx.Graphics.Gal void LockCaches(); void UnlockCaches(); - void ClearBuffers(GalClearBufferFlags Flags); + void ClearBuffers( + GalClearBufferFlags Flags, + float Red, float Green, float Blue, float Alpha, + float Depth, + int Stencil); bool IsVboCached(long Key, long DataSize); diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs index 96fda2c875..349e1f85d7 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs @@ -67,11 +67,9 @@ namespace Ryujinx.Graphics.Gal.OpenGL CullFace = GalCullFace.Back, DepthTestEnabled = false, - DepthClear = 1f, DepthFunc = GalComparisonOp.Less, StencilTestEnabled = false, - StencilClear = 0, StencilBackFuncFunc = GalComparisonOp.Always, StencilBackFuncRef = 0, @@ -142,11 +140,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL Enable(EnableCap.DepthTest, S.DepthTestEnabled); } - if (S.DepthClear != O.DepthClear) - { - GL.ClearDepth(S.DepthClear); - } - if (S.DepthTestEnabled) { if (S.DepthFunc != O.DepthFunc) @@ -160,11 +153,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL Enable(EnableCap.StencilTest, S.StencilTestEnabled); } - if (S.StencilClear != O.StencilClear) - { - GL.ClearStencil(S.StencilClear); - } - if (S.StencilTestEnabled) { if (S.StencilBackFuncFunc != O.StencilBackFuncFunc || diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs index 23138dc0e6..0802147857 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs @@ -43,7 +43,11 @@ namespace Ryujinx.Graphics.Gal.OpenGL IboCache.Unlock(); } - public void ClearBuffers(GalClearBufferFlags Flags) + public void ClearBuffers( + GalClearBufferFlags Flags, + float Red, float Green, float Blue, float Alpha, + float Depth, + int Stencil) { ClearBufferMask Mask = ClearBufferMask.ColorBufferBit; @@ -63,6 +67,12 @@ namespace Ryujinx.Graphics.Gal.OpenGL Mask |= ClearBufferMask.StencilBufferBit; } + GL.ClearColor(Red, Green, Blue, Alpha); + + GL.ClearDepth(Depth); + + GL.ClearStencil(Stencil); + GL.Clear(Mask); GL.ColorMask(true, true, true, true); diff --git a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs index fe24a41bed..0576601f5e 100644 --- a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs +++ b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs @@ -131,9 +131,22 @@ namespace Ryujinx.HLE.Gpu.Engines GalClearBufferFlags Flags = (GalClearBufferFlags)(Arg0 & 0x3f); + float Red = ReadRegisterFloat(NvGpuEngine3dReg.ClearNColor + 0); + float Green = ReadRegisterFloat(NvGpuEngine3dReg.ClearNColor + 1); + float Blue = ReadRegisterFloat(NvGpuEngine3dReg.ClearNColor + 2); + float Alpha = ReadRegisterFloat(NvGpuEngine3dReg.ClearNColor + 3); + + float Depth = ReadRegisterFloat(NvGpuEngine3dReg.ClearDepth); + + int Stencil = ReadRegister(NvGpuEngine3dReg.ClearStencil); + SetFrameBuffer(Vmm, FbIndex); - Gpu.Renderer.Rasterizer.ClearBuffers(Flags); + Gpu.Renderer.Rasterizer.ClearBuffers( + Flags, + Red, Green, Blue, Alpha, + Depth, + Stencil); } private void SetFrameBuffer(NvGpuVmm Vmm, int FbIndex) @@ -287,8 +300,6 @@ namespace Ryujinx.HLE.Gpu.Engines { State.DepthTestEnabled = (ReadRegister(NvGpuEngine3dReg.DepthTestEnable) & 1) != 0; - State.DepthClear = ReadRegisterFloat(NvGpuEngine3dReg.ClearDepth); - if (State.DepthTestEnabled) { State.DepthFunc = (GalComparisonOp)ReadRegister(NvGpuEngine3dReg.DepthTestFunction); @@ -298,8 +309,6 @@ namespace Ryujinx.HLE.Gpu.Engines private void SetStencil(GalPipelineState State) { State.StencilTestEnabled = (ReadRegister(NvGpuEngine3dReg.StencilEnable) & 1) != 0; - - State.StencilClear = ReadRegister(NvGpuEngine3dReg.ClearStencil); if (State.StencilTestEnabled) { diff --git a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3dReg.cs b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3dReg.cs index e7dabe44a4..39a5ee8cfb 100644 --- a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3dReg.cs +++ b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3dReg.cs @@ -16,6 +16,7 @@ namespace Ryujinx.HLE.Gpu.Engines ViewportNVert = 0x301, VertexArrayFirst = 0x35d, VertexArrayCount = 0x35e, + ClearNColor = 0x360, ClearDepth = 0x364, ClearStencil = 0x368, StencilBackFuncRef = 0x3d5,