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

Method HandleIntelPresentMonEvent

PresentData/PresentMonTraceConsumer.cpp:3078–3173  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3076}
3077
3078void PMTraceConsumer::HandleIntelPresentMonEvent(EVENT_RECORD* pEventRecord)
3079{
3080 if (mTrackFrameType) {
3081 switch (pEventRecord->EventHeader.EventDescriptor.Id) {
3082 case Intel_PresentMon::PresentFrameType_Info::Id: {
3083 if (pEventRecord->EventHeader.EventDescriptor.Version == 0) {
3084 DebugAssert(pEventRecord->UserDataLength == sizeof(Intel_PresentMon::PresentFrameType_Info_Props));
3085
3086 auto props = (Intel_PresentMon::PresentFrameType_Info_Props*)pEventRecord->UserData;
3087 auto event = &mPendingPresentFrameTypeEvents[pEventRecord->EventHeader.ThreadId];
3088 event->FrameId = props->FrameId;
3089 event->FrameType = ConvertPMPFrameTypeToFrameType(props->FrameType);
3090 event->AppFrameId = 0;
3091 } else if (pEventRecord->EventHeader.EventDescriptor.Version == 1) {
3092 DebugAssert(pEventRecord->UserDataLength == sizeof(Intel_PresentMon::PresentFrameType_Info_2_Props));
3093
3094 auto props = (Intel_PresentMon::PresentFrameType_Info_2_Props*)pEventRecord->UserData;
3095 auto event = &mPendingPresentFrameTypeEvents[pEventRecord->EventHeader.ThreadId];
3096 event->FrameId = props->FrameId;
3097 event->FrameType = ConvertPMPFrameTypeToFrameType(props->FrameType);
3098 event->AppFrameId = props->AppFrameId;
3099 } else {
3100 // Unknown version
3101 }
3102 }
3103 return;
3104 case Intel_PresentMon::FlipFrameType_Info::Id:
3105 if (mEnableFlipFrameTypeEvents) {
3106 DebugAssert(pEventRecord->UserDataLength == sizeof(Intel_PresentMon::FlipFrameType_Info_Props));
3107
3108 auto props = (Intel_PresentMon::FlipFrameType_Info_Props*) pEventRecord->UserData;
3109 auto timestamp = pEventRecord->EventHeader.TimeStamp.QuadPart;
3110 auto frameType = ConvertPMPFrameTypeToFrameType(props->FrameType);
3111
3112 // Look up the present associated with this (VidPnSourceId, LayerIndex, PresentId).
3113 //
3114 // It is possible to see the FlipFrameType event before the MMIOFlipMultiPlaneOverlay3_Info
3115 // event, in which case the lookup will fail. In this case we deferr application of the
3116 // FlipFrameType until we see the MMIOFlipMultiPlaneOverlay3_Info event.
3117 auto vidPnLayerId = GenerateVidPnLayerId(props->VidPnSourceId, props->LayerIndex);
3118 auto ii = mPresentByVidPnLayerId.find(vidPnLayerId);
3119 if (ii == mPresentByVidPnLayerId.end()) {
3120 DeferFlipFrameType(vidPnLayerId, props->PresentId, timestamp, frameType);
3121 return;
3122 }
3123
3124 auto present = ii->second;
3125 auto jj = present->PresentIds.find(vidPnLayerId);
3126 if (jj == present->PresentIds.end() || jj->second != props->PresentId) {
3127 DeferFlipFrameType(vidPnLayerId, props->PresentId, timestamp, frameType);
3128 } else {
3129 ApplyFlipFrameType(present, timestamp, frameType);
3130 }
3131 }
3132 return;
3133 }
3134 }
3135

Callers 1

EventRecordCallbackFunction · 0.80

Calls 4

GenerateVidPnLayerIdFunction · 0.85
endMethod · 0.45
GetEventDataMethod · 0.45

Tested by

no test coverage detected