From 4a929f85b61f376fffc74de4c194878571873bce Mon Sep 17 00:00:00 2001 From: degasus Date: Sun, 17 Mar 2013 00:36:13 +0100 Subject: [PATCH] GLSL: fix transparency issues on dual source blend. fix issue 6104 --- Source/Core/VideoCommon/Src/BPStructs.cpp | 8 ++++---- Source/Plugins/Plugin_VideoOGL/Src/Render.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/Core/VideoCommon/Src/BPStructs.cpp b/Source/Core/VideoCommon/Src/BPStructs.cpp index 99a03487d6..9580eea447 100644 --- a/Source/Core/VideoCommon/Src/BPStructs.cpp +++ b/Source/Core/VideoCommon/Src/BPStructs.cpp @@ -213,7 +213,7 @@ void BPWritten(const BPCmd& bp) if (bp.changes & 4) SetDitherMode(); // Set Blending Mode - if (bp.changes & 0xFE1) + if (bp.changes & 0xFF1) SetBlendMode(); // Set Color Mask if (bp.changes & 0x18) @@ -458,11 +458,11 @@ void BPWritten(const BPCmd& bp) break; case BPMEM_ZCOMPARE: // Set the Z-Compare and EFB pixel format - g_renderer->SetColorMask(); // alpha writing needs to be disabled if the new pixel format doesn't have an alpha channel - g_renderer->SetBlendMode(true); OnPixelFormatChange(); - if(bp.changes & 3) + if(bp.changes & 7) { SetBlendMode(); // dual source could be activated by changing to PIXELFMT_RGBA6_Z24 + g_renderer->SetColorMask(); // alpha writing needs to be disabled if the new pixel format doesn't have an alpha channel + } break; case BPMEM_MIPMAP_STRIDE: // MipMap Stride Channel diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 6afe14797b..11cb1d4a3b 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -882,13 +882,13 @@ void Renderer::ReinterpretPixelData(unsigned int convtype) void Renderer::SetBlendMode(bool forceUpdate) { - bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate - && bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24; - bool useDualSource = useDstAlpha && g_ActiveConfig.backend_info.bSupportsDualSourceBlend; - // Our render target always uses an alpha channel, so we need to override the blend functions to assume a destination alpha of 1 if the render target isn't supposed to have an alpha channel // Example: D3DBLEND_DESTALPHA needs to be D3DBLEND_ONE since the result without an alpha channel is assumed to always be 1. bool target_has_alpha = bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24; + + bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate && target_has_alpha; + bool useDualSource = useDstAlpha && g_ActiveConfig.backend_info.bSupportsDualSourceBlend; + const GLenum glSrcFactors[8] = { GL_ZERO,