From f0a49a1c94c74886f4cfb35c35d7deec82f6bd8f Mon Sep 17 00:00:00 2001 From: gdkchan Date: Thu, 25 Oct 2018 18:30:09 -0300 Subject: [PATCH] Fix Color Mask values (#473) * Fix color mask common, set default value on first color mask register * Missing check * Better exception messages * Address PR feedback * Add fixme as per review feedback --- Ryujinx.Graphics/Gal/GalPipelineState.cs | 44 ++++++++++----------- Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs | 46 ++++++++++++++-------- Ryujinx.Graphics/NvGpuEngine3d.cs | 13 +++--- Ryujinx.Graphics/NvGpuEngine3dReg.cs | 2 +- 4 files changed, 59 insertions(+), 46 deletions(-) diff --git a/Ryujinx.Graphics/Gal/GalPipelineState.cs b/Ryujinx.Graphics/Gal/GalPipelineState.cs index 17f52dd6..f50f1032 100644 --- a/Ryujinx.Graphics/Gal/GalPipelineState.cs +++ b/Ryujinx.Graphics/Gal/GalPipelineState.cs @@ -37,11 +37,11 @@ public GalFrontFace FrontFace; - public bool CullFaceEnabled; + public bool CullFaceEnabled; public GalCullFace CullFace; - public bool DepthTestEnabled; - public bool DepthWriteEnabled; + public bool DepthTestEnabled; + public bool DepthWriteEnabled; public GalComparisonOp DepthFunc; public float DepthRangeNear; public float DepthRangeFar; @@ -50,31 +50,31 @@ public bool StencilTwoSideEnabled; public GalComparisonOp StencilBackFuncFunc; - public int StencilBackFuncRef; - public uint StencilBackFuncMask; - public GalStencilOp StencilBackOpFail; - public GalStencilOp StencilBackOpZFail; - public GalStencilOp StencilBackOpZPass; - public uint StencilBackMask; + public int StencilBackFuncRef; + public uint StencilBackFuncMask; + public GalStencilOp StencilBackOpFail; + public GalStencilOp StencilBackOpZFail; + public GalStencilOp StencilBackOpZPass; + public uint StencilBackMask; public GalComparisonOp StencilFrontFuncFunc; - public int StencilFrontFuncRef; - public uint StencilFrontFuncMask; - public GalStencilOp StencilFrontOpFail; - public GalStencilOp StencilFrontOpZFail; - public GalStencilOp StencilFrontOpZPass; - public uint StencilFrontMask; + public int StencilFrontFuncRef; + public uint StencilFrontFuncMask; + public GalStencilOp StencilFrontOpFail; + public GalStencilOp StencilFrontOpZFail; + public GalStencilOp StencilFrontOpZPass; + public uint StencilFrontMask; - public bool BlendEnabled; - public bool BlendSeparateAlpha; + public bool BlendEnabled; + public bool BlendSeparateAlpha; public GalBlendEquation BlendEquationRgb; - public GalBlendFactor BlendFuncSrcRgb; - public GalBlendFactor BlendFuncDstRgb; + public GalBlendFactor BlendFuncSrcRgb; + public GalBlendFactor BlendFuncDstRgb; public GalBlendEquation BlendEquationAlpha; - public GalBlendFactor BlendFuncSrcAlpha; - public GalBlendFactor BlendFuncDstAlpha; + 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 656d8e8e..6e1cabba 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLPipeline.cs @@ -131,8 +131,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL BlendFuncSrcAlpha = GalBlendFactor.One, BlendFuncDstAlpha = GalBlendFactor.Zero, - ColorMask = ColorMaskRgba.Default, - PrimitiveRestartEnabled = false, PrimitiveRestartIndex = 0 }; @@ -316,16 +314,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.ColorMaskCommon != Old.ColorMaskCommon || !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); + } } } @@ -477,7 +489,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL { if (!Dict.TryGetValue(Attrib.Size, out VertexAttribPointerType Type)) { - throw new NotImplementedException("Unsupported size \"" + Attrib.Size + "\" on type \"" + Attrib.Type + "\"!"); + ThrowUnsupportedAttrib(Attrib); } return Type; @@ -485,15 +497,10 @@ namespace Ryujinx.Graphics.Gal.OpenGL private unsafe static void SetConstAttrib(GalVertexAttrib Attrib) { - void Unsupported() - { - throw new NotImplementedException("Constant attribute " + Attrib.Size + " not implemented!"); - } - if (Attrib.Size == GalVertexAttribSize._10_10_10_2 || Attrib.Size == GalVertexAttribSize._11_11_10) { - Unsupported(); + ThrowUnsupportedAttrib(Attrib); } if (Attrib.Type == GalVertexAttribType.Unorm) @@ -611,11 +618,16 @@ namespace Ryujinx.Graphics.Gal.OpenGL GL.VertexAttrib4(Attrib.Index, (float*)Attrib.Pointer); break; - default: Unsupported(); break; + default: ThrowUnsupportedAttrib(Attrib); break; } } } + private static void ThrowUnsupportedAttrib(GalVertexAttrib Attrib) + { + throw new NotImplementedException("Unsupported size \"" + Attrib.Size + "\" on type \"" + Attrib.Type + "\"!"); + } + private void Enable(EnableCap Cap, bool Enabled) { if (Enabled) diff --git a/Ryujinx.Graphics/NvGpuEngine3d.cs b/Ryujinx.Graphics/NvGpuEngine3d.cs index e8ded889..7d2b2b43 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. + //FIXME: Is this correct? + WriteRegister(NvGpuEngine3dReg.ColorMaskN, 0x1111); } public void CallMethod(NvGpuVmm Vmm, NvGpuPBEntry PBEntry) @@ -420,16 +424,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 6ea22654..6c522eac 100644 --- a/Ryujinx.Graphics/NvGpuEngine3dReg.cs +++ b/Ryujinx.Graphics/NvGpuEngine3dReg.cs @@ -25,7 +25,7 @@ namespace Ryujinx.Graphics StencilBackFuncRef = 0x3d5, StencilBackMask = 0x3d6, StencilBackFuncMask = 0x3d7, - ColorMask = 0x3e4, + ColorMaskCommon = 0x3e4, RTSeparateFragData = 0x3eb, ZetaAddress = 0x3f8, ZetaFormat = 0x3fa,