intel: common: express timestamps units in frequency
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Thu, 15 Jun 2017 14:22:19 +0000 (15:22 +0100)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Mon, 19 Jun 2017 21:11:00 +0000 (22:11 +0100)
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 <lionel.g.landwerlin@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/intel/common/gen_device_info.c
src/intel/common/gen_device_info.h
src/intel/vulkan/anv_device.c
src/mesa/drivers/dri/i965/brw_queryobj.c

index 89a0d9e9e764507da7cc961d57cf9c905fac1ac4..14d3761076fa52d1d41a507784d9709a28b1623f 100644 (file)
@@ -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 = {                              \
index 4a467cca3eff1ed852fbda6ff8c0bdd16d511678..86daf6e5337848050335f521b71121a17cbe6f49 100644 (file)
@@ -26,6 +26,7 @@
 #define GEN_DEVICE_INFO_H
 
 #include <stdbool.h>
+#include <stdint.h>
 
 /**
  * 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;
 
    /** @} */
 };
index 8e8c50200b1ffde4a7c43158dc07c4c76fcbceff..2423aa3468f4119dd7ef41b40649769168a4cadc 100644 (file)
@@ -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,
index bccd33b9d38651348203050b80d09aa1b8c9fad9..04ce9a94cad2abbe878125a07ceaa58939260016 100644 (file)
@@ -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