| 190 | } |
| 191 | |
| 192 | static void UpdateProfile(ProfileData& profile, uint64 profileIdx, bool drawText, uint64 gpuFrequency, const uint64* frameQueryData) |
| 193 | { |
| 194 | profile.QueryFinished = false; |
| 195 | |
| 196 | double time = 0.0f; |
| 197 | if(profile.CPUProfile) |
| 198 | { |
| 199 | time = double(profile.EndTime - profile.StartTime) / 1000.0; |
| 200 | } |
| 201 | else if(frameQueryData) |
| 202 | { |
| 203 | Assert_(frameQueryData != nullptr); |
| 204 | |
| 205 | // Get the query data |
| 206 | uint64 startTime = frameQueryData[profileIdx * 2 + 0]; |
| 207 | uint64 endTime = frameQueryData[profileIdx * 2 + 1]; |
| 208 | |
| 209 | if(endTime > startTime) |
| 210 | { |
| 211 | uint64 delta = endTime - startTime; |
| 212 | double frequency = double(gpuFrequency); |
| 213 | time = (delta / frequency) * 1000.0; |
| 214 | } |
| 215 | } |
| 216 | |
| 217 | profile.TimeSamples[profile.CurrSample] = time; |
| 218 | profile.CurrSample = (profile.CurrSample + 1) % ProfileData::FilterSize; |
| 219 | |
| 220 | double maxTime = 0.0; |
| 221 | double avgTime = 0.0; |
| 222 | uint64 avgTimeSamples = 0; |
| 223 | for(UINT i = 0; i < ProfileData::FilterSize; ++i) |
| 224 | { |
| 225 | if(profile.TimeSamples[i] <= 0.0) |
| 226 | continue; |
| 227 | maxTime = Max(profile.TimeSamples[i], maxTime); |
| 228 | avgTime += profile.TimeSamples[i]; |
| 229 | ++avgTimeSamples; |
| 230 | } |
| 231 | |
| 232 | if(avgTimeSamples > 0) |
| 233 | avgTime /= double(avgTimeSamples); |
| 234 | |
| 235 | if(profile.Active && drawText) |
| 236 | ImGui::Text("%s: %.2fms (%.2fms max)", profile.Name, avgTime, maxTime); |
| 237 | |
| 238 | profile.AverageTime = avgTime; |
| 239 | profile.MaxTime = maxTime; |
| 240 | |
| 241 | profile.Active = false; |
| 242 | } |
| 243 | |
| 244 | void Profiler::EndFrame(uint32 displayWidth, uint32 displayHeight, uint32 avgFPS, double avgFrameTime) |
| 245 | { |