Skip to content

Instantly share code, notes, and snippets.

@inactive123
Forked from rossy/timing-info.c
Created December 30, 2017 14:25
Show Gist options
  • Save inactive123/f6e7d9f80e1421e3648401d07c93dae7 to your computer and use it in GitHub Desktop.
Save inactive123/f6e7d9f80e1421e3648401d07c93dae7 to your computer and use it in GitHub Desktop.
#define _WIN32_WINNT 0x0600
#include <windows.h>
#include <dwmapi.h>
#include <stdio.h>
#include <inttypes.h>
uint64_t qpc_freq;
static void print_ratio(const char *name, UNSIGNED_RATIO val)
{
printf("%s: %"PRIu32"/%"PRIu32", %.3fHz\n",
name, (uint32_t)val.uiNumerator, (uint32_t)val.uiDenominator,
(double)val.uiNumerator / (double)val.uiDenominator);
}
static void print_qpc_time_hz(const char *name, QPC_TIME time)
{
printf("%s: %"PRIu64" qpc units, %.3fHz\n", name, (uint64_t)time,
(double)qpc_freq / (double)time);
}
static void print_qpc_time(const char *name, QPC_TIME time)
{
printf("%s: %"PRIu64" qpc units\n", name, (uint64_t)time);
}
static void print_frame_count(const char *name, DWM_FRAME_COUNT frames)
{
printf("%s: %"PRIu64" frames\n", name, (uint64_t)frames);
}
static void print_uint(const char *name, UINT i)
{
printf("%s: %"PRIu32"\n", name, (uint32_t)i);
}
static void print_ulonglong(const char *name, ULONGLONG i)
{
printf("%s: %"PRIu64"\n", name, (uint64_t)i);
}
int main()
{
DWM_TIMING_INFO ti = { .cbSize = sizeof ti };
QueryPerformanceFrequency((LARGE_INTEGER*)&qpc_freq);
printf("\e[2J");
for (;;) {
DwmGetCompositionTimingInfo(NULL, &ti);
printf("\e[0;0H");
print_ratio("rateRefresh", ti.rateRefresh);
print_qpc_time_hz("qpcRefreshPeriod", ti.qpcRefreshPeriod);
print_ratio("rateCompose", ti.rateCompose);
print_qpc_time("qpcVBlank", ti.qpcVBlank);
print_frame_count("cRefresh", ti.cRefresh);
print_uint("cDXRefresh", ti.cDXRefresh);
print_qpc_time("qpcCompose", ti.qpcCompose);
print_frame_count("cFrame", ti.cFrame);
print_uint("cDXPresent", ti.cDXPresent);
print_frame_count("cRefreshFrame", ti.cRefreshFrame);
print_frame_count("cFrameSubmitted", ti.cFrameSubmitted);
print_uint("cDXPresentSubmitted", ti.cDXPresentSubmitted);
print_frame_count("cFrameConfirmed", ti.cFrameConfirmed);
print_uint("cDXPresentConfirmed", ti.cDXPresentConfirmed);
print_frame_count("cRefreshConfirmed", ti.cRefreshConfirmed);
print_uint("cDXRefreshConfirmed", ti.cDXRefreshConfirmed);
print_frame_count("cFramesLate", ti.cFramesLate);
print_uint("cFramesOutstanding", ti.cFramesOutstanding);
print_frame_count("cFrameDisplayed", ti.cFrameDisplayed);
print_qpc_time("qpcFrameDisplayed", ti.qpcFrameDisplayed);
print_frame_count("cRefreshFrameDisplayed", ti.cRefreshFrameDisplayed);
print_frame_count("cFrameComplete", ti.cFrameComplete);
print_qpc_time("qpcFrameComplete", ti.qpcFrameComplete);
print_frame_count("cFramePending", ti.cFramePending);
print_qpc_time("qpcFramePending", ti.qpcFramePending);
print_frame_count("cFramesDisplayed", ti.cFramesDisplayed);
print_frame_count("cFramesComplete", ti.cFramesComplete);
print_frame_count("cFramesPending", ti.cFramesPending);
print_frame_count("cFramesAvailable", ti.cFramesAvailable);
print_frame_count("cFramesDropped", ti.cFramesDropped);
print_frame_count("cFramesMissed", ti.cFramesMissed);
print_frame_count("cRefreshNextDisplayed", ti.cRefreshNextDisplayed);
print_frame_count("cRefreshNextPresented", ti.cRefreshNextPresented);
print_frame_count("cRefreshesDisplayed", ti.cRefreshesDisplayed);
print_frame_count("cRefreshesPresented", ti.cRefreshesPresented);
print_frame_count("cRefreshStarted", ti.cRefreshStarted);
print_ulonglong("cPixelsReceived", ti.cPixelsReceived);
print_ulonglong("cPixelsDrawn", ti.cPixelsDrawn);
print_frame_count("cBuffersEmpty", ti.cBuffersEmpty);
fflush(stdout);
DwmFlush();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment