Cemu/src/Cafe/HW/Latte/Renderer/Metal/MetalQuery.cpp
2024-11-05 17:57:20 +01:00

44 lines
1.1 KiB
C++

#include "Cafe/HW/Latte/Renderer/Metal/MetalQuery.h"
#include "Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h"
bool LatteQueryObjectMtl::getResult(uint64& numSamplesPassed)
{
if (!m_commandBuffer)
{
numSamplesPassed = 0;
return true;
}
if (!CommandBufferCompleted(m_commandBuffer))
return false;
uint64* resultPtr = m_mtlr->GetOcclusionQueryResultsPtr();
numSamplesPassed = 0;
for (uint32 i = m_range.begin; i != m_range.end; i = (i + 1) % MetalRenderer::OCCLUSION_QUERY_POOL_SIZE)
numSamplesPassed += resultPtr[i];
return true;
}
LatteQueryObjectMtl::~LatteQueryObjectMtl()
{
if (m_commandBuffer)
m_commandBuffer->release();
}
void LatteQueryObjectMtl::begin()
{
m_range.begin = m_mtlr->GetOcclusionQueryIndex();
m_mtlr->BeginOcclusionQuery();
}
void LatteQueryObjectMtl::end()
{
m_range.end = m_mtlr->GetOcclusionQueryIndex();
m_mtlr->EndOcclusionQuery();
m_commandBuffer = m_mtlr->GetCurrentCommandBuffer()->retain();
if (m_mtlr->IsCommandBufferActive())
m_mtlr->RequestSoonCommit();
}