debugging timestamps...

This commit is contained in:
Marcos Slomp 2024-02-07 11:00:14 -08:00
parent 47180dbf7f
commit 4b695cc3dd

View File

@ -117,6 +117,8 @@ public:
MTLTimestamp gpuTimestamp = 0; MTLTimestamp gpuTimestamp = 0;
float period = 1.0f; float period = 1.0f;
[m_device sampleTimestamps:&cpuTimestamp gpuTimestamp:&gpuTimestamp]; [m_device sampleTimestamps:&cpuTimestamp gpuTimestamp:&gpuTimestamp];
fprintf(stdout, "TracyMetal: Calibration: CPU timestamp: %llu\n", cpuTimestamp);
fprintf(stdout, "TracyMetal: Calibration: GPU timestamp: %llu\n", gpuTimestamp);
m_contextId = GetGpuCtxCounter().fetch_add(1); m_contextId = GetGpuCtxCounter().fetch_add(1);
@ -205,31 +207,38 @@ public:
if (count >= MaxQueries) if (count >= MaxQueries)
{ {
TracyMetalPanic("too many pending timestamp queries.", return false;); TracyMetalPanic("Collect: too many pending timestamp queries.", return false;);
} }
NSRange range = { begin, latestCheckpoint }; NSRange range = NSMakeRange(begin, count);
NSData* data = [m_counterSampleBuffer resolveCounterRange:range]; NSData* data = [m_counterSampleBuffer resolveCounterRange:range];
NSUInteger numResolvedTimestamps = data.length / sizeof(MTLCounterResultTimestamp); NSUInteger numResolvedTimestamps = data.length / sizeof(MTLCounterResultTimestamp);
MTLCounterResultTimestamp* timestamps = (MTLCounterResultTimestamp *)(data.bytes); MTLCounterResultTimestamp* timestamps = (MTLCounterResultTimestamp *)(data.bytes);
if (timestamps == nil) if (timestamps == nil)
{ {
TracyMetalPanic("unable to resolve timestamps.", return false;); TracyMetalPanic("Collect: unable to resolve timestamps.", return false;);
} }
for (auto i = 0; i < numResolvedTimestamps; ++i) for (auto i = 0; i < numResolvedTimestamps; ++i)
{ {
uint32_t k = RingIndex(i); MTLTimestamp& timestamp = timestamps[i].timestamp;
MTLTimestamp& timestamp = timestamps[k].timestamp;
// TODO: check the value of timestamp: MTLCounterErrorValue, zero, or valid // TODO: check the value of timestamp: MTLCounterErrorValue, zero, or valid
if (timestamp == MTLCounterErrorValue) if (timestamp == MTLCounterErrorValue)
{ {
TracyMetalPanic("Collect: invalid timestamp: MTLCounterErrorValue (0xFF..FF).");
break;
}
if (timestamp == 0)
{
TracyMetalPanic("Collect: invalid timestamp: zero.");
break; break;
} }
m_previousCheckpoint += 1; m_previousCheckpoint += 1;
uint32_t k = RingIndex(begin + i);
fprintf(stdout, "TracyMetal: timestamp[%d]: %llu\n", k, timestamp);
auto* item = Profiler::QueueSerial(); auto* item = Profiler::QueueSerial();
MemWrite(&item->hdr.type, QueueType::GpuTime); MemWrite(&item->hdr.type, QueueType::GpuTime);
MemWrite(&item->gpuTime.gpuTime, timestamp); MemWrite(&item->gpuTime.gpuTime, static_cast<int64_t>(timestamp));
MemWrite(&item->gpuTime.queryId, static_cast<uint16_t>(k)); MemWrite(&item->gpuTime.queryId, static_cast<uint16_t>(k));
MemWrite(&item->gpuTime.context, m_contextId); MemWrite(&item->gpuTime.context, m_contextId);
Profiler::QueueSerialFinish(); Profiler::QueueSerialFinish();
@ -260,7 +269,7 @@ private:
auto id = m_queryCounter.fetch_add(n); auto id = m_queryCounter.fetch_add(n);
if (RingCount(m_previousCheckpoint, id) >= MaxQueries) if (RingCount(m_previousCheckpoint, id) >= MaxQueries)
{ {
TracyMetalPanic("too many pending timestamp queries."); TracyMetalPanic("NextQueryId: too many pending timestamp queries.");
// #TODO: return some sentinel value; ideally a "hidden" query index // #TODO: return some sentinel value; ideally a "hidden" query index
} }
return RingIndex(id); return RingIndex(id);