diff options
| author | degasus <wickmarkus@web.de> | 2015-05-01 18:58:11 +0200 |
|---|---|---|
| committer | degasus <wickmarkus@web.de> | 2015-05-20 10:39:21 +0200 |
| commit | c7bae5ad114061cc14084344a0f1761d3583334e (patch) | |
| tree | 8c054aa09a53c84c4bd79f9c29c56399ea5d7e0c /Source/Core/VideoCommon/AsyncRequests.cpp | |
| parent | 695a72c24c2dcb839d7d3c0c9cb05cbbc606b2e9 (diff) | |
VideoCommon: Merge EFB pokes
Diffstat (limited to 'Source/Core/VideoCommon/AsyncRequests.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/AsyncRequests.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/Source/Core/VideoCommon/AsyncRequests.cpp b/Source/Core/VideoCommon/AsyncRequests.cpp index d2945a3dbc..24cfe68513 100644 --- a/Source/Core/VideoCommon/AsyncRequests.cpp +++ b/Source/Core/VideoCommon/AsyncRequests.cpp @@ -16,7 +16,34 @@ void AsyncRequests::PullEventsInternal() while (!m_queue.empty()) { - const Event& e = m_queue.front(); + Event e = m_queue.front(); + + // try to merge as many efb pokes as possible + // it's a bit hacky, but some games render a complete frame in this way + if ((e.type == Event::EFB_POKE_COLOR || e.type == Event::EFB_POKE_Z)) + { + m_merged_efb_pokes.clear(); + Event first_event = m_queue.front(); + EFBAccessType t = first_event.type == Event::EFB_POKE_COLOR ? POKE_COLOR : POKE_Z; + + do + { + e = m_queue.front(); + + EfbPokeData d; + d.data = e.efb_poke.data; + d.x = e.efb_poke.x; + d.y = e.efb_poke.y; + m_merged_efb_pokes.push_back(d); + + m_queue.pop(); + } while(!m_queue.empty() && m_queue.front().type == first_event.type); + + lock.unlock(); + g_renderer->PokeEFB(t, m_merged_efb_pokes); + lock.lock(); + continue; + } lock.unlock(); HandleEvent(e); |
