From c10d9ea87a46fe5a86f80ccd896062875056cf5b Mon Sep 17 00:00:00 2001 From: NeoBrainX Date: Thu, 28 Mar 2013 22:59:42 +0100 Subject: [PATCH] Clean up blending code a bit. --- Source/Core/VideoCommon/Src/BPMemory.h | 11 +++++++++++ .../Plugins/Plugin_VideoDX11/Src/Render.cpp | 6 +++--- Source/Plugins/Plugin_VideoDX9/Src/Render.cpp | 4 ++-- Source/Plugins/Plugin_VideoOGL/Src/Render.cpp | 19 +++++++++---------- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/Source/Core/VideoCommon/Src/BPMemory.h b/Source/Core/VideoCommon/Src/BPMemory.h index 1a29439b36..f0d0a502ed 100644 --- a/Source/Core/VideoCommon/Src/BPMemory.h +++ b/Source/Core/VideoCommon/Src/BPMemory.h @@ -621,6 +621,17 @@ union X10Y10 // Framebuffer/pixel stuff (incl fog) +#define GX_BL_ZERO 0 +#define GX_BL_ONE 1 +#define GX_BL_SRCCLR 2 // for dst factor +#define GX_BL_INVSRCCLR 3 // for dst factor +#define GX_BL_SRCALPHA 4 +#define GX_BL_INVSRCALPHA 5 +#define GX_BL_DSTALPHA 6 +#define GX_BL_INVDSTALPHA 7 +#define GX_BL_DSTCLR GX_BL_SRCCLR // for src factor +#define GX_BL_INVDSTCLR GX_BL_INVSRCCLR // for src factor + union BlendMode { struct diff --git a/Source/Plugins/Plugin_VideoDX11/Src/Render.cpp b/Source/Plugins/Plugin_VideoDX11/Src/Render.cpp index 2dcfcd041c..f765b1e920 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoDX11/Src/Render.cpp @@ -715,12 +715,12 @@ void Renderer::SetBlendMode(bool forceUpdate) if (bpmem.blendmode.logicopenable && !forceUpdate) return; - if (bpmem.blendmode.subtract) // enable blending src 1 dst 1 + if (bpmem.blendmode.subtract) { gx_state.blenddc.RenderTarget[0].BlendEnable = true; SetBlendOp(D3D11_BLEND_OP_REV_SUBTRACT); - SetSrcBlend(d3dSrcFactors[1]); - SetDestBlend(d3dDestFactors[1]); + SetSrcBlend(D3D11_BLEND_ONE); + SetDestBlend(D3D11_BLEND_ONE); } else { diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp index 7a175fd443..fdd29d289b 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp @@ -691,8 +691,8 @@ void Renderer::SetBlendMode(bool forceUpdate) { D3D::SetRenderState(D3DRS_ALPHABLENDENABLE, true); D3D::SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_REVSUBTRACT); - D3D::SetRenderState(D3DRS_SRCBLEND, d3dSrcFactors[1]); - D3D::SetRenderState(D3DRS_DESTBLEND, d3dDestFactors[1]); + D3D::SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); + D3D::SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); } else { diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 2f2b0b224d..7c950e9e85 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -1008,23 +1008,22 @@ void Renderer::SetBlendMode(bool forceUpdate) u32 dstidx = (newval >> 6) & 7; GLenum srcFactor = glSrcFactors[srcidx]; GLenum dstFactor = glDestFactors[dstidx]; + + // adjust alpha factors if (useDualSource) { - srcidx = 1; - dstidx = 0; + srcidx = GX_BL_ONE; + dstidx = GX_BL_ZERO; } else { // we can't use GL_DST_COLOR or GL_ONE_MINUS_DST_COLOR for source in alpha channel so use their alpha equivalent instead - if (srcidx == 2 || srcidx == 3) - { - srcidx += 4; - } + if (srcidx == GX_BL_DSTCLR) srcidx = GX_BL_DSTALPHA; + if (srcidx == GX_BL_INVDSTCLR) srcidx = GX_BL_INVDSTALPHA; + // we can't use GL_SRC_COLOR or GL_ONE_MINUS_SRC_COLOR for destination in alpha channel so use their alpha equivalent instead - if (dstidx == 2 || dstidx == 3) - { - dstidx += 2; - } + if (dstidx == GX_BL_SRCCLR) dstidx = GX_BL_SRCALPHA; + if (dstidx == GX_BL_INVSRCCLR) dstidx = GX_BL_INVSRCALPHA; } GLenum srcFactorAlpha = glSrcFactors[srcidx]; GLenum dstFactorAlpha = glDestFactors[dstidx];