1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00
OpenDX/src/dxvk/dxvk_query.cpp

103 lines
2.8 KiB
C++
Raw Normal View History

2018-02-08 19:32:53 +01:00
#include "dxvk_query.h"
namespace dxvk {
DxvkQuery::DxvkQuery(VkQueryType type)
: m_type(type) {
2018-02-08 19:32:53 +01:00
}
DxvkQuery::~DxvkQuery() {
}
uint32_t DxvkQuery::invalidate() {
std::unique_lock<std::mutex> lock(m_mutex);
m_status = DxvkQueryStatus::Reset;
m_data = DxvkQueryData { };
m_queryIndex = 0;
m_queryCount = 0;
return ++m_revision;
}
DxvkQueryStatus DxvkQuery::getData(DxvkQueryData& data) {
std::unique_lock<std::mutex> lock(m_mutex);
if (m_status == DxvkQueryStatus::Available)
data = m_data;
return m_status;
}
void DxvkQuery::beginRecording(uint32_t revision) {
std::unique_lock<std::mutex> lock(m_mutex);
if (m_revision == revision)
m_status = DxvkQueryStatus::Active;
}
void DxvkQuery::endRecording(uint32_t revision) {
std::unique_lock<std::mutex> lock(m_mutex);
if (m_revision == revision)
m_status = DxvkQueryStatus::Pending;
}
void DxvkQuery::associateQuery(uint32_t revision) {
std::unique_lock<std::mutex> lock(m_mutex);
if (m_revision == revision)
m_queryCount += 1;
}
void DxvkQuery::updateData(
uint32_t revision,
const DxvkQueryData& data) {
std::unique_lock<std::mutex> lock(m_mutex);
if (m_revision == revision) {
switch (m_type) {
case VK_QUERY_TYPE_OCCLUSION:
m_data.occlusion.samplesPassed += data.occlusion.samplesPassed;
break;
case VK_QUERY_TYPE_TIMESTAMP:
m_data.timestamp.time = data.timestamp.time;
break;
case VK_QUERY_TYPE_PIPELINE_STATISTICS:
m_data.statistic.iaVertices += data.statistic.iaVertices;
m_data.statistic.iaPrimitives += data.statistic.iaPrimitives;
m_data.statistic.vsInvocations += data.statistic.vsInvocations;
m_data.statistic.gsInvocations += data.statistic.gsInvocations;
m_data.statistic.gsPrimitives += data.statistic.gsPrimitives;
m_data.statistic.clipInvocations += data.statistic.clipInvocations;
m_data.statistic.clipPrimitives += data.statistic.clipPrimitives;
m_data.statistic.fsInvocations += data.statistic.fsInvocations;
m_data.statistic.tcsPatches += data.statistic.tcsPatches;
m_data.statistic.tesInvocations += data.statistic.tesInvocations;
m_data.statistic.csInvocations += data.statistic.csInvocations;
break;
default:
Logger::err(str::format("DxvkQuery: Unhandled query type: ", m_type));
}
if (++m_queryIndex == m_queryCount && m_status == DxvkQueryStatus::Pending) {
m_status = DxvkQueryStatus::Available;
m_signal.notify_all();
}
}
2018-02-08 19:32:53 +01:00
}
}