From 34692ab826abc8f8faa61bdb2280b742424528f1 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 7 Dec 2013 15:14:29 -0500 Subject: Remove unnecessary Src/ folders --- Source/Core/VideoBackends/D3D/PerfQuery.cpp | 171 ++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 Source/Core/VideoBackends/D3D/PerfQuery.cpp (limited to 'Source/Core/VideoBackends/D3D/PerfQuery.cpp') diff --git a/Source/Core/VideoBackends/D3D/PerfQuery.cpp b/Source/Core/VideoBackends/D3D/PerfQuery.cpp new file mode 100644 index 0000000000..b2c77a876e --- /dev/null +++ b/Source/Core/VideoBackends/D3D/PerfQuery.cpp @@ -0,0 +1,171 @@ +#include "RenderBase.h" + +#include "D3DBase.h" +#include "PerfQuery.h" + +namespace DX11 { + +PerfQuery::PerfQuery() + : m_query_read_pos() + , m_query_count() +{ + for (int i = 0; i != ArraySize(m_query_buffer); ++i) + { + D3D11_QUERY_DESC qdesc = CD3D11_QUERY_DESC(D3D11_QUERY_OCCLUSION, 0); + D3D::device->CreateQuery(&qdesc, &m_query_buffer[i].query); + } + ResetQuery(); +} + +PerfQuery::~PerfQuery() +{ + for (int i = 0; i != ArraySize(m_query_buffer); ++i) + { + // TODO: EndQuery? + m_query_buffer[i].query->Release(); + } +} + +void PerfQuery::EnableQuery(PerfQueryGroup type) +{ + if (!ShouldEmulate()) + return; + + // Is this sane? + if (m_query_count > ArraySize(m_query_buffer) / 2) + WeakFlush(); + + if (ArraySize(m_query_buffer) == m_query_count) + { + // TODO + FlushOne(); + ERROR_LOG(VIDEO, "Flushed query buffer early!"); + } + + // start query + if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) + { + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ArraySize(m_query_buffer)]; + + D3D::context->Begin(entry.query); + entry.query_type = type; + + ++m_query_count; + } +} + +void PerfQuery::DisableQuery(PerfQueryGroup type) +{ + if (!ShouldEmulate()) + return; + + // stop query + if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) + { + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count + ArraySize(m_query_buffer)-1) % ArraySize(m_query_buffer)]; + D3D::context->End(entry.query); + } +} + +void PerfQuery::ResetQuery() +{ + m_query_count = 0; + std::fill_n(m_results, ArraySize(m_results), 0); +} + +u32 PerfQuery::GetQueryResult(PerfQueryType type) +{ + if (!ShouldEmulate()) + return 0; + + u32 result = 0; + + if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC) + { + result = m_results[PQG_ZCOMP_ZCOMPLOC]; + } + else if (type == PQ_ZCOMP_INPUT || type == PQ_ZCOMP_OUTPUT) + { + result = m_results[PQG_ZCOMP]; + } + else if (type == PQ_BLEND_INPUT) + { + result = m_results[PQG_ZCOMP] + m_results[PQG_ZCOMP_ZCOMPLOC]; + } + else if (type == PQ_EFB_COPY_CLOCKS) + { + result = m_results[PQG_EFB_COPY_CLOCKS]; + } + + return result / 4; +} + +void PerfQuery::FlushOne() +{ + if (!ShouldEmulate()) + return; + + auto& entry = m_query_buffer[m_query_read_pos]; + + UINT64 result = 0; + HRESULT hr = S_FALSE; + while (hr != S_OK) + { + // TODO: Might cause us to be stuck in an infinite loop! + hr = D3D::context->GetData(entry.query, &result, sizeof(result), 0); + } + + // NOTE: Reported pixel metrics should be referenced to native resolution + m_results[entry.query_type] += (u32)(result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight()); + + m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); + --m_query_count; +} + +// TODO: could selectively flush things, but I don't think that will do much +void PerfQuery::FlushResults() +{ + if (!ShouldEmulate()) + return; + + while (!IsFlushed()) + FlushOne(); +} + +void PerfQuery::WeakFlush() +{ + if (!ShouldEmulate()) + return; + + while (!IsFlushed()) + { + auto& entry = m_query_buffer[m_query_read_pos]; + + UINT64 result = 0; + HRESULT hr = D3D::context->GetData(entry.query, &result, sizeof(result), D3D11_ASYNC_GETDATA_DONOTFLUSH); + + if (hr == S_OK) + { + // NOTE: Reported pixel metrics should be referenced to native resolution + m_results[entry.query_type] += (u32)(result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight()); + + m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); + --m_query_count; + } + else + { + break; + } + } +} + +bool PerfQuery::IsFlushed() const +{ + if (!ShouldEmulate()) + return true; + + return 0 == m_query_count; +} + + +} // namespace -- cgit v1.2.3 From 655d22512bd5dd5282e04a736a963bf2c6a22212 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 15 Feb 2014 01:12:13 -0500 Subject: Kill off some usages of the ArraySize macro. This required the use of std::array in some cases. --- Source/Core/VideoBackends/D3D/PerfQuery.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'Source/Core/VideoBackends/D3D/PerfQuery.cpp') diff --git a/Source/Core/VideoBackends/D3D/PerfQuery.cpp b/Source/Core/VideoBackends/D3D/PerfQuery.cpp index b2c77a876e..869b7428d6 100644 --- a/Source/Core/VideoBackends/D3D/PerfQuery.cpp +++ b/Source/Core/VideoBackends/D3D/PerfQuery.cpp @@ -9,20 +9,21 @@ PerfQuery::PerfQuery() : m_query_read_pos() , m_query_count() { - for (int i = 0; i != ArraySize(m_query_buffer); ++i) + for (ActiveQuery& entry : m_query_buffer) { D3D11_QUERY_DESC qdesc = CD3D11_QUERY_DESC(D3D11_QUERY_OCCLUSION, 0); - D3D::device->CreateQuery(&qdesc, &m_query_buffer[i].query); + D3D::device->CreateQuery(&qdesc, &entry.query); } + ResetQuery(); } PerfQuery::~PerfQuery() { - for (int i = 0; i != ArraySize(m_query_buffer); ++i) + for (ActiveQuery& entry : m_query_buffer) { // TODO: EndQuery? - m_query_buffer[i].query->Release(); + entry.query->Release(); } } @@ -32,10 +33,10 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) return; // Is this sane? - if (m_query_count > ArraySize(m_query_buffer) / 2) + if (m_query_count > m_query_buffer.size() / 2) WeakFlush(); - if (ArraySize(m_query_buffer) == m_query_count) + if (m_query_buffer.size() == m_query_count) { // TODO FlushOne(); @@ -45,7 +46,7 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) // start query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ArraySize(m_query_buffer)]; + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % m_query_buffer.size()]; D3D::context->Begin(entry.query); entry.query_type = type; @@ -62,7 +63,7 @@ void PerfQuery::DisableQuery(PerfQueryGroup type) // stop query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count + ArraySize(m_query_buffer)-1) % ArraySize(m_query_buffer)]; + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count + m_query_buffer.size()-1) % m_query_buffer.size()]; D3D::context->End(entry.query); } } @@ -118,7 +119,7 @@ void PerfQuery::FlushOne() // NOTE: Reported pixel metrics should be referenced to native resolution m_results[entry.query_type] += (u32)(result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight()); - m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); + m_query_read_pos = (m_query_read_pos + 1) % m_query_buffer.size(); --m_query_count; } @@ -149,7 +150,7 @@ void PerfQuery::WeakFlush() // NOTE: Reported pixel metrics should be referenced to native resolution m_results[entry.query_type] += (u32)(result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight()); - m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); + m_query_read_pos = (m_query_read_pos + 1) % m_query_buffer.size(); --m_query_count; } else -- cgit v1.2.3 From 1f4219b5b4c5877efa12ac07d7647ed5285b288c Mon Sep 17 00:00:00 2001 From: degasus Date: Tue, 4 Feb 2014 20:16:03 +0100 Subject: move perfquery enable checks into videocommon (caller side) --- Source/Core/VideoBackends/D3D/PerfQuery.cpp | 21 --------------------- 1 file changed, 21 deletions(-) (limited to 'Source/Core/VideoBackends/D3D/PerfQuery.cpp') diff --git a/Source/Core/VideoBackends/D3D/PerfQuery.cpp b/Source/Core/VideoBackends/D3D/PerfQuery.cpp index b2c77a876e..425721dbe2 100644 --- a/Source/Core/VideoBackends/D3D/PerfQuery.cpp +++ b/Source/Core/VideoBackends/D3D/PerfQuery.cpp @@ -28,9 +28,6 @@ PerfQuery::~PerfQuery() void PerfQuery::EnableQuery(PerfQueryGroup type) { - if (!ShouldEmulate()) - return; - // Is this sane? if (m_query_count > ArraySize(m_query_buffer) / 2) WeakFlush(); @@ -56,9 +53,6 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) void PerfQuery::DisableQuery(PerfQueryGroup type) { - if (!ShouldEmulate()) - return; - // stop query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { @@ -75,9 +69,6 @@ void PerfQuery::ResetQuery() u32 PerfQuery::GetQueryResult(PerfQueryType type) { - if (!ShouldEmulate()) - return 0; - u32 result = 0; if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC) @@ -102,9 +93,6 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type) void PerfQuery::FlushOne() { - if (!ShouldEmulate()) - return; - auto& entry = m_query_buffer[m_query_read_pos]; UINT64 result = 0; @@ -125,18 +113,12 @@ void PerfQuery::FlushOne() // TODO: could selectively flush things, but I don't think that will do much void PerfQuery::FlushResults() { - if (!ShouldEmulate()) - return; - while (!IsFlushed()) FlushOne(); } void PerfQuery::WeakFlush() { - if (!ShouldEmulate()) - return; - while (!IsFlushed()) { auto& entry = m_query_buffer[m_query_read_pos]; @@ -161,9 +143,6 @@ void PerfQuery::WeakFlush() bool PerfQuery::IsFlushed() const { - if (!ShouldEmulate()) - return true; - return 0 == m_query_count; } -- cgit v1.2.3 From 2afe2152712981e21d6bda6f029292ed2b1cf91e Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 17 Feb 2014 05:18:15 -0500 Subject: Convert all includes to relative paths. --- Source/Core/VideoBackends/D3D/PerfQuery.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'Source/Core/VideoBackends/D3D/PerfQuery.cpp') diff --git a/Source/Core/VideoBackends/D3D/PerfQuery.cpp b/Source/Core/VideoBackends/D3D/PerfQuery.cpp index c7eb97ee0b..61a501d640 100644 --- a/Source/Core/VideoBackends/D3D/PerfQuery.cpp +++ b/Source/Core/VideoBackends/D3D/PerfQuery.cpp @@ -1,7 +1,6 @@ -#include "RenderBase.h" - -#include "D3DBase.h" -#include "PerfQuery.h" +#include "VideoBackends/D3D/D3DBase.h" +#include "VideoBackends/D3D/PerfQuery.h" +#include "VideoCommon/RenderBase.h" namespace DX11 { -- cgit v1.2.3 From 6da394a4d0891ed30fbb08f4ec853f40699f7033 Mon Sep 17 00:00:00 2001 From: Stevoisiak Date: Fri, 14 Nov 2014 14:46:49 -0500 Subject: More formatting and consistency fixes --- Source/Core/VideoBackends/D3D/PerfQuery.cpp | 8 -------- 1 file changed, 8 deletions(-) (limited to 'Source/Core/VideoBackends/D3D/PerfQuery.cpp') diff --git a/Source/Core/VideoBackends/D3D/PerfQuery.cpp b/Source/Core/VideoBackends/D3D/PerfQuery.cpp index 61a501d640..d80d934c7c 100644 --- a/Source/Core/VideoBackends/D3D/PerfQuery.cpp +++ b/Source/Core/VideoBackends/D3D/PerfQuery.cpp @@ -72,21 +72,13 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type) u32 result = 0; if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC) - { result = m_results[PQG_ZCOMP_ZCOMPLOC]; - } else if (type == PQ_ZCOMP_INPUT || type == PQ_ZCOMP_OUTPUT) - { result = m_results[PQG_ZCOMP]; - } else if (type == PQ_BLEND_INPUT) - { result = m_results[PQG_ZCOMP] + m_results[PQG_ZCOMP_ZCOMPLOC]; - } else if (type == PQ_EFB_COPY_CLOCKS) - { result = m_results[PQG_EFB_COPY_CLOCKS]; - } return result / 4; } -- cgit v1.2.3 From 63393570fb3e0f1ddf6b2219a2398fe3784026a6 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 15 Apr 2015 19:22:16 -0400 Subject: PerfQueryBase: Move common implementation variables into base class --- Source/Core/VideoBackends/D3D/PerfQuery.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'Source/Core/VideoBackends/D3D/PerfQuery.cpp') diff --git a/Source/Core/VideoBackends/D3D/PerfQuery.cpp b/Source/Core/VideoBackends/D3D/PerfQuery.cpp index d80d934c7c..b5eb89b5ad 100644 --- a/Source/Core/VideoBackends/D3D/PerfQuery.cpp +++ b/Source/Core/VideoBackends/D3D/PerfQuery.cpp @@ -6,7 +6,6 @@ namespace DX11 { PerfQuery::PerfQuery() : m_query_read_pos() - , m_query_count() { for (ActiveQuery& entry : m_query_buffer) { -- cgit v1.2.3 From 268f52e05479dc8e0f2cbf550472ca8d4867cf22 Mon Sep 17 00:00:00 2001 From: Tillmann Karras Date: Sun, 24 May 2015 06:32:32 +0200 Subject: Add missing license headers --- Source/Core/VideoBackends/D3D/PerfQuery.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'Source/Core/VideoBackends/D3D/PerfQuery.cpp') diff --git a/Source/Core/VideoBackends/D3D/PerfQuery.cpp b/Source/Core/VideoBackends/D3D/PerfQuery.cpp index b5eb89b5ad..62bc197be7 100644 --- a/Source/Core/VideoBackends/D3D/PerfQuery.cpp +++ b/Source/Core/VideoBackends/D3D/PerfQuery.cpp @@ -1,3 +1,7 @@ +// Copyright 2012 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + #include "VideoBackends/D3D/D3DBase.h" #include "VideoBackends/D3D/PerfQuery.h" #include "VideoCommon/RenderBase.h" -- cgit v1.2.3