MCPcopy Create free account
hub / github.com/GameTechDev/PresentMon / HandleNvidiaDisplayDriverEvent

Method HandleNvidiaDisplayDriverEvent

PresentData/NvidiaTraceConsumer.cpp:17–68  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

15}
16
17void NVTraceConsumer::HandleNvidiaDisplayDriverEvent(EVENT_RECORD* const pEventRecord, PMTraceConsumer* const pmConsumer)
18{
19 enum {
20 FlipRequest = 1
21 };
22
23 auto const& hdr = pEventRecord->EventHeader;
24 switch (hdr.EventDescriptor.Id) {
25 case FlipRequest: {
26 auto alloc = pmConsumer->mMetadata.GetEventData<uint64_t>(pEventRecord, L"alloc");
27 auto vidPnSourceId = pmConsumer->mMetadata.GetEventData<uint32_t>(pEventRecord, L"vidPnSourceId");
28 auto& lastFlipTime = mLastFlipTimeByHead[vidPnSourceId];
29 auto ts = pmConsumer->mMetadata.GetEventData<uint64_t>(pEventRecord, L"ts");
30 auto token = pmConsumer->mMetadata.GetEventData<uint32_t>(pEventRecord, L"token");
31 uint64_t proposedFlipTime = 0;
32 uint64_t delay = 0;
33
34 if (token == mLastFlipToken) {
35 return;
36 }
37 mLastFlipToken = token;
38
39 if (alloc == 0) {
40 assert(!delay);
41 assert(ts);
42 // proposedFlipTime in number of ticks
43 proposedFlipTime = ts;
44 auto t1 = *(uint64_t*)&hdr.TimeStamp;
45 if (proposedFlipTime >= t1) {
46 delay = proposedFlipTime - t1;
47 }
48
49 if (proposedFlipTime && lastFlipTime && (proposedFlipTime < lastFlipTime)) {
50 delay = lastFlipTime - proposedFlipTime;
51 proposedFlipTime = lastFlipTime;
52 }
53 }
54
55 lastFlipTime = proposedFlipTime;
56
57 {
58 NvFlipRequest flipRequest;
59 flipRequest.FlipDelay = delay;
60 flipRequest.FlipToken = token;
61 mNvFlipRequestByThreadId.emplace(hdr.ThreadId, flipRequest);
62 }
63 break;
64 }
65 default:
66 break;
67 }
68}
69
70void NVTraceConsumer::ApplyFlipDelay(PresentEvent* present, uint32_t threadId)
71{

Callers 1

EventRecordCallbackFunction · 0.45

Calls

no outgoing calls

Tested by

no test coverage detected