[GPU] Fix alpha blending
This commit is contained in:
parent
120fa26392
commit
ab6bf4ec65
5 changed files with 100 additions and 36 deletions
|
@ -2,10 +2,10 @@ namespace Ryujinx.Graphics.Gal
|
||||||
{
|
{
|
||||||
public enum GalBlendEquation
|
public enum GalBlendEquation
|
||||||
{
|
{
|
||||||
FuncAdd = 0x8006,
|
FuncAdd = 1,
|
||||||
Min = 0x8007,
|
FuncSubtract = 2,
|
||||||
Max = 0x8008,
|
FuncReverseSubtract = 3,
|
||||||
FuncSubtract = 0x800a,
|
Min = 4,
|
||||||
FuncReverseSubtract = 0x800b
|
Max = 5
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,24 +2,24 @@ namespace Ryujinx.Graphics.Gal
|
||||||
{
|
{
|
||||||
public enum GalBlendFactor
|
public enum GalBlendFactor
|
||||||
{
|
{
|
||||||
Zero = 0x4000,
|
Zero = 0x1,
|
||||||
One = 0x4001,
|
One = 0x2,
|
||||||
SrcColor = 0x4300,
|
SrcColor = 0x3,
|
||||||
OneMinusSrcColor = 0x4301,
|
OneMinusSrcColor = 0x4,
|
||||||
SrcAlpha = 0x4302,
|
SrcAlpha = 0x5,
|
||||||
OneMinusSrcAlpha = 0x4303,
|
OneMinusSrcAlpha = 0x6,
|
||||||
DstAlpha = 0x4304,
|
DstAlpha = 0x7,
|
||||||
OneMinusDstAlpha = 0x4305,
|
OneMinusDstAlpha = 0x8,
|
||||||
DstColor = 0x4306,
|
DstColor = 0x9,
|
||||||
OneMinusDstColor = 0x4307,
|
OneMinusDstColor = 0xa,
|
||||||
SrcAlphaSaturate = 0x4308,
|
SrcAlphaSaturate = 0xb,
|
||||||
ConstantColor = 0xc001,
|
Src1Color = 0x10,
|
||||||
OneMinusConstantColor = 0xc002,
|
OneMinusSrc1Color = 0x11,
|
||||||
ConstantAlpha = 0xc003,
|
Src1Alpha = 0x12,
|
||||||
OneMinusConstantAlpha = 0xc004,
|
OneMinusSrc1Alpha = 0x13,
|
||||||
Src1Color = 0xc900,
|
ConstantColor = 0x61,
|
||||||
OneMinusSrc1Color = 0xc901,
|
OneMinusConstantColor = 0x62,
|
||||||
Src1Alpha = 0xc902,
|
ConstantAlpha = 0x63,
|
||||||
OneMinusSrc1Alpha = 0xc903
|
OneMinusConstantAlpha = 0x64
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -127,17 +127,72 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
|
|
||||||
public static BlendEquationMode GetBlendEquation(GalBlendEquation BlendEquation)
|
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)
|
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)
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -173,23 +173,24 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
|
|
||||||
private void SetAlphaBlending()
|
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 FuncSrcRgb = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.IBlendNFuncSrcRgb);
|
||||||
GalBlendFactor FuncDstRgb = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.BlendFuncDstRgb);
|
GalBlendFactor FuncDstRgb = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.IBlendNFuncDstRgb);
|
||||||
|
|
||||||
if (BlendSeparateAlpha)
|
if (BlendSeparateAlpha)
|
||||||
{
|
{
|
||||||
GalBlendEquation EquationAlpha = (GalBlendEquation)ReadRegister(NvGpuEngine3dReg.BlendEquationAlpha);
|
GalBlendEquation EquationAlpha = (GalBlendEquation)ReadRegister(NvGpuEngine3dReg.IBlendNEquationAlpha);
|
||||||
|
|
||||||
GalBlendFactor FuncSrcAlpha = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.BlendFuncSrcAlpha);
|
GalBlendFactor FuncSrcAlpha = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.IBlendNFuncSrcAlpha);
|
||||||
GalBlendFactor FuncDstAlpha = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.BlendFuncDstAlpha);
|
GalBlendFactor FuncDstAlpha = (GalBlendFactor)ReadRegister(NvGpuEngine3dReg.IBlendNFuncDstAlpha);
|
||||||
|
|
||||||
Gpu.Renderer.SetBlendSeparate(
|
Gpu.Renderer.SetBlendSeparate(
|
||||||
EquationRgb,
|
EquationRgb,
|
||||||
|
|
|
@ -7,6 +7,7 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
FrameBufferNHeight = 0x203,
|
FrameBufferNHeight = 0x203,
|
||||||
FrameBufferNFormat = 0x204,
|
FrameBufferNFormat = 0x204,
|
||||||
VertexAttribNFormat = 0x458,
|
VertexAttribNFormat = 0x458,
|
||||||
|
IBlendEnable = 0x4b9,
|
||||||
BlendSeparateAlpha = 0x4cf,
|
BlendSeparateAlpha = 0x4cf,
|
||||||
BlendEquationRgb = 0x4d0,
|
BlendEquationRgb = 0x4d0,
|
||||||
BlendFuncSrcRgb = 0x4d1,
|
BlendFuncSrcRgb = 0x4d1,
|
||||||
|
@ -31,6 +32,13 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
VertexArrayNControl = 0x700,
|
VertexArrayNControl = 0x700,
|
||||||
VertexArrayNAddress = 0x701,
|
VertexArrayNAddress = 0x701,
|
||||||
VertexArrayNDivisor = 0x703,
|
VertexArrayNDivisor = 0x703,
|
||||||
|
IBlendNSeparateAlpha = 0x780,
|
||||||
|
IBlendNEquationRgb = 0x781,
|
||||||
|
IBlendNFuncSrcRgb = 0x782,
|
||||||
|
IBlendNFuncDstRgb = 0x783,
|
||||||
|
IBlendNEquationAlpha = 0x784,
|
||||||
|
IBlendNFuncSrcAlpha = 0x785,
|
||||||
|
IBlendNFuncDstAlpha = 0x786,
|
||||||
VertexArrayNEndAddr = 0x7c0,
|
VertexArrayNEndAddr = 0x7c0,
|
||||||
ShaderNControl = 0x800,
|
ShaderNControl = 0x800,
|
||||||
ShaderNOffset = 0x801,
|
ShaderNOffset = 0x801,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue