@@ -41,6 +41,7 @@ enum Header {
4141 Header_DisplayedTime,
4242 Header_AnimationError,
4343 Header_ClickToPhotonLatency,
44+ Header_AllInputToPhotonLatency,
4445
4546 // --v1_metrics
4647 Header_Runtime,
@@ -88,54 +89,56 @@ struct v2Metrics {
8889 std::optional<double > displayedTime;
8990 std::optional<double > animationError;
9091 std::optional<double > clickToPhotonLatency;
92+ std::optional<double > AllInputToPhotonLatency;
9193};
9294
9395constexpr char const * GetHeaderString (Header h)
9496{
9597 switch (h) {
96- case Header_Application: return " Application" ;
97- case Header_ProcessID: return " ProcessID" ;
98- case Header_SwapChainAddress: return " SwapChainAddress" ;
99- case Header_PresentRuntime: return " PresentRuntime" ;
100- case Header_SyncInterval: return " SyncInterval" ;
101- case Header_PresentFlags: return " PresentFlags" ;
102- case Header_AllowsTearing: return " AllowsTearing" ;
103- case Header_PresentMode: return " PresentMode" ;
104- case Header_FrameType: return " FrameType" ;
105- case Header_CPUStartTime: return " CPUStartTime" ;
106- case Header_CPUStartQPC: return " CPUStartQPC" ;
107- case Header_CPUStartQPCTime: return " CPUStartQPCTime" ;
108- case Header_CPUStartDateTime: return " CPUStartDateTime" ;
109- case Header_FrameTime: return " FrameTime" ;
110- case Header_CPUBusy: return " CPUBusy" ;
111- case Header_CPUWait: return " CPUWait" ;
112- case Header_GPULatency: return " GPULatency" ;
113- case Header_GPUTime: return " GPUTime" ;
114- case Header_GPUBusy: return " GPUBusy" ;
115- case Header_VideoBusy: return " VideoBusy" ;
116- case Header_GPUWait: return " GPUWait" ;
117- case Header_DisplayLatency: return " DisplayLatency" ;
118- case Header_DisplayedTime: return " DisplayedTime" ;
119- case Header_AnimationError: return " AnimationError" ;
120- case Header_ClickToPhotonLatency: return " ClickToPhotonLatency" ;
121-
122- case Header_Runtime: return " Runtime" ;
123- case Header_Dropped: return " Dropped" ;
124- case Header_TimeInSeconds: return " TimeInSeconds" ;
125- case Header_msBetweenPresents: return " msBetweenPresents" ;
126- case Header_msInPresentAPI: return " msInPresentAPI" ;
127- case Header_msBetweenDisplayChange: return " msBetweenDisplayChange" ;
128- case Header_msUntilRenderComplete: return " msUntilRenderComplete" ;
129- case Header_msUntilDisplayed: return " msUntilDisplayed" ;
130- case Header_msUntilRenderStart: return " msUntilRenderStart" ;
131- case Header_msGPUActive: return " msGPUActive" ;
132- case Header_msGPUVideoActive: return " msGPUVideoActive" ;
133- case Header_msSinceInput: return " msSinceInput" ;
134- case Header_QPCTime: return " QPCTime" ;
135-
136- case Header_WasBatched: return " WasBatched" ;
137- case Header_DwmNotified: return " DwmNotified" ;
138- default : return " <unknown>" ;
98+ case Header_Application: return " Application" ;
99+ case Header_ProcessID: return " ProcessID" ;
100+ case Header_SwapChainAddress: return " SwapChainAddress" ;
101+ case Header_PresentRuntime: return " PresentRuntime" ;
102+ case Header_SyncInterval: return " SyncInterval" ;
103+ case Header_PresentFlags: return " PresentFlags" ;
104+ case Header_AllowsTearing: return " AllowsTearing" ;
105+ case Header_PresentMode: return " PresentMode" ;
106+ case Header_FrameType: return " FrameType" ;
107+ case Header_CPUStartTime: return " CPUStartTime" ;
108+ case Header_CPUStartQPC: return " CPUStartQPC" ;
109+ case Header_CPUStartQPCTime: return " CPUStartQPCTime" ;
110+ case Header_CPUStartDateTime: return " CPUStartDateTime" ;
111+ case Header_FrameTime: return " FrameTime" ;
112+ case Header_CPUBusy: return " CPUBusy" ;
113+ case Header_CPUWait: return " CPUWait" ;
114+ case Header_GPULatency: return " GPULatency" ;
115+ case Header_GPUTime: return " GPUTime" ;
116+ case Header_GPUBusy: return " GPUBusy" ;
117+ case Header_VideoBusy: return " VideoBusy" ;
118+ case Header_GPUWait: return " GPUWait" ;
119+ case Header_DisplayLatency: return " DisplayLatency" ;
120+ case Header_DisplayedTime: return " DisplayedTime" ;
121+ case Header_AnimationError: return " AnimationError" ;
122+ case Header_ClickToPhotonLatency: return " ClickToPhotonLatency" ;
123+ case Header_AllInputToPhotonLatency: return " AllInputToPhotonLatency" ;
124+
125+ case Header_Runtime: return " Runtime" ;
126+ case Header_Dropped: return " Dropped" ;
127+ case Header_TimeInSeconds: return " TimeInSeconds" ;
128+ case Header_msBetweenPresents: return " msBetweenPresents" ;
129+ case Header_msInPresentAPI: return " msInPresentAPI" ;
130+ case Header_msBetweenDisplayChange: return " msBetweenDisplayChange" ;
131+ case Header_msUntilRenderComplete: return " msUntilRenderComplete" ;
132+ case Header_msUntilDisplayed: return " msUntilDisplayed" ;
133+ case Header_msUntilRenderStart: return " msUntilRenderStart" ;
134+ case Header_msGPUActive: return " msGPUActive" ;
135+ case Header_msGPUVideoActive: return " msGPUVideoActive" ;
136+ case Header_msSinceInput: return " msSinceInput" ;
137+ case Header_QPCTime: return " QPCTime" ;
138+
139+ case Header_WasBatched: return " WasBatched" ;
140+ case Header_DwmNotified: return " DwmNotified" ;
141+ default : return " <unknown>" ;
139142 }
140143}
141144
@@ -294,7 +297,7 @@ class CsvParser {
294297 bool Open (std::wstring const & path, uint32_t processId);
295298 void Close ();
296299 bool VerifyBlobAgainstCsv (const std::string& processName, const unsigned int & processId,
297- PM_QUERY_ELEMENT (&queryElements)[18 ], pmapi::BlobContainer& blobs);
300+ PM_QUERY_ELEMENT (&queryElements)[19 ], pmapi::BlobContainer& blobs);
298301 bool ResetCsv ();
299302
300303private:
@@ -323,7 +326,7 @@ CsvParser::CsvParser()
323326{}
324327
325328bool CsvParser::VerifyBlobAgainstCsv (const std::string& processName, const unsigned int & processId,
326- PM_QUERY_ELEMENT (&queryElements)[18 ], pmapi::BlobContainer& blobs)
329+ PM_QUERY_ELEMENT (&queryElements)[19 ], pmapi::BlobContainer& blobs)
327330{
328331
329332 for (auto pBlob : blobs) {
@@ -346,7 +349,8 @@ bool CsvParser::VerifyBlobAgainstCsv(const std::string& processName, const unsig
346349 const auto displayLatency = *reinterpret_cast <const double *>(&pBlob[queryElements[14 ].dataOffset ]);
347350 const auto displayedTime = *reinterpret_cast <const double *>(&pBlob[queryElements[15 ].dataOffset ]);
348351 const auto animationError = *reinterpret_cast <const double *>(&pBlob[queryElements[16 ].dataOffset ]);
349- const auto clickToPhotonLatency = *reinterpret_cast <const double *>(&pBlob[queryElements[17 ].dataOffset ]);
352+ const auto allInputToPhotonLatency = *reinterpret_cast <const double *>(&pBlob[queryElements[17 ].dataOffset ]);
353+ const auto clickToPhotonLatency = *reinterpret_cast <const double *>(&pBlob[queryElements[18 ].dataOffset ]);
350354
351355 // Read rows until we find one with the process we are interested in
352356 // or we are out of data.
@@ -479,6 +483,21 @@ bool CsvParser::VerifyBlobAgainstCsv(const std::string& processName, const unsig
479483 }
480484 }
481485 break ;
486+ case Header_AllInputToPhotonLatency:
487+ if (v2MetricRow_.AllInputToPhotonLatency .has_value ()) {
488+ columnsMatch = Validate (v2MetricRow_.AllInputToPhotonLatency .value (), allInputToPhotonLatency);
489+ }
490+ else
491+ {
492+ if (std::isnan (allInputToPhotonLatency)) {
493+ columnsMatch = true ;
494+ }
495+ else
496+ {
497+ columnsMatch = false ;
498+ }
499+ }
500+ break ;
482501 default :
483502 columnsMatch = true ;
484503 break ;
@@ -590,7 +609,8 @@ bool CsvParser::Open(std::wstring const& path, uint32_t processId) {
590609 Header_DisplayLatency,
591610 Header_DisplayedTime,
592611 Header_AnimationError,
593- Header_ClickToPhotonLatency, });
612+ Header_ClickToPhotonLatency,
613+ Header_AllInputToPhotonLatency});
594614
595615 if (!columnsOK) {
596616 Assert::Fail (L" Missing required columns" );
@@ -784,6 +804,19 @@ void CsvParser::ConvertToMetricDataType(const char* data, Header columnId)
784804 }
785805 }
786806 break ;
807+ case Header_AllInputToPhotonLatency:
808+ {
809+ if (strncmp (data, " NA" , 2 ) != 0 ) {
810+ double convertedData = 0 .;
811+ CharConvert<double > converter;
812+ converter.Convert (data, convertedData, columnId, line_);
813+ v2MetricRow_.AllInputToPhotonLatency = convertedData;
814+ }
815+ else {
816+ v2MetricRow_.AllInputToPhotonLatency .reset ();
817+ }
818+ }
819+ break ;
787820 default :
788821 Assert::Fail (CreateErrorString (UnknownHeader, line_).c_str ());
789822 }
0 commit comments