diff options
| author | hthh <hthh@hh.ht> | 2016-06-13 15:41:29 +1000 |
|---|---|---|
| committer | hthh <hthh@hh.ht> | 2016-07-04 18:54:49 +1000 |
| commit | 8be5717a60a4c4fbd29a0968a9f331152ff581e3 (patch) | |
| tree | 3cb3eb8fc7991eded6fdd5bf5ac35a633439d62e /Source/Core/VideoBackends/OGL/PerfQuery.cpp | |
| parent | f8bf839e36ecd0addcc07b841a1dca66bf90dca9 (diff) | |
Improve PerfQuery accuracy
In TimeSplitters: Future Perfect, PerfQuery is used to detect
the visibility of lights and draw coronas. 25 points are drawn
for each light. However, the returned count was incorrectly
being divided by four leading to dim coronas.
Using 4x antialiasing was a workaround because of a bug where
antialiasing multiplied the PerfQuery results. This commit
fixes that bug too (but only for OpenGL).
Diffstat (limited to 'Source/Core/VideoBackends/OGL/PerfQuery.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/PerfQuery.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/Source/Core/VideoBackends/OGL/PerfQuery.cpp b/Source/Core/VideoBackends/OGL/PerfQuery.cpp index cbe4ff7056..b3b5df2265 100644 --- a/Source/Core/VideoBackends/OGL/PerfQuery.cpp +++ b/Source/Core/VideoBackends/OGL/PerfQuery.cpp @@ -11,6 +11,7 @@ #include "VideoBackends/OGL/PerfQuery.h" #include "VideoCommon/RenderBase.h" +#include "VideoCommon/VideoConfig.h" namespace OGL { @@ -79,7 +80,7 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type) result = m_results[PQG_EFB_COPY_CLOCKS]; } - return result / 4; + return result; } // Implementations @@ -155,8 +156,16 @@ void PerfQueryGL::FlushOne() glGetQueryObjectuiv(entry.query_id, GL_QUERY_RESULT, &result); // NOTE: Reported pixel metrics should be referenced to native resolution - m_results[entry.query_type] += (u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * - EFB_HEIGHT / g_renderer->GetTargetHeight(); + // TODO: Dropping the lower 2 bits from this count should be closer to actual + // hardware behavior when drawing triangles. + result = static_cast<u64>(result) * EFB_WIDTH * EFB_HEIGHT / + (g_renderer->GetTargetWidth() * g_renderer->GetTargetHeight()); + + // Adjust for multisampling + if (g_ActiveConfig.iMultisamples > 1) + result /= g_ActiveConfig.iMultisamples; + + m_results[entry.query_type] += result; m_query_read_pos = (m_query_read_pos + 1) % m_query_buffer.size(); --m_query_count; @@ -241,8 +250,10 @@ void PerfQueryGLESNV::FlushOne() glGetOcclusionQueryuivNV(entry.query_id, GL_OCCLUSION_TEST_RESULT_HP, &result); // NOTE: Reported pixel metrics should be referenced to native resolution - m_results[entry.query_type] += (u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * - EFB_HEIGHT / g_renderer->GetTargetHeight(); + // TODO: Dropping the lower 2 bits from this count should be closer to actual + // hardware behavior when drawing triangles. + m_results[entry.query_type] += static_cast<u64>(result) * EFB_WIDTH * EFB_HEIGHT / + (g_renderer->GetTargetWidth() * g_renderer->GetTargetHeight()); m_query_read_pos = (m_query_read_pos + 1) % m_query_buffer.size(); --m_query_count; |
