mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-11-27 12:14:10 +08:00
perfetto/pps-producer: add optimized cpu/gpu timestamp correlation support
The Intel Xe driver added the ability to do cpu/gpu timestamp correlation giving a much better alignment of timestamps (we use to have ~20us delta between the 2 samples, just because of the ioctl barrier potentially sneaking in some work). Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: José Roberto de Souza <jose.souza@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24591>
This commit is contained in:
parent
fdec724bd1
commit
b2bf141b6a
@ -710,4 +710,11 @@ FreedrenoDriver::gpu_timestamp() const
|
||||
return perfetto::base::GetBootTimeNs().count();
|
||||
}
|
||||
|
||||
bool
|
||||
FreedrenoDriver::cpu_gpu_timestamp(uint64_t &, uint64_t &) const
|
||||
{
|
||||
/* Not supported */
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace pps
|
||||
|
@ -31,6 +31,8 @@ public:
|
||||
uint64_t next() override;
|
||||
uint32_t gpu_clock_id() const override;
|
||||
uint64_t gpu_timestamp() const override;
|
||||
bool cpu_gpu_timestamp(uint64_t &cpu_timestamp,
|
||||
uint64_t &gpu_timestamp) const override;
|
||||
|
||||
private:
|
||||
struct fd_device *dev;
|
||||
|
@ -342,4 +342,21 @@ uint64_t IntelDriver::gpu_timestamp() const
|
||||
return intel_device_info_timebase_scale(&perf->devinfo, timestamp);
|
||||
}
|
||||
|
||||
bool IntelDriver::cpu_gpu_timestamp(uint64_t &cpu_timestamp,
|
||||
uint64_t &gpu_timestamp) const
|
||||
{
|
||||
if (!intel_gem_read_correlate_cpu_gpu_timestamp(drm_device.fd,
|
||||
perf->devinfo.kmd_type,
|
||||
INTEL_ENGINE_CLASS_RENDER, 0,
|
||||
CLOCK_BOOTTIME,
|
||||
&cpu_timestamp,
|
||||
&gpu_timestamp,
|
||||
NULL))
|
||||
return false;
|
||||
|
||||
gpu_timestamp =
|
||||
intel_device_info_timebase_scale(&perf->devinfo, gpu_timestamp);
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace pps
|
||||
|
@ -49,6 +49,8 @@ class IntelDriver : public Driver
|
||||
uint64_t next() override;
|
||||
uint32_t gpu_clock_id() const override;
|
||||
uint64_t gpu_timestamp() const override;
|
||||
bool cpu_gpu_timestamp(uint64_t &cpu_timestamp,
|
||||
uint64_t &gpu_timestamp) const override;
|
||||
|
||||
private:
|
||||
/// @brief Requests the next perf sample
|
||||
|
@ -180,4 +180,11 @@ PanfrostDriver::gpu_timestamp() const
|
||||
return perfetto::base::GetBootTimeNs().count();
|
||||
}
|
||||
|
||||
bool
|
||||
PanfrostDriver::cpu_gpu_timestamp(uint64_t &, uint64_t &) const
|
||||
{
|
||||
/* Not supported */
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace pps
|
||||
|
@ -42,6 +42,8 @@ class PanfrostDriver : public Driver {
|
||||
uint64_t next() override;
|
||||
uint32_t gpu_clock_id() const override;
|
||||
uint64_t gpu_timestamp() const override;
|
||||
bool cpu_gpu_timestamp(uint64_t &cpu_timestamp,
|
||||
uint64_t &gpu_timestamp) const override;
|
||||
|
||||
uint64_t last_dump_ts = 0;
|
||||
|
||||
|
@ -245,8 +245,14 @@ void add_timestamp(perfetto::protos::pbzero::ClockSnapshot *event, const Driver
|
||||
return;
|
||||
|
||||
// Send a correlation event between GPU & CPU timestamps
|
||||
uint64_t cpu_ts = perfetto::base::GetBootTimeNs().count();
|
||||
uint64_t gpu_ts = driver->gpu_timestamp();
|
||||
uint64_t cpu_ts, gpu_ts;
|
||||
|
||||
// Try to use the optimized driver correlation if available, otherwise do a
|
||||
// separate CPU & GPU sample
|
||||
if (!driver->cpu_gpu_timestamp(cpu_ts, gpu_ts)) {
|
||||
cpu_ts = perfetto::base::GetBootTimeNs().count();
|
||||
gpu_ts = driver->gpu_timestamp();
|
||||
}
|
||||
|
||||
{
|
||||
auto clock = event->add_clocks();
|
||||
|
@ -84,6 +84,12 @@ class Driver
|
||||
/// Sample a timestamp from the GPU
|
||||
virtual uint64_t gpu_timestamp() const = 0;
|
||||
|
||||
/// Sample a timestamp from both the CPU & the GPU
|
||||
///
|
||||
/// This is useful when the driver can do a better timestamp correlation
|
||||
/// than sampling separately CPU & GPU timestamps.
|
||||
virtual bool cpu_gpu_timestamp(uint64_t &cpu_timestamp, uint64_t &gpu_timestamp) const = 0;
|
||||
|
||||
DrmDevice drm_device;
|
||||
|
||||
/// List of counter groups
|
||||
|
Loading…
Reference in New Issue
Block a user