| 313 | } |
| 314 | |
| 315 | static bool GetPresentProcessInfo( |
| 316 | std::shared_ptr<PresentEvent> const& presentEvent, |
| 317 | bool create, |
| 318 | ProcessInfo** outProcessInfo, |
| 319 | SwapChainData** outChain, |
| 320 | uint64_t* outPresentTime) |
| 321 | { |
| 322 | ProcessInfo* processInfo; |
| 323 | auto ii = gProcesses.find(presentEvent->ProcessId); |
| 324 | if (ii != gProcesses.end()) { |
| 325 | processInfo = &ii->second; |
| 326 | } else { |
| 327 | if (!create) { |
| 328 | *outProcessInfo = nullptr; |
| 329 | *outChain = nullptr; |
| 330 | *outPresentTime = presentEvent->PresentStartTime; |
| 331 | return false; |
| 332 | } |
| 333 | |
| 334 | ProcessInfo info; |
| 335 | QueryProcessName(presentEvent->ProcessId, &info); |
| 336 | info.mOutputCsv = nullptr; |
| 337 | info.mIsTargetProcess = IsTargetProcess(presentEvent->ProcessId, info.mModuleName); |
| 338 | if (info.mIsTargetProcess) { |
| 339 | gTargetProcessCount += 1; |
| 340 | } |
| 341 | |
| 342 | processInfo = &gProcesses.emplace(presentEvent->ProcessId, info).first->second; |
| 343 | } |
| 344 | |
| 345 | if (!processInfo->mIsTargetProcess) { |
| 346 | return true; |
| 347 | } |
| 348 | |
| 349 | auto chain = &processInfo->mSwapChain[presentEvent->SwapChainAddress]; |
| 350 | if (!chain->mUnifiedSwapChain.swapChain.lastPresent.has_value()) { |
| 351 | using namespace pmon::util::metrics; |
| 352 | chain->mUnifiedSwapChain.SeedFromFirstPresent(FrameData::CopyFrameData(presentEvent)); |
| 353 | return true; |
| 354 | } |
| 355 | |
| 356 | *outProcessInfo = processInfo; |
| 357 | *outChain = chain; |
| 358 | *outPresentTime = chain->mUnifiedSwapChain.GetLastPresentQpc(); |
| 359 | return false; |
| 360 | } |
| 361 | |
| 362 | static void ProcessRecordingToggle( |
| 363 | bool* isRecording) |
no test coverage detected