void PerfQuery::EnableQuery(PerfQueryGroup type) { // Have we used half of the query buffer already? if (m_query_count > m_query_buffer.size() / 2) NonBlockingPartialFlush(); // Block if there are no free slots. if (m_query_count == PERF_QUERY_BUFFER_SIZE) { // ERROR_LOG(VIDEO, "Flushed query buffer early!"); BlockingPartialFlush(); } if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { u32 index = (m_query_read_pos + m_query_count) % PERF_QUERY_BUFFER_SIZE; ActiveQuery& entry = m_query_buffer[index]; ASSERT(!entry.active && !entry.available); entry.active = true; m_query_count++; DEBUG_LOG(VIDEO, "start query %u", index); // Use precise queries if supported, otherwise boolean (which will be incorrect). VkQueryControlFlags flags = 0; if (g_vulkan_context->SupportsPreciseOcclusionQueries()) flags = VK_QUERY_CONTROL_PRECISE_BIT; // Ensure the query starts within a render pass. // TODO: Is this needed? StateTracker::GetInstance()->BeginRenderPass(); vkCmdBeginQuery(g_command_buffer_mgr->GetCurrentCommandBuffer(), m_query_pool, index, flags); } }
void PerfQuery::FlushResults() { while (!IsFlushed()) BlockingPartialFlush(); }