From e872182f7be6fad707d7a150c5b6096e09426b09 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sun, 21 Oct 2018 22:09:47 -0300 Subject: [PATCH] Fix color mask common, set default value on first color mask register --- Ryujinx.Graphics/Gal/GalPipelineState.cs | 2 +- Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs | 30 +++++++++++++++------- Ryujinx.Graphics/NvGpuEngine3d.cs | 13 +++++----- Ryujinx.Graphics/NvGpuEngine3dReg.cs | 2 +- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/Ryujinx.Graphics/Gal/GalPipelineState.cs b/Ryujinx.Graphics/Gal/GalPipelineState.cs index 56b0fbde33..74457727aa 100644 --- a/Ryujinx.Graphics/Gal/GalPipelineState.cs +++ b/Ryujinx.Graphics/Gal/GalPipelineState.cs @@ -72,7 +72,7 @@ public GalBlendFactor BlendFuncSrcAlpha; public GalBlendFactor BlendFuncDstAlpha; - public ColorMaskRgba ColorMask; + public bool ColorMaskCommon; public ColorMaskRgba[] ColorMasks; public bool PrimitiveRestartEnabled; diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs index 00699641fd..63ded002d6 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs @@ -129,8 +129,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL BlendFuncSrcAlpha = GalBlendFactor.One, BlendFuncDstAlpha = GalBlendFactor.Zero, - ColorMask = ColorMaskRgba.Default, - PrimitiveRestartEnabled = false, PrimitiveRestartIndex = 0 }; @@ -308,16 +306,30 @@ namespace Ryujinx.Graphics.Gal.OpenGL } } - for (int Index = 0; Index < GalPipelineState.RenderTargetsCount; Index++) + if (New.ColorMaskCommon) { - if (!New.ColorMasks[Index].Equals(Old.ColorMasks[Index])) + if (!New.ColorMasks[0].Equals(Old.ColorMasks[0])) { GL.ColorMask( - Index, - New.ColorMasks[Index].Red, - New.ColorMasks[Index].Green, - New.ColorMasks[Index].Blue, - New.ColorMasks[Index].Alpha); + New.ColorMasks[0].Red, + New.ColorMasks[0].Green, + New.ColorMasks[0].Blue, + New.ColorMasks[0].Alpha); + } + } + else + { + for (int Index = 0; Index < GalPipelineState.RenderTargetsCount; Index++) + { + if (!New.ColorMasks[Index].Equals(Old.ColorMasks[Index])) + { + GL.ColorMask( + Index, + New.ColorMasks[Index].Red, + New.ColorMasks[Index].Green, + New.ColorMasks[Index].Blue, + New.ColorMasks[Index].Alpha); + } } } diff --git a/Ryujinx.Graphics/NvGpuEngine3d.cs b/Ryujinx.Graphics/NvGpuEngine3d.cs index fd15d0b6a2..b6cadf01bb 100644 --- a/Ryujinx.Graphics/NvGpuEngine3d.cs +++ b/Ryujinx.Graphics/NvGpuEngine3d.cs @@ -64,6 +64,10 @@ namespace Ryujinx.Graphics { UploadedKeys[i] = new List(); } + + //Ensure that all components are enabled by default. + //Is this correct? + WriteRegister(NvGpuEngine3dReg.ColorMaskN, 0x1111); } public void CallMethod(NvGpuVmm Vmm, NvGpuPBEntry PBEntry) @@ -417,16 +421,13 @@ namespace Ryujinx.Graphics private void SetColorMask(GalPipelineState State) { - int ColorMask = ReadRegister(NvGpuEngine3dReg.ColorMask); + bool ColorMaskCommon = ReadRegisterBool(NvGpuEngine3dReg.ColorMaskCommon); - State.ColorMask.Red = ((ColorMask >> 0) & 0xf) != 0; - State.ColorMask.Green = ((ColorMask >> 4) & 0xf) != 0; - State.ColorMask.Blue = ((ColorMask >> 8) & 0xf) != 0; - State.ColorMask.Alpha = ((ColorMask >> 12) & 0xf) != 0; + State.ColorMaskCommon = ColorMaskCommon; for (int Index = 0; Index < GalPipelineState.RenderTargetsCount; Index++) { - ColorMask = ReadRegister(NvGpuEngine3dReg.ColorMaskN + Index); + int ColorMask = ReadRegister(NvGpuEngine3dReg.ColorMaskN + (ColorMaskCommon ? 0 : Index)); State.ColorMasks[Index].Red = ((ColorMask >> 0) & 0xf) != 0; State.ColorMasks[Index].Green = ((ColorMask >> 4) & 0xf) != 0; diff --git a/Ryujinx.Graphics/NvGpuEngine3dReg.cs b/Ryujinx.Graphics/NvGpuEngine3dReg.cs index ef74e4f675..24fca8089f 100644 --- a/Ryujinx.Graphics/NvGpuEngine3dReg.cs +++ b/Ryujinx.Graphics/NvGpuEngine3dReg.cs @@ -23,7 +23,7 @@ namespace Ryujinx.Graphics StencilBackFuncRef = 0x3d5, StencilBackMask = 0x3d6, StencilBackFuncMask = 0x3d7, - ColorMask = 0x3e4, + ColorMaskCommon = 0x3e4, RTSeparateFragData = 0x3eb, ZetaAddress = 0x3f8, ZetaFormat = 0x3fa,