summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/AsyncRequests.cpp
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2015-05-01 18:58:11 +0200
committerdegasus <wickmarkus@web.de>2015-05-20 10:39:21 +0200
commitc7bae5ad114061cc14084344a0f1761d3583334e (patch)
tree8c054aa09a53c84c4bd79f9c29c56399ea5d7e0c /Source/Core/VideoCommon/AsyncRequests.cpp
parent695a72c24c2dcb839d7d3c0c9cb05cbbc606b2e9 (diff)
VideoCommon: Merge EFB pokes
Diffstat (limited to 'Source/Core/VideoCommon/AsyncRequests.cpp')
-rw-r--r--Source/Core/VideoCommon/AsyncRequests.cpp29
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);