fix(d3d11): guard collector against zero frequency

D3D11_QUERY_DATA_TIMESTAMP_DISJOINT can report Frequency == 0 even
when Disjoint == FALSE. Neither the initial CPU/GPU calibration
loop nor the per-frame Collect() path guarded against this, so
`timestamp * (1000000000 / disjoint.Frequency)` divides by zero
and crashes the profiled application with
EXCEPTION_INT_DIVIDE_BY_ZERO inside client instrumentation code.

Treats a zero frequency the same as an existing guard already does
for a disjoint result: skip/retry in calibration, and in Collect()
advance the checkpoint and drop the batch via TracyD3D11Panic,
matching the existing disjoint-timestamp handling immediately
above it.
This commit is contained in:
Alan Tse
2026-07-19 19:40:50 -07:00
parent ef099b0555
commit dc9dfb2e65

View File

@@ -108,7 +108,7 @@ public:
continue;
}
if (disjoint.Disjoint)
if (disjoint.Disjoint || disjoint.Frequency == 0)
continue;
UINT64 timestamp = 0;
@@ -217,6 +217,13 @@ public:
return;
}
if (disjoint.Frequency == 0)
{
m_previousCheckpoint = m_nextCheckpoint;
TracyD3D11Panic("zero GPU timestamp frequency; dropping.");
return;
}
auto begin = m_previousCheckpoint;
auto end = m_nextCheckpoint;
for (auto i = begin; i != end; ++i)