set blending if dual source might be triggered
This commit is contained in:
parent
a87fd89fce
commit
714ff50fdf
|
@ -224,6 +224,8 @@ void BPWritten(const BPCmd& bp)
|
||||||
{
|
{
|
||||||
PRIM_LOG("constalpha: alp=%d, en=%d", bpmem.dstalpha.alpha, bpmem.dstalpha.enable);
|
PRIM_LOG("constalpha: alp=%d, en=%d", bpmem.dstalpha.alpha, bpmem.dstalpha.enable);
|
||||||
PixelShaderManager::SetDestAlpha(bpmem.dstalpha);
|
PixelShaderManager::SetDestAlpha(bpmem.dstalpha);
|
||||||
|
if(bp.changes & 0x100)
|
||||||
|
SetBlendMode();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// This is called when the game is done drawing the new frame (eg: like in DX: Begin(); Draw(); End();)
|
// This is called when the game is done drawing the new frame (eg: like in DX: Begin(); Draw(); End();)
|
||||||
|
@ -457,6 +459,8 @@ void BPWritten(const BPCmd& bp)
|
||||||
case BPMEM_ZCOMPARE: // Set the Z-Compare and EFB pixel format
|
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->SetColorMask(); // alpha writing needs to be disabled if the new pixel format doesn't have an alpha channel
|
||||||
OnPixelFormatChange();
|
OnPixelFormatChange();
|
||||||
|
if(bp.changes & 3)
|
||||||
|
SetBlendMode(); // dual source could be activated by changing to PIXELFMT_RGBA6_Z24
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BPMEM_MIPMAP_STRIDE: // MipMap Stride Channel
|
case BPMEM_MIPMAP_STRIDE: // MipMap Stride Channel
|
||||||
|
|
|
@ -959,13 +959,19 @@ void Renderer::ReinterpretPixelData(unsigned int convtype)
|
||||||
|
|
||||||
void Renderer::SetBlendMode(bool forceUpdate)
|
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;
|
||||||
|
|
||||||
// blend mode bit mask
|
// blend mode bit mask
|
||||||
// 0 - blend enable
|
// 0 - blend enable
|
||||||
|
// 1 - dst alpha enabled
|
||||||
// 2 - reverse subtract enable (else add)
|
// 2 - reverse subtract enable (else add)
|
||||||
// 3-5 - srcRGB function
|
// 3-5 - srcRGB function
|
||||||
// 6-8 - dstRGB function
|
// 6-8 - dstRGB function
|
||||||
|
|
||||||
u32 newval = bpmem.blendmode.subtract << 2;
|
u32 newval = useDualSource << 1;
|
||||||
|
newval |= bpmem.blendmode.subtract << 2;
|
||||||
|
|
||||||
if (bpmem.blendmode.subtract)
|
if (bpmem.blendmode.subtract)
|
||||||
newval |= 0x0049; // enable blending src 1 dst 1
|
newval |= 0x0049; // enable blending src 1 dst 1
|
||||||
|
@ -978,10 +984,6 @@ void Renderer::SetBlendMode(bool forceUpdate)
|
||||||
|
|
||||||
u32 changes = forceUpdate ? 0xFFFFFFFF : newval ^ s_blendMode;
|
u32 changes = forceUpdate ? 0xFFFFFFFF : newval ^ s_blendMode;
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
if (changes & 1)
|
if (changes & 1)
|
||||||
// blend enable change
|
// blend enable change
|
||||||
(newval & 1) ? glEnable(GL_BLEND) : glDisable(GL_BLEND);
|
(newval & 1) ? glEnable(GL_BLEND) : glDisable(GL_BLEND);
|
||||||
|
@ -998,7 +1000,7 @@ void Renderer::SetBlendMode(bool forceUpdate)
|
||||||
glBlendEquation(newval & 4 ? GL_FUNC_REVERSE_SUBTRACT : GL_FUNC_ADD);
|
glBlendEquation(newval & 4 ? GL_FUNC_REVERSE_SUBTRACT : GL_FUNC_ADD);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changes & 0x1F8)
|
if (changes & 0x1FA)
|
||||||
{
|
{
|
||||||
if (g_ActiveConfig.backend_info.bSupportsDualSourceBlend)
|
if (g_ActiveConfig.backend_info.bSupportsDualSourceBlend)
|
||||||
{
|
{
|
||||||
|
|
|
@ -311,12 +311,10 @@ void VertexManager::vFlush()
|
||||||
{
|
{
|
||||||
// If host supports GL_ARB_blend_func_extended, we can do dst alpha in
|
// If host supports GL_ARB_blend_func_extended, we can do dst alpha in
|
||||||
// the same pass as regular rendering.
|
// the same pass as regular rendering.
|
||||||
g_renderer->SetBlendMode(true);
|
|
||||||
ps = PixelShaderCache::SetShader(DSTALPHA_DUAL_SOURCE_BLEND, g_nativeVertexFmt->m_components);
|
ps = PixelShaderCache::SetShader(DSTALPHA_DUAL_SOURCE_BLEND, g_nativeVertexFmt->m_components);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_renderer->SetBlendMode(true);
|
|
||||||
ps = PixelShaderCache::SetShader(DSTALPHA_NONE,g_nativeVertexFmt->m_components);
|
ps = PixelShaderCache::SetShader(DSTALPHA_NONE,g_nativeVertexFmt->m_components);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue