diff --git a/plugins/GSdx/GSRendererOGL.cpp b/plugins/GSdx/GSRendererOGL.cpp index 069a51743f..d4f37f3b7b 100644 --- a/plugins/GSdx/GSRendererOGL.cpp +++ b/plugins/GSdx/GSRendererOGL.cpp @@ -41,6 +41,7 @@ GSRendererOGL::GSRendererOGL() UserHacks_merge_sprite = theApp.GetConfigB("UserHacks_merge_pp_sprite"); m_prim_overlap = PRIM_OVERLAP_UNKNOW; + m_pass1_atst = 0; ResetStates(); if (!theApp.GetConfigB("UserHacks")) { @@ -168,6 +169,34 @@ void GSRendererOGL::SetupIA() dev->IASetPrimitiveTopology(t); } +void GSRendererOGL::EmulateAtst(const int pass, const GSTextureCache::Source* tex) +{ + if (pass == 1) { + if (m_context->TEST.ATE) + m_pass1_atst = m_context->TEST.ATST; + else + m_pass1_atst = ATST_ALWAYS; + + if (m_context->TEST.ATE && m_context->TEST.ATST > 1) + ps_cb.FogColor_AREF.a = (float)m_context->TEST.AREF; + + if (tex && tex->m_spritehack_t && (m_pass1_atst == 2)) { + m_ps_sel.atst = 1; + } else { + m_ps_sel.atst = m_pass1_atst; + } + + } else if (pass == 2) { + static const uint32 iatst[] = {1, 0, 5, 6, 7, 2, 3, 4}; + + m_ps_sel.atst = iatst[m_pass1_atst]; + + if (tex && tex->m_spritehack_t && (m_ps_sel.atst == 2)) { + m_ps_sel.atst = 1; + } + } +} + void GSRendererOGL::EmulateTextureShuffleAndFbmask() { if (m_texture_shuffle) { @@ -1242,21 +1271,14 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour #endif } - if (m_context->TEST.ATE) - m_ps_sel.atst = m_context->TEST.ATST; - else - m_ps_sel.atst = ATST_ALWAYS; - - if (m_context->TEST.ATE && m_context->TEST.ATST > 1) - ps_cb.FogColor_AREF.a = (float)m_context->TEST.AREF; - - // By default don't use texture - m_ps_sel.tfx = 4; - int atst = m_ps_sel.atst; + EmulateAtst(1, tex); if (tex) { EmulateTextureSampler(tex); + } else { + m_ps_sel.tfx = 4; } + // Always bind the RT. This way special effect can use it. dev->PSSetShaderResource(3, rt); @@ -1337,12 +1359,7 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour { ASSERT(!m_env.PABE.PABE); - static const uint32 iatst[] = {1, 0, 5, 6, 7, 2, 3, 4}; - - m_ps_sel.atst = iatst[atst]; - if (tex && tex->m_spritehack_t && (m_ps_sel.atst == 2)) { - m_ps_sel.atst = 1; - } + EmulateAtst(2, tex); dev->SetupPipeline(m_vs_sel, m_gs_sel, m_ps_sel); diff --git a/plugins/GSdx/GSRendererOGL.h b/plugins/GSdx/GSRendererOGL.h index 9ee8e761d3..7652ab4334 100644 --- a/plugins/GSdx/GSRendererOGL.h +++ b/plugins/GSdx/GSRendererOGL.h @@ -71,6 +71,8 @@ class GSRendererOGL final : public GSRendererHW GSDeviceOGL::OMColorMaskSelector m_om_csel; GSDeviceOGL::OMDepthStencilSelector m_om_dssel; + int m_pass1_atst; + private: inline void ResetStates(); inline void Lines2Sprites(); @@ -79,6 +81,7 @@ class GSRendererOGL final : public GSRendererHW inline void EmulateChannelShuffle(GSTexture** rt, const GSTextureCache::Source* tex); inline void EmulateBlending(bool DATE_GL42); inline void EmulateTextureSampler(const GSTextureCache::Source* tex); + inline void EmulateAtst(const int pass, const GSTextureCache::Source* tex); public: GSRendererOGL();