summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/Src/MainBase.cpp
diff options
context:
space:
mode:
authorNeoBrainX <NeoBrainX@gmail.com>2013-03-02 00:04:44 +0100
committerNeoBrainX <NeoBrainX@gmail.com>2013-03-02 00:17:37 +0100
commit008fdc73106a142212fc5cd4481d13535103b954 (patch)
treebc7307aa6bca3b2f060762c014ef0d09e5e5d533 /Source/Core/VideoCommon/Src/MainBase.cpp
parentef7083d78cdeb9eb8881a0d1593164ad1dd04225 (diff)
parentcb1d21c032b92412d5d795705642189657db37e3 (diff)
Merge branch 'perfqueries'.
Adds support for PE performance metrics. Used in Super Mario Sunshine's "Scrubbing Sirena Beach" level to determine when enough goop has been cleaned up to finish the level. Also used in TimeSplitters: Future Perfect to determine the appearance of flares around light sources (e.g. sun). OpenGL and D3D11 only. D3D9 support unlikely to be added unless anyone bothers to do the work. Initial work and D3D11 support by me. Kudos go to Billiard for adding the OpenGL support and reviving development of this branch that way :D Slightly (~7%) decreases performance when performance metrics are used (and only then). Fixes issue 1498. Fixes issue 5368.
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 a881bebfb2..1472367f21 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)
+{
+ // TODO: 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));
@@ -238,6 +280,7 @@ void VideoFifo_CheckAsyncRequest()
{
VideoFifo_CheckSwapRequest();
VideoFifo_CheckEFBAccess();
+ VideoFifo_CheckPerfQueryRequest();
}
void VideoBackendHardware::Video_GatherPipeBursted()