From ab6bf4ec65af185ecc93c4a5baf4940d32e3d881 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Fri, 13 Apr 2018 10:41:49 -0300 Subject: [PATCH] [GPU] Fix alpha blending --- Ryujinx.Graphics/Gal/GalBlendEquation.cs | 10 +-- Ryujinx.Graphics/Gal/GalBlendFactor.cs | 38 ++++++------ .../Gal/OpenGL/OGLEnumConverter.cs | 61 ++++++++++++++++++- Ryujinx.Graphics/Gpu/NvGpuEngine3d.cs | 19 +++--- Ryujinx.Graphics/Gpu/NvGpuEngine3dReg.cs | 8 +++ 5 files changed, 100 insertions(+), 36 deletions(-) diff --git a/Ryujinx.Graphics/Gal/GalBlendEquation.cs b/Ryujinx.Graphics/Gal/GalBlendEquation.cs index d9f8e79934..7fd4ba5fa6 100644 --- a/Ryujinx.Graphics/Gal/GalBlendEquation.cs +++ b/Ryujinx.Graphics/Gal/GalBlendEquation.cs @@ -2,10 +2,10 @@ namespace Ryujinx.Graphics.Gal { public enum GalBlendEquation { - FuncAdd = 0x8006, - Min = 0x8007, - Max = 0x8008, - FuncSubtract = 0x800a, - FuncReverseSubtract = 0x800b + FuncAdd = 1, + FuncSubtract = 2, + FuncReverseSubtract = 3, + Min = 4, + Max = 5 } } \ No newline at end of file diff --git a/Ryujinx.Graphics/Gal/GalBlendFactor.cs b/Ryujinx.Graphics/Gal/GalBlendFactor.cs index de7d45fd48..7237c4edac 100644 --- a/Ryujinx.Graphics/Gal/GalBlendFactor.cs +++ b/Ryujinx.Graphics/Gal/GalBlendFactor.cs @@ -2,24 +2,24 @@ namespace Ryujinx.Graphics.Gal { public enum GalBlendFactor { - Zero = 0x4000, - One = 0x4001, - SrcColor = 0x4300, - OneMinusSrcColor = 0x4301, - SrcAlpha = 0x4302, - OneMinusSrcAlpha = 0x4303, - DstAlpha = 0x4304, - OneMinusDstAlpha = 0x4305, - DstColor = 0x4306, - OneMinusDstColor = 0x4307, - SrcAlphaSaturate = 0x4308, - ConstantColor = 0xc001, - OneMinusConstantColor = 0xc002, - ConstantAlpha = 0xc003, - OneMinusConstantAlpha = 0xc004, - Src1Color = 0xc900, - OneMinusSrc1Color = 0xc901, - Src1Alpha = 0xc902, - OneMinusSrc1Alpha = 0xc903 + Zero = 0x1, + One = 0x2, + SrcColor = 0x3, + OneMinusSrcColor = 0x4, + SrcAlpha = 0x5, + OneMinusSrcAlpha = 0x6, + DstAlpha = 0x7, + OneMinusDstAlpha = 0x8, + DstColor = 0x9, + OneMinusDstColor = 0xa, + SrcAlphaSaturate = 0xb, + Src1Color = 0x10, + OneMinusSrc1Color = 0x11, + Src1Alpha = 0x12, + OneMinusSrc1Alpha = 0x13, + ConstantColor = 0x61, + OneMinusConstantColor = 0x62, + ConstantAlpha = 0x63, + OneMinusConstantAlpha = 0x64 } } \ No newline at end of file diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs index 17bf629166..4cc0a03975 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLEnumConverter.cs @@ -127,17 +127,72 @@ namespace Ryujinx.Graphics.Gal.OpenGL public static BlendEquationMode GetBlendEquation(GalBlendEquation BlendEquation) { - return (BlendEquationMode)BlendEquation; + switch (BlendEquation) + { + case GalBlendEquation.FuncAdd: return BlendEquationMode.FuncAdd; + case GalBlendEquation.FuncSubtract: return BlendEquationMode.FuncSubtract; + case GalBlendEquation.FuncReverseSubtract: return BlendEquationMode.FuncReverseSubtract; + case GalBlendEquation.Min: return BlendEquationMode.Min; + case GalBlendEquation.Max: return BlendEquationMode.Max; + } + + throw new ArgumentException(nameof(BlendEquation)); } public static BlendingFactorSrc GetBlendFactorSrc(GalBlendFactor BlendFactor) { - return (BlendingFactorSrc)(BlendFactor - 0x4000); + switch (BlendFactor) + { + case GalBlendFactor.Zero: return BlendingFactorSrc.Zero; + case GalBlendFactor.One: return BlendingFactorSrc.One; + case GalBlendFactor.SrcColor: return BlendingFactorSrc.SrcColor; + case GalBlendFactor.OneMinusSrcColor: return BlendingFactorSrc.OneMinusSrcColor; + case GalBlendFactor.DstColor: return BlendingFactorSrc.DstColor; + case GalBlendFactor.OneMinusDstColor: return BlendingFactorSrc.OneMinusDstColor; + case GalBlendFactor.SrcAlpha: return BlendingFactorSrc.SrcAlpha; + case GalBlendFactor.OneMinusSrcAlpha: return BlendingFactorSrc.OneMinusSrcAlpha; + case GalBlendFactor.DstAlpha: return BlendingFactorSrc.DstAlpha; + case GalBlendFactor.OneMinusDstAlpha: return BlendingFactorSrc.OneMinusDstAlpha; + case GalBlendFactor.ConstantColor: return BlendingFactorSrc.ConstantColor; + case GalBlendFactor.OneMinusConstantColor: return BlendingFactorSrc.OneMinusConstantColor; + case GalBlendFactor.ConstantAlpha: return BlendingFactorSrc.ConstantAlpha; + case GalBlendFactor.OneMinusConstantAlpha: return BlendingFactorSrc.OneMinusConstantAlpha; + case GalBlendFactor.SrcAlphaSaturate: return BlendingFactorSrc.SrcAlphaSaturate; + case GalBlendFactor.Src1Color: return BlendingFactorSrc.Src1Color; + case GalBlendFactor.OneMinusSrc1Color: return BlendingFactorSrc.OneMinusSrc1Color; + case GalBlendFactor.Src1Alpha: return BlendingFactorSrc.Src1Alpha; + case GalBlendFactor.OneMinusSrc1Alpha: return BlendingFactorSrc.OneMinusSrc1Alpha; + } + + throw new ArgumentException(nameof(BlendFactor)); } public static BlendingFactorDest GetBlendFactorDst(GalBlendFactor BlendFactor) { - return (BlendingFactorDest)(BlendFactor - 0x4000); + switch (BlendFactor) + { + case GalBlendFactor.Zero: return BlendingFactorDest.Zero; + case GalBlendFactor.One: return BlendingFactorDest.One; + case GalBlendFactor.SrcColor: return BlendingFactorDest.SrcColor; + case GalBlendFactor.OneMinusSrcColor: return BlendingFactorDest.OneMinusSrcColor; + case GalBlendFactor.DstColor: return BlendingFactorDest.DstColor; + case GalBlendFactor.OneMinusDstColor: return BlendingFactorDest.OneMinusDstColor; + case GalBlendFactor.SrcAlpha: return BlendingFactorDest.SrcAlpha; + case GalBlendFactor.OneMinusSrcAlpha: return BlendingFactorDest.OneMinusSrcAlpha; + case GalBlendFactor.DstAlpha: return BlendingFactorDest.DstAlpha; + case GalBlendFactor.OneMinusDstAlpha: return BlendingFactorDest.OneMinusDstAlpha; + case GalBlendFactor.ConstantColor: return BlendingFactorDest.ConstantColor; + case GalBlendFactor.OneMinusConstantColor: return BlendingFactorDest.OneMinusConstantColor; + case GalBlendFactor.ConstantAlpha: return BlendingFactorDest.ConstantAlpha; + case GalBlendFactor.OneMinusConstantAlpha: return BlendingFactorDest.OneMinusConstantAlpha; + case GalBlendFactor.SrcAlphaSaturate: return BlendingFactorDest.SrcAlphaSaturate; + case GalBlendFactor.Src1Color: return BlendingFactorDest.Src1Color; + case GalBlendFactor.OneMinusSrc1Color: return BlendingFactorDest.OneMinusSrc1Color; + case GalBlendFactor.Src1Alpha: return BlendingFactorDest.Src1Alpha; + case GalBlendFactor.OneMinusSrc1Alpha: return BlendingFactorDest.OneMinusSrc1Alpha; + } + + throw new ArgumentException(nameof(BlendFactor)); } } } \ No newline at end of file diff --git a/Ryujinx.Graphics/Gpu/NvGpuEngine3d.cs b/Ryujinx.Graphics/Gpu/NvGpuEngine3d.cs index 4869886b9a..1778e8fc1a 100644 --- a/Ryujinx.Graphics/Gpu/NvGpuEngine3d.cs +++ b/Ryujinx.Graphics/Gpu/NvGpuEngine3d.cs @@ -173,23 +173,24 @@ namespace Ryujinx.Graphics.Gpu private void SetAlphaBlending() { - bool BlendEnableMaster = (ReadRegister(NvGpuEngine3dReg.BlendEnableMaster) & 1) != 0; + //TODO: Support independent blend properly. + bool Enable = (ReadRegister(NvGpuEngine3dReg.IBlendEnable) & 1) != 0; - Gpu.Renderer.SetBlendEnable(BlendEnableMaster); + Gpu.Renderer.SetBlendEnable(Enable); - bool BlendSeparateAlpha = (ReadRegister(NvGpuEngine3dReg.BlendSeparateAlpha) & 1) != 0; + bool BlendSeparateAlpha = (ReadRegister(NvGpuEngine3dReg.IBlendNSeparateAlpha) & 1) != 0; - GalBlendEquation EquationRgb = (GalBlendEquation)ReadRegister(NvGpuEngine3dReg.BlendEquationRgb); + GalBlendEquation EquationRgb = (GalBlendEquation)ReadRegister(NvGpuEngine3dReg.IBlendNEquationRgb); - GalBlendFactor FuncSrcRgb = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.BlendFuncSrcRgb); - GalBlendFactor FuncDstRgb = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.BlendFuncDstRgb); + GalBlendFactor FuncSrcRgb = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.IBlendNFuncSrcRgb); + GalBlendFactor FuncDstRgb = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.IBlendNFuncDstRgb); if (BlendSeparateAlpha) { - GalBlendEquation EquationAlpha = (GalBlendEquation)ReadRegister(NvGpuEngine3dReg.BlendEquationAlpha); + GalBlendEquation EquationAlpha = (GalBlendEquation)ReadRegister(NvGpuEngine3dReg.IBlendNEquationAlpha); - GalBlendFactor FuncSrcAlpha = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.BlendFuncSrcAlpha); - GalBlendFactor FuncDstAlpha = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.BlendFuncDstAlpha); + GalBlendFactor FuncSrcAlpha = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.IBlendNFuncSrcAlpha); + GalBlendFactor FuncDstAlpha = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.IBlendNFuncDstAlpha); Gpu.Renderer.SetBlendSeparate( EquationRgb, diff --git a/Ryujinx.Graphics/Gpu/NvGpuEngine3dReg.cs b/Ryujinx.Graphics/Gpu/NvGpuEngine3dReg.cs index 4bba9abe0d..cb0b9d983d 100644 --- a/Ryujinx.Graphics/Gpu/NvGpuEngine3dReg.cs +++ b/Ryujinx.Graphics/Gpu/NvGpuEngine3dReg.cs @@ -7,6 +7,7 @@ namespace Ryujinx.Graphics.Gpu FrameBufferNHeight = 0x203, FrameBufferNFormat = 0x204, VertexAttribNFormat = 0x458, + IBlendEnable = 0x4b9, BlendSeparateAlpha = 0x4cf, BlendEquationRgb = 0x4d0, BlendFuncSrcRgb = 0x4d1, @@ -31,6 +32,13 @@ namespace Ryujinx.Graphics.Gpu VertexArrayNControl = 0x700, VertexArrayNAddress = 0x701, VertexArrayNDivisor = 0x703, + IBlendNSeparateAlpha = 0x780, + IBlendNEquationRgb = 0x781, + IBlendNFuncSrcRgb = 0x782, + IBlendNFuncDstRgb = 0x783, + IBlendNEquationAlpha = 0x784, + IBlendNFuncSrcAlpha = 0x785, + IBlendNFuncDstAlpha = 0x786, VertexArrayNEndAddr = 0x7c0, ShaderNControl = 0x800, ShaderNOffset = 0x801,