sna: Be move conservative with tiling sizes for older fenced gen
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 5 Nov 2013 08:38:22 +0000 (08:38 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 5 Nov 2013 08:38:22 +0000 (08:38 +0000)
The older generations have stricter requirements for alignment of fenced
GPU surfaces, so accommodate this by reducing our estimate available
space for the temporary tile.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
src/sna/kgem.c
src/sna/sna_blt.c
src/sna/sna_tiling.c

index 21f958c..00d0723 100644 (file)
@@ -4830,20 +4830,28 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
                        if (kgem->nfence >= kgem->fence_max)
                                return false;
 
-                       size = 3*kgem->aperture_fenced;
-                       if (kgem->aperture_total == kgem->aperture_mappable)
-                               size += kgem->aperture;
-                       if (size > kgem->aperture_mappable &&
-                           kgem_ring_is_idle(kgem, kgem->ring))
-                               return false;
+                       if (kgem->aperture_fenced) {
+                               size = 3*kgem->aperture_fenced;
+                               if (kgem->aperture_total == kgem->aperture_mappable)
+                                       size += kgem->aperture;
+                               if (size > kgem->aperture_mappable &&
+                                   kgem_ring_is_idle(kgem, kgem->ring)) {
+                                       DBG(("%s: opportunistic fence flush\n", __FUNCTION__));
+                                       return false;
+                               }
+                       }
 
                        size = kgem->aperture_fenced;
                        size += kgem_bo_fenced_size(kgem, bo);
-                       size *= 2;
+                       if (kgem->gen < 033)
+                               size *= 2;
                        if (kgem->aperture_total == kgem->aperture_mappable)
                                size += kgem->aperture;
-                       if (size > kgem->aperture_mappable)
+                       if (size > kgem->aperture_mappable) {
+                               DBG(("%s: estimated fence space required [%d] exceed aperture [%d]\n",
+                                    __FUNCTION__, size, kgem->aperture_mappable));
                                return false;
+                       }
                }
 
                return true;
@@ -4866,20 +4874,28 @@ bool kgem_check_bo_fenced(struct kgem *kgem, struct kgem_bo *bo)
                if (kgem->nfence >= kgem->fence_max)
                        return false;
 
-               size = 3*kgem->aperture_fenced;
-               if (kgem->aperture_total == kgem->aperture_mappable)
-                       size += kgem->aperture;
-               if (size > kgem->aperture_mappable &&
-                   kgem_ring_is_idle(kgem, kgem->ring))
-                       return false;
+               if (kgem->aperture_fenced) {
+                       size = 3*kgem->aperture_fenced;
+                       if (kgem->aperture_total == kgem->aperture_mappable)
+                               size += kgem->aperture;
+                       if (size > kgem->aperture_mappable &&
+                           kgem_ring_is_idle(kgem, kgem->ring)) {
+                               DBG(("%s: opportunistic fence flush\n", __FUNCTION__));
+                               return false;
+                       }
+               }
 
                size = kgem->aperture_fenced;
                size += kgem_bo_fenced_size(kgem, bo);
-               size *= 2;
+               if (kgem->gen < 033)
+                       size *= 2;
                if (kgem->aperture_total == kgem->aperture_mappable)
                        size += kgem->aperture;
-               if (size > kgem->aperture_mappable)
+               if (size > kgem->aperture_mappable) {
+                       DBG(("%s: estimated fence space required [%d] exceed aperture [%d]\n",
+                            __FUNCTION__, size, kgem->aperture_mappable));
                        return false;
+               }
        }
 
        if (kgem->aperture + kgem->aperture_fenced + num_pages(bo) > kgem->aperture_high) {
@@ -4948,20 +4964,28 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
                if (kgem->nfence + num_fence > kgem->fence_max)
                        return false;
 
-               size = 3*kgem->aperture_fenced;
-               if (kgem->aperture_total == kgem->aperture_mappable)
-                       size += kgem->aperture;
-               if (size > kgem->aperture_mappable &&
-                   kgem_ring_is_idle(kgem, kgem->ring))
-                       return false;
+               if (kgem->aperture_fenced) {
+                       size = 3*kgem->aperture_fenced;
+                       if (kgem->aperture_total == kgem->aperture_mappable)
+                               size += kgem->aperture;
+                       if (size > kgem->aperture_mappable &&
+                           kgem_ring_is_idle(kgem, kgem->ring)) {
+                               DBG(("%s: opportunistic fence flush\n", __FUNCTION__));
+                               return false;
+                       }
+               }
 
                size = kgem->aperture_fenced;
                size += fenced_size;
-               size *= 2;
+               if (kgem->gen < 033)
+                       size *= 2;
                if (kgem->aperture_total == kgem->aperture_mappable)
                        size += kgem->aperture;
-               if (size > kgem->aperture_mappable)
+               if (size > kgem->aperture_mappable) {
+                       DBG(("%s: estimated fence space required [%d] exceed aperture [%d]\n",
+                            __FUNCTION__, size, kgem->aperture_mappable));
                        return false;
+               }
        }
 
        if (num_pages == 0)
index 576b785..39ff0f6 100644 (file)
@@ -3282,6 +3282,7 @@ bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
            !kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL)) {
                kgem_submit(kgem);
                if (!kgem_check_many_bo_fenced(kgem, dst_bo, src_bo, NULL))
+                       DBG(("%s: not enough room in aperture, fallback to tiling copy\n", __FUNCTION__));
                        return sna_tiling_blt_copy_boxes(sna, alu,
                                                         src_bo, src_dx, src_dy,
                                                         dst_bo, dst_dx, dst_dy,
index 3bbcec7..b0a48dd 100644 (file)
@@ -718,6 +718,8 @@ bool sna_tiling_blt_copy_boxes(struct sna *sna, uint8_t alu,
        }
        if (max_size > sna->kgem.max_copy_tile_size)
                max_size = sna->kgem.max_copy_tile_size;
+       if (sna->kgem.gen < 033)
+               max_size /= 2; /* accommodate fence alignment */
 
        pixman_region_init_rects(&region, box, nbox);