summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/MainBase.cpp
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2013-02-16 17:50:40 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2013-02-16 19:30:24 -0600
commit53aec6c476b0ec9db4d301eaafedbb26eb3697f4 (patch)
treedc0f60174eb8222ae6fa10321ad85fcbf9ce3d42 /Source/Core/VideoCommon/Src/MainBase.cpp
parent54947b1e2246804ddf5ec0378f8111905a6d04bd (diff)
Fix OGL perf queries and make them not slow!
Diffstat (limited to 'Source/Core/VideoCommon/Src/MainBase.cpp')
-rw-r--r--Source/Core/VideoCommon/Src/MainBase.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/Src/MainBase.cpp b/Source/Core/VideoCommon/Src/MainBase.cpp
index cb6dc7ae5b..e8de52addb 100644
--- a/Source/Core/VideoCommon/Src/MainBase.cpp
+++ b/Source/Core/VideoCommon/Src/MainBase.cpp
@@ -21,6 +21,10 @@ volatile u32 s_swapRequested = false;
u32 s_efbAccessRequested = false;
volatile u32 s_FifoShuttingDown = false;
+std::condition_variable s_perf_query_cond;
+std::mutex s_perf_query_lock;
+static volatile bool s_perf_query_requested;
+
static volatile struct
{
u32 xfbAddr;
@@ -169,6 +173,43 @@ u32 VideoBackendHardware::Video_AccessEFB(EFBAccessType type, u32 x, u32 y, u32
return 0;
}
+static bool QueryResultIsReady()
+{
+ return !s_perf_query_requested || s_FifoShuttingDown;
+}
+
+void VideoFifo_CheckPerfQueryRequest()
+{
+ if (s_perf_query_requested)
+ {
+ g_perf_query->FlushResults();
+
+ {
+ std::lock_guard<std::mutex> lk(s_perf_query_lock);
+ s_perf_query_requested = false;
+ }
+
+ s_perf_query_cond.notify_one();
+ }
+}
+
+u32 VideoBackendHardware::Video_GetQueryResult(PerfQueryType type)
+{
+ // Is this check sane?
+ if (!g_perf_query->IsFlushed())
+ {
+ if (SConfig::GetInstance().m_LocalCoreStartupParameter.bCPUThread)
+ {
+ s_perf_query_requested = true;
+ std::unique_lock<std::mutex> lk(s_perf_query_lock);
+ s_perf_query_cond.wait(lk, QueryResultIsReady);
+ }
+ else
+ g_perf_query->FlushResults();
+ }
+
+ return g_perf_query->GetQueryResult(type);
+}
void VideoBackendHardware::InitializeShared()
{
@@ -176,6 +217,7 @@ void VideoBackendHardware::InitializeShared()
s_swapRequested = 0;
s_efbAccessRequested = 0;
+ s_perf_query_requested = false;
s_FifoShuttingDown = 0;
memset((void*)&s_beginFieldArgs, 0, sizeof(s_beginFieldArgs));
memset(&s_accessEFBArgs, 0, sizeof(s_accessEFBArgs));
@@ -223,6 +265,7 @@ void VideoFifo_CheckAsyncRequest()
{
VideoFifo_CheckSwapRequest();
VideoFifo_CheckEFBAccess();
+ VideoFifo_CheckPerfQueryRequest();
}
void VideoBackendHardware::Video_GatherPipeBursted()