i965: Use a WC map and memcpy for the batch instead of pwrite.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 8 Sep 2017 22:00:14 +0000 (15:00 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 14 Sep 2017 23:17:36 +0000 (16:17 -0700)
We'd like to eliminate the malloc'd shadow copy eventually, but there
are still unresolved performance problems.  In the meantime, let's at
least get rid of pwrite.

On Apollolake, improves Synmark OglBatch6 performance by:
1.53581% +/- 0.269589% (n=108).

Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
src/mesa/drivers/dri/i965/intel_batchbuffer.c

index 276fe458a133b10354d2ac659b50431d85a14d47..9cd491b5acef6438482a780ba5890248c6b5ab9c 100644 (file)
@@ -629,18 +629,16 @@ do_flush_locked(struct brw_context *brw, int in_fence_fd, int *out_fence_fd)
    struct intel_batchbuffer *batch = &brw->batch;
    int ret = 0;
 
-   if (devinfo->has_llc) {
-      brw_bo_unmap(batch->bo);
-   } else {
-      ret = brw_bo_subdata(batch->bo, 0, 4 * USED_BATCH(*batch), batch->map);
-      if (ret == 0 && batch->state_batch_offset != batch->bo->size) {
-         ret = brw_bo_subdata(batch->bo,
-                              batch->state_batch_offset,
-                              batch->bo->size - batch->state_batch_offset,
-                              (char *)batch->map + batch->state_batch_offset);
-      }
+   if (batch->cpu_map) {
+      void *bo_map = brw_bo_map(brw, batch->bo, MAP_WRITE);
+      memcpy(bo_map, batch->cpu_map, 4 * USED_BATCH(*batch));
+      memcpy(bo_map + batch->state_batch_offset,
+             (char *) batch->cpu_map + batch->state_batch_offset,
+             batch->bo->size - batch->state_batch_offset);
    }
 
+   brw_bo_unmap(batch->bo);
+
    if (!brw->screen->no_hw) {
       /* The requirement for using I915_EXEC_NO_RELOC are:
        *