i965: Use brw_bo_wait() for brw_bo_wait_rendering()
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 7 Jul 2017 12:12:54 +0000 (13:12 +0100)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 10 Jul 2017 18:18:08 +0000 (11:18 -0700)
Currently, we use set_domain() to cause a stall on rendering. But the
set-domain ioctl has the side-effect of changing the kernel's cache
domain underneath the struct_mutex, which may perturb state if there was
no rendering to wait upon and in general is much heavier than the
lockless wait-ioctl. Historically libdrm used set-domain as we did not
have an explicit wait-ioctl (and the patches to teach it to use wait if
available were lost in the mists). Since mesa already depends upon a
kernel support the wait-ioctl, we do not need to supply a fallback.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_bufmgr.c
src/mesa/drivers/dri/i965/brw_bufmgr.h
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/i965/brw_performance_query.c
src/mesa/drivers/dri/i965/intel_batchbuffer.c

index da12a131526a05863565593186df86864e7aac45..ee4a5cfa2c874e68a63015091cc519e7d4603846 100644 (file)
@@ -831,10 +831,12 @@ brw_bo_get_subdata(struct brw_bo *bo, uint64_t offset,
 
 /** Waits for all GPU rendering with the object to have completed. */
 void
-brw_bo_wait_rendering(struct brw_context *brw, struct brw_bo *bo)
+brw_bo_wait_rendering(struct brw_bo *bo)
 {
-   set_domain(brw, "waiting for",
-              bo, I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
+   /* We require a kernel recent enough for WAIT_IOCTL support.
+    * See intel_init_bufmgr()
+    */
+   brw_bo_wait(bo, -1);
 }
 
 /**
index 4d671b6aaeb104d869646d32867ee0db4678714c..80c71825e80dd989bc9d2db62e7ee567761271f7 100644 (file)
@@ -227,7 +227,7 @@ int brw_bo_get_subdata(struct brw_bo *bo, uint64_t offset,
  * bo_subdata, etc.  It is merely a way for the driver to implement
  * glFinish.
  */
-void brw_bo_wait_rendering(struct brw_context *brw, struct brw_bo *bo);
+void brw_bo_wait_rendering(struct brw_bo *bo);
 
 /**
  * Tears down the buffer manager instance.
index 0b3fdc6842916aba9231a59e7a5e896e280e71f4..8a3ffab443f9c72eb43e4a404c04335c5cf32dcf 100644 (file)
@@ -256,7 +256,7 @@ intel_finish(struct gl_context * ctx)
    intel_glFlush(ctx);
 
    if (brw->batch.last_bo)
-      brw_bo_wait_rendering(brw, brw->batch.last_bo);
+      brw_bo_wait_rendering(brw->batch.last_bo);
 }
 
 static void
index 81389dbd3e3876cc66493260b59d9da64e4da787..e4e1854bf2e8e3ea456fe00cbc6bd9aaefd97a27 100644 (file)
@@ -1350,7 +1350,7 @@ brw_wait_perf_query(struct gl_context *ctx, struct gl_perf_query_object *o)
    if (brw_batch_references(&brw->batch, bo))
       intel_batchbuffer_flush(brw);
 
-   brw_bo_wait_rendering(brw, bo);
+   brw_bo_wait_rendering(bo);
 
    /* Due to a race condition between the OA unit signaling report
     * availability and the report actually being written into memory,
index 62d2fe8ef35b4bb0271b8252a93124706cf9108c..28c2f474c0a1f019b2ba54157f04089713a63923 100644 (file)
@@ -497,7 +497,7 @@ throttle(struct brw_context *brw)
             /* Pass NULL rather than brw so we avoid perf_debug warnings;
              * stalling is common and expected here...
              */
-            brw_bo_wait_rendering(NULL, brw->throttle_batch[1]);
+            brw_bo_wait_rendering(brw->throttle_batch[1]);
          }
          brw_bo_unreference(brw->throttle_batch[1]);
       }
@@ -723,7 +723,7 @@ _intel_batchbuffer_flush_fence(struct brw_context *brw,
 
    if (unlikely(INTEL_DEBUG & DEBUG_SYNC)) {
       fprintf(stderr, "waiting for idle\n");
-      brw_bo_wait_rendering(brw, brw->batch.bo);
+      brw_bo_wait_rendering(brw->batch.bo);
    }
 
    /* Start a new batch buffer. */