summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorPierre Bourdon <delroth@gmail.com>2023-03-15 15:20:11 +0100
committerGitHub <noreply@github.com>2023-03-15 15:20:11 +0100
commit91fca0783edc73d5f027cb4e151b319f03ee5ce4 (patch)
treeace3697be316fe552109bc37f24cec4376aa46cb /Source
parentb43f83286674e97d472e0b2d1361c21c50d4bfe3 (diff)
parentaac9647ba2715b4a96fe301116a9f41cd8046441 (diff)
Merge pull request #11647 from AdmiralCurtiss/perfquery-inconsistency
Fix PerfQuery inconsistencies across backends.
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/VideoBackends/D3D/D3DPerfQuery.cpp9
-rw-r--r--Source/Core/VideoBackends/D3D12/D3D12PerfQuery.cpp9
-rw-r--r--Source/Core/VideoBackends/Metal/MTLPerfQuery.mm2
-rw-r--r--Source/Core/VideoBackends/OGL/OGLPerfQuery.cpp2
-rw-r--r--Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp9
5 files changed, 20 insertions, 11 deletions
diff --git a/Source/Core/VideoBackends/D3D/D3DPerfQuery.cpp b/Source/Core/VideoBackends/D3D/D3DPerfQuery.cpp
index fe34a8ff45..f2ae05bb99 100644
--- a/Source/Core/VideoBackends/D3D/D3DPerfQuery.cpp
+++ b/Source/Core/VideoBackends/D3D/D3DPerfQuery.cpp
@@ -8,6 +8,7 @@
#include "VideoBackends/D3D/D3DBase.h"
#include "VideoCommon/FramebufferManager.h"
#include "VideoCommon/VideoCommon.h"
+#include "VideoCommon/VideoConfig.h"
namespace DX11
{
@@ -96,7 +97,7 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type)
result = m_results[PQG_EFB_COPY_CLOCKS].load(std::memory_order_relaxed);
}
- return result;
+ return result / 4;
}
void PerfQuery::FlushOne()
@@ -114,8 +115,10 @@ void PerfQuery::FlushOne()
// NOTE: Reported pixel metrics should be referenced to native resolution
// TODO: Dropping the lower 2 bits from this count should be closer to actual
// hardware behavior when drawing triangles.
- const u64 native_res_result = result * EFB_WIDTH / g_framebuffer_manager->GetEFBWidth() *
- EFB_HEIGHT / g_framebuffer_manager->GetEFBHeight();
+ u64 native_res_result = result * EFB_WIDTH / g_framebuffer_manager->GetEFBWidth() * EFB_HEIGHT /
+ g_framebuffer_manager->GetEFBHeight();
+ if (g_ActiveConfig.iMultisamples > 1)
+ native_res_result /= g_ActiveConfig.iMultisamples;
m_results[entry.query_group].fetch_add(static_cast<u32>(native_res_result),
std::memory_order_relaxed);
diff --git a/Source/Core/VideoBackends/D3D12/D3D12PerfQuery.cpp b/Source/Core/VideoBackends/D3D12/D3D12PerfQuery.cpp
index 933f118ce9..da9a6e6546 100644
--- a/Source/Core/VideoBackends/D3D12/D3D12PerfQuery.cpp
+++ b/Source/Core/VideoBackends/D3D12/D3D12PerfQuery.cpp
@@ -13,6 +13,7 @@
#include "VideoBackends/D3D12/DX12Context.h"
#include "VideoCommon/FramebufferManager.h"
#include "VideoCommon/VideoCommon.h"
+#include "VideoCommon/VideoConfig.h"
namespace DX12
{
@@ -244,9 +245,11 @@ void PerfQuery::AccumulateQueriesFromBuffer(u32 query_count)
std::memcpy(&result, mapped_ptr + (index * sizeof(PerfQueryDataType)), sizeof(result));
// NOTE: Reported pixel metrics should be referenced to native resolution
- const u64 native_res_result = static_cast<u64>(result) * EFB_WIDTH /
- g_framebuffer_manager->GetEFBWidth() * EFB_HEIGHT /
- g_framebuffer_manager->GetEFBHeight();
+ u64 native_res_result = static_cast<u64>(result) * EFB_WIDTH /
+ g_framebuffer_manager->GetEFBWidth() * EFB_HEIGHT /
+ g_framebuffer_manager->GetEFBHeight();
+ if (g_ActiveConfig.iMultisamples > 1)
+ native_res_result /= g_ActiveConfig.iMultisamples;
m_results[entry.query_group].fetch_add(static_cast<u32>(native_res_result),
std::memory_order_relaxed);
}
diff --git a/Source/Core/VideoBackends/Metal/MTLPerfQuery.mm b/Source/Core/VideoBackends/Metal/MTLPerfQuery.mm
index 76bddc1dce..37036f28aa 100644
--- a/Source/Core/VideoBackends/Metal/MTLPerfQuery.mm
+++ b/Source/Core/VideoBackends/Metal/MTLPerfQuery.mm
@@ -46,7 +46,7 @@ u32 Metal::PerfQuery::GetQueryResult(PerfQueryType type)
result = m_results[PQG_EFB_COPY_CLOCKS].load(std::memory_order_relaxed);
}
- return result;
+ return result / 4;
}
void Metal::PerfQuery::FlushResults()
diff --git a/Source/Core/VideoBackends/OGL/OGLPerfQuery.cpp b/Source/Core/VideoBackends/OGL/OGLPerfQuery.cpp
index 6303464251..b7e7cc0301 100644
--- a/Source/Core/VideoBackends/OGL/OGLPerfQuery.cpp
+++ b/Source/Core/VideoBackends/OGL/OGLPerfQuery.cpp
@@ -80,7 +80,7 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type)
result = m_results[PQG_EFB_COPY_CLOCKS].load(std::memory_order_relaxed);
}
- return result;
+ return result / 4;
}
// Implementations
diff --git a/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp b/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp
index d16c8c379b..c6aee79327 100644
--- a/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp
+++ b/Source/Core/VideoBackends/Vulkan/VKPerfQuery.cpp
@@ -17,6 +17,7 @@
#include "VideoBackends/Vulkan/VulkanContext.h"
#include "VideoCommon/FramebufferManager.h"
#include "VideoCommon/VideoCommon.h"
+#include "VideoCommon/VideoConfig.h"
namespace Vulkan
{
@@ -218,9 +219,11 @@ void PerfQuery::ReadbackQueries(u32 query_count)
entry.has_value = false;
// NOTE: Reported pixel metrics should be referenced to native resolution
- const u64 native_res_result = static_cast<u64>(m_query_result_buffer[i]) * EFB_WIDTH /
- g_framebuffer_manager->GetEFBWidth() * EFB_HEIGHT /
- g_framebuffer_manager->GetEFBHeight();
+ u64 native_res_result = static_cast<u64>(m_query_result_buffer[i]) * EFB_WIDTH /
+ g_framebuffer_manager->GetEFBWidth() * EFB_HEIGHT /
+ g_framebuffer_manager->GetEFBHeight();
+ if (g_ActiveConfig.iMultisamples > 1)
+ native_res_result /= g_ActiveConfig.iMultisamples;
m_results[entry.query_group].fetch_add(static_cast<u32>(native_res_result),
std::memory_order_relaxed);
}