std::vector<CounterResult> AMDCounters::GetCounterData(uint32_t sessionID, uint32_t maxSampleIndex, const std::vector<uint32_t> &eventIDs, const std::vector<GPUCounter> &counters) { std::vector<CounterResult> ret; bool isReady = false; const uint32_t timeoutPeriod = 10000; // ms PerformanceTimer timeout; do { isReady = IsSessionReady(sessionID); if(!isReady) { Threading::Sleep(0); PerformanceTimer endTime; if(timeout.GetMilliseconds() > timeoutPeriod) { GPA_LoggingCallback(GPA_LOGGING_ERROR, "GetCounterData failed due to elapsed timeout."); return ret; } } } while(!isReady); for(uint32_t s = 0; s < maxSampleIndex; s++) { for(size_t c = 0; c < counters.size(); c++) { const CounterDescription desc = GetCounterDescription(counters[c]); switch(desc.resultType) { case CompType::UInt: { if(desc.resultByteWidth == sizeof(uint32_t)) { uint32_t value = GetSampleUint32(sessionID, s, counters[c]); if(desc.unit == CounterUnit::Percentage) { value = RDCCLAMP(value, 0U, 100U); } ret.push_back(CounterResult(eventIDs[s], counters[c], value)); } else if(desc.resultByteWidth == sizeof(uint64_t)) { uint64_t value = GetSampleUint64(sessionID, s, counters[c]); if(desc.unit == CounterUnit::Percentage) { value = RDCCLAMP(value, (uint64_t)0, (uint64_t)100); } ret.push_back(CounterResult(eventIDs[s], counters[c], value)); } else { RDCERR("Unexpected byte width %u", desc.resultByteWidth); } } break; case CompType::Float: { float value = GetSampleFloat32(sessionID, s, counters[c]); if(desc.unit == CounterUnit::Percentage) { value = RDCCLAMP(value, 0.0f, 100.0f); } ret.push_back(CounterResult(eventIDs[s], counters[c], value)); } break; case CompType::Double: { double value = GetSampleFloat64(sessionID, s, counters[c]); if(desc.unit == CounterUnit::Percentage) { value = RDCCLAMP(value, 0.0, 100.0); } ret.push_back(CounterResult(eventIDs[s], counters[c], value)); } break; default: RDCASSERT(0); break; }; } } return ret; }
vector<CounterResult> D3D11DebugManager::FetchCountersAMD(const vector<GPUCounter> &counters) { vector<CounterResult> ret; m_pAMDCounters->DisableAllCounters(); // enable counters it needs for(size_t i = 0; i < counters.size(); i++) { // This function is only called internally, and violating this assertion means our // caller has invoked this method incorrectly RDCASSERT((counters[i] >= (GPUCounter::FirstAMD)) && (counters[i] < (GPUCounter::FirstIntel))); m_pAMDCounters->EnableCounter(counters[i]); } uint32_t sessionID = m_pAMDCounters->BeginSession(); uint32_t passCount = m_pAMDCounters->GetPassCount(); uint32_t sampleIndex = 0; vector<uint32_t> eventIDs; for(uint32_t p = 0; p < passCount; p++) { m_pAMDCounters->BeginPass(); uint32_t eventStartID = 0; sampleIndex = 0; eventIDs.clear(); FillTimersAMD(eventStartID, sampleIndex, eventIDs, m_WrappedContext->GetRootDraw()); m_pAMDCounters->EndPass(); } m_pAMDCounters->EndSesssion(); bool isReady = false; do { isReady = m_pAMDCounters->IsSessionReady(sessionID); } while(!isReady); for(uint32_t s = 0; s < sampleIndex; s++) { for(size_t c = 0; c < counters.size(); c++) { const CounterDescription desc = m_pAMDCounters->GetCounterDescription(counters[c]); switch(desc.resultType) { case CompType::UInt: { if(desc.resultByteWidth == sizeof(uint32_t)) { uint32_t value = m_pAMDCounters->GetSampleUint32(sessionID, s, counters[c]); if(desc.unit == CounterUnit::Percentage) { value = RDCCLAMP(value, 0U, 100U); } ret.push_back(CounterResult(eventIDs[s], counters[c], value)); } else if(desc.resultByteWidth == sizeof(uint64_t)) { uint64_t value = m_pAMDCounters->GetSampleUint64(sessionID, s, counters[c]); if(desc.unit == CounterUnit::Percentage) { value = RDCCLAMP(value, 0ULL, 100ULL); } ret.push_back( CounterResult(eventIDs[s], counters[c], value)); } else { RDCERR("Unexpected byte width %u", desc.resultByteWidth); } } break; case CompType::Float: { float value = m_pAMDCounters->GetSampleFloat32(sessionID, s, counters[c]); if(desc.unit == CounterUnit::Percentage) { value = RDCCLAMP(value, 0.0f, 100.0f); } ret.push_back(CounterResult(eventIDs[s], counters[c], value)); } break; case CompType::Double: { double value = m_pAMDCounters->GetSampleFloat64(sessionID, s, counters[c]); if(desc.unit == CounterUnit::Percentage) { value = RDCCLAMP(value, 0.0, 100.0); } ret.push_back(CounterResult(eventIDs[s], counters[c], value)); } break; default: RDCASSERT(0); break; }; } } return ret; }