i965: Query whether we have kernel support for the TIMESTAMP register once
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 29 Apr 2015 12:32:38 +0000 (13:32 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 8 Jul 2015 09:57:35 +0000 (10:57 +0100)
Move the query for the TIMESTAMP register from context init to the
screen, so that it is only queried once for all contexts.

On 32bit systems, some old kernels trigger a hw bug resulting in the
TIMESTAMP register being shifted and the low 32bits always zero. Detect
this by repeating the read a few times and check the register is
incrementing every 80ns as expected and not stuck on zero (as would be
the case with the buggy kernel/hw.).

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Martin Peres <martin.peres@linux.intel.com>
Reviewed-by: Martin Peres <martin.peres@linux.intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/intel_extensions.c
src/mesa/drivers/dri/i965/intel_screen.c
src/mesa/drivers/dri/i965/intel_screen.h

index 3423190c485a52b7de921b621ae2d4f7955ad9c8..740ac8128bbf7cfd12b824211efa1d8c9ae7e331 100644 (file)
@@ -282,8 +282,6 @@ intelInitExtensions(struct gl_context *ctx)
    }
 
    if (brw->gen >= 6) {
-      uint64_t dummy;
-
       ctx->Extensions.ARB_blend_func_extended =
          !driQueryOptionb(&brw->optionCache, "disable_blend_func_extended");
       ctx->Extensions.ARB_conditional_render_inverted = true;
@@ -307,9 +305,7 @@ intelInitExtensions(struct gl_context *ctx)
       ctx->Extensions.EXT_transform_feedback = true;
       ctx->Extensions.OES_depth_texture_cube_map = true;
 
-      /* Test if the kernel has the ioctl. */
-      if (drm_intel_reg_read(brw->bufmgr, TIMESTAMP, &dummy) == 0)
-         ctx->Extensions.ARB_timer_query = true;
+      ctx->Extensions.ARB_timer_query = brw->intelScreen->hw_has_timestamp;
 
       /* Only enable this in core profile because other parts of Mesa behave
        * slightly differently when the extension is enabled.
index f9398d7859e936ced92733312dd905782bb21182..c0f5c927ed8ff306a3613dc2d0851b1653466e0a 100644 (file)
@@ -1123,6 +1123,27 @@ intel_detect_swizzling(struct intel_screen *screen)
       return true;
 }
 
+static bool
+intel_detect_timestamp(struct intel_screen *screen)
+{
+   uint64_t dummy = 0;
+   int loop = 10;
+
+   /*
+    * On 32bit systems, some old kernels trigger a hw bug resulting in the
+    * TIMESTAMP register being shifted and the low 32bits always zero. Detect
+    * this by repeating the read a few times and check the register is
+    * incrementing every 80ns as expected and not stuck on zero (as would be
+    * the case with the buggy kernel/hw.).
+    */
+   do {
+      if (drm_intel_reg_read(screen->bufmgr, TIMESTAMP, &dummy))
+        return false;
+   } while ((dummy & 0xffffffff) == 0 && --loop);
+
+   return loop > 0;
+}
+
 /**
  * Return array of MSAA modes supported by the hardware. The array is
  * zero-terminated and sorted in decreasing order.
@@ -1378,6 +1399,7 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp)
    intelScreen->hw_must_use_separate_stencil = intelScreen->devinfo->gen >= 7;
 
    intelScreen->hw_has_swizzling = intel_detect_swizzling(intelScreen);
+   intelScreen->hw_has_timestamp = intel_detect_timestamp(intelScreen);
 
    const char *force_msaa = getenv("INTEL_FORCE_MSAA");
    if (force_msaa) {
index 742b3d30eee2a229d8d0c731ae81eb5b9de5fd8e..941e0fcc7523ceeb56cb768a28a5593f4bcfb0cb 100644 (file)
@@ -52,6 +52,8 @@ struct intel_screen
 
    bool hw_has_swizzling;
 
+   bool hw_has_timestamp;
+
    /**
     * Does the kernel support context reset notifications?
     */