| 3076 | } |
| 3077 | |
| 3078 | void 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 |
no test coverage detected