From c77d98ef32a0f9763d4c8945527d00ab98e748cc Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Thu, 15 Jun 2017 15:22:19 +0100 Subject: [PATCH] intel: common: express timestamps units in frequency Rather than storing the period as a double that looses some precision. Also fixes the Gen9LP timestamp frequency which is no 19200123 but 19200000 as pointed by Ville : https://lists.freedesktop.org/archives/intel-gfx/2017-April/125126.html Finally add the Cannonlake timestamp frequency. Signed-off-by: Lionel Landwerlin Reviewed-by: Kenneth Graunke --- src/intel/common/gen_device_info.c | 19 ++++++++++--------- src/intel/common/gen_device_info.h | 5 +++-- src/intel/vulkan/anv_device.c | 2 +- src/mesa/drivers/dri/i965/brw_queryobj.c | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/intel/common/gen_device_info.c b/src/intel/common/gen_device_info.c index 89a0d9e9e76..14d3761076f 100644 --- a/src/intel/common/gen_device_info.c +++ b/src/intel/common/gen_device_info.c @@ -36,7 +36,7 @@ static const struct gen_device_info gen_device_info_i965 = { .urb = { .size = 256, }, - .timebase_scale = 80, + .timestamp_frequency = 12500000, }; static const struct gen_device_info gen_device_info_g4x = { @@ -52,7 +52,7 @@ static const struct gen_device_info gen_device_info_g4x = { .urb = { .size = 384, }, - .timebase_scale = 80, + .timestamp_frequency = 12500000, }; static const struct gen_device_info gen_device_info_ilk = { @@ -67,7 +67,7 @@ static const struct gen_device_info gen_device_info_ilk = { .urb = { .size = 1024, }, - .timebase_scale = 80, + .timestamp_frequency = 12500000, }; static const struct gen_device_info gen_device_info_snb_gt1 = { @@ -92,7 +92,7 @@ static const struct gen_device_info gen_device_info_snb_gt1 = { [MESA_SHADER_GEOMETRY] = 256, }, }, - .timebase_scale = 80, + .timestamp_frequency = 12500000, }; static const struct gen_device_info gen_device_info_snb_gt2 = { @@ -117,7 +117,7 @@ static const struct gen_device_info gen_device_info_snb_gt2 = { [MESA_SHADER_GEOMETRY] = 256, }, }, - .timebase_scale = 80, + .timestamp_frequency = 12500000, }; #define GEN7_FEATURES \ @@ -127,7 +127,7 @@ static const struct gen_device_info gen_device_info_snb_gt2 = { .has_llc = true, \ .has_pln = true, \ .has_surface_tile_offset = true, \ - .timebase_scale = 80 + .timestamp_frequency = 12500000 static const struct gen_device_info gen_device_info_ivb_gt1 = { GEN7_FEATURES, .is_ivybridge = true, .gt = 1, @@ -300,7 +300,7 @@ static const struct gen_device_info gen_device_info_hsw_gt3 = { .max_tes_threads = 504, \ .max_gs_threads = 504, \ .max_wm_threads = 384, \ - .timebase_scale = 80 + .timestamp_frequency = 12500000 static const struct gen_device_info gen_device_info_bdw_gt1 = { GEN8_FEATURES, .gt = 1, @@ -398,7 +398,7 @@ static const struct gen_device_info gen_device_info_chv = { .max_tcs_threads = 336, \ .max_tes_threads = 336, \ .max_cs_threads = 56, \ - .timebase_scale = 1000000000.0 / 12000000.0, \ + .timestamp_frequency = 12000000, \ .urb = { \ .size = 384, \ .min_entries = { \ @@ -423,7 +423,7 @@ static const struct gen_device_info gen_device_info_chv = { .max_tes_threads = 112, \ .max_gs_threads = 112, \ .max_cs_threads = 6 * 6, \ - .timebase_scale = 1000000000.0 / 19200123.0, \ + .timestamp_frequency = 19200000, \ .urb = { \ .size = 192, \ .min_entries = { \ @@ -595,6 +595,7 @@ static const struct gen_device_info gen_device_info_glk_2x6 = { .max_tcs_threads = 432, \ .max_tes_threads = 624, \ .max_cs_threads = 56, \ + .timestamp_frequency = 19200000, \ .urb = { \ .size = 256, \ .min_entries = { \ diff --git a/src/intel/common/gen_device_info.h b/src/intel/common/gen_device_info.h index 4a467cca3ef..86daf6e5337 100644 --- a/src/intel/common/gen_device_info.h +++ b/src/intel/common/gen_device_info.h @@ -26,6 +26,7 @@ #define GEN_DEVICE_INFO_H #include +#include /** * Intel hardware information and quirks @@ -159,7 +160,7 @@ struct gen_device_info * corresponded to 80 nanoseconds. * * Since Gen9 the numbers aren't so round, with a a frequency of 12MHz for - * SKL (or scale factor of 83.33333333) and a frequency of 19200123Hz for + * SKL (or scale factor of 83.33333333) and a frequency of 19200000Hz for * BXT. * * For simplicty to fit with the current code scaling by a single constant @@ -174,7 +175,7 @@ struct gen_device_info * E.g. with crude testing on my system using the 'correct' scale factor I'm * seeing a drift of ~2 milliseconds per second. */ - double timebase_scale; + uint64_t timestamp_frequency; /** @} */ }; diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 8e8c50200b1..2423aa3468f 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -868,7 +868,7 @@ void anv_GetPhysicalDeviceProperties( .storageImageSampleCounts = VK_SAMPLE_COUNT_1_BIT, .maxSampleMaskWords = 1, .timestampComputeAndGraphics = false, - .timestampPeriod = devinfo->timebase_scale, + .timestampPeriod = 1000000000ull / devinfo->timestamp_frequency, .maxClipDistances = 8, .maxCullDistances = 8, .maxCombinedClipAndCullDistances = 8, diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/dri/i965/brw_queryobj.c index bccd33b9d38..04ce9a94cad 100644 --- a/src/mesa/drivers/dri/i965/brw_queryobj.c +++ b/src/mesa/drivers/dri/i965/brw_queryobj.c @@ -47,7 +47,7 @@ brw_timebase_scale(struct brw_context *brw, uint64_t gpu_timestamp) { const struct gen_device_info *devinfo = &brw->screen->devinfo; - return (double)gpu_timestamp * devinfo->timebase_scale; + return (1000000000ull * gpu_timestamp) / devinfo->timestamp_frequency; } /* As best we know currently, the Gen HW timestamps are 36bits across -- 2.30.2