iris: Map each surf to it's aux-surf in the aux-map tables
authorJordan Justen <jordan.l.justen@intel.com>
Sat, 28 Apr 2018 08:58:54 +0000 (01:58 -0700)
committerJordan Justen <jordan.l.justen@intel.com>
Mon, 28 Oct 2019 07:09:14 +0000 (00:09 -0700)
Rework: Nanley Chery
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/gallium/drivers/iris/iris_bufmgr.c
src/gallium/drivers/iris/iris_resource.c

index 1624257729a27865f24f170679e0373586469e6a..21c0d51786136aec06fa0c63711efd14fdf4818d 100644 (file)
@@ -395,6 +395,20 @@ alloc_bo_from_cache(struct iris_bufmgr *bufmgr,
    if (!bo)
       return NULL;
 
+   if (bo->aux_map_address) {
+      /* This buffer was associated with an aux-buffer range. We make sure
+       * that buffers are not reused from the cache while the buffer is (busy)
+       * being used by an executing batch. Since we are here, the buffer is no
+       * longer being used by a batch and the buffer was deleted (in order to
+       * end up in the cache). Therefore its old aux-buffer range can be
+       * removed from the aux-map.
+       */
+      if (bo->bufmgr->aux_map_ctx)
+         gen_aux_map_unmap_range(bo->bufmgr->aux_map_ctx, bo->gtt_offset,
+                                 bo->size);
+      bo->aux_map_address = 0;
+   }
+
    /* If the cached BO isn't in the right memory zone, or the alignment
     * isn't sufficient, free the old memory and assign it a new address.
     */
@@ -730,6 +744,11 @@ bo_close(struct iris_bo *bo)
           bo->gem_handle, bo->name, strerror(errno));
    }
 
+   if (bo->aux_map_address && bo->bufmgr->aux_map_ctx) {
+      gen_aux_map_unmap_range(bo->bufmgr->aux_map_ctx, bo->gtt_offset,
+                              bo->size);
+   }
+
    /* Return the VMA for reuse */
    vma_free(bo->bufmgr, bo->gtt_offset, bo->size);
 
index 5e532e801001b986397878a1d712c51c670a26e9..3ad0874094de554a2f2f7138d634133b8e789027 100644 (file)
@@ -47,6 +47,7 @@
 #include "iris_context.h"
 #include "iris_resource.h"
 #include "iris_screen.h"
+#include "intel/common/gen_aux_map.h"
 #include "intel/dev/gen_debug.h"
 #include "isl/isl.h"
 #include "drm-uapi/drm_fourcc.h"
@@ -384,6 +385,19 @@ iris_get_aux_clear_color_state_size(struct iris_screen *screen)
    return devinfo->gen >= 10 ? screen->isl_dev.ss.clear_color_state_size : 0;
 }
 
+static void
+map_aux_addresses(struct iris_screen *screen, struct iris_resource *res)
+{
+   const struct gen_device_info *devinfo = &screen->devinfo;
+   if (devinfo->gen >= 12 && isl_aux_usage_has_ccs(res->aux.usage)) {
+      void *aux_map_ctx = iris_bufmgr_get_aux_map_context(screen->bufmgr);
+      assert(aux_map_ctx);
+      gen_aux_map_add_image(aux_map_ctx, &res->surf, res->bo->gtt_offset,
+                            res->aux.bo->gtt_offset + res->aux.offset);
+      res->bo->aux_map_address = res->aux.bo->gtt_offset;
+   }
+}
+
 /**
  * Configure aux for the resource, but don't allocate it. For images which
  * might be shared with modifiers, we must allocate the image and aux data in
@@ -560,6 +574,8 @@ iris_resource_alloc_separate_aux(struct iris_screen *screen,
                                    iris_get_aux_clear_color_state_size(screen)))
       return false;
 
+   map_aux_addresses(screen, res);
+
    return true;
 }
 
@@ -846,6 +862,7 @@ iris_resource_create_with_modifiers(struct pipe_screen *pscreen,
             res->aux.clear_color_offset += aux_offset;
          if (!iris_resource_init_aux_buf(res, flags, clear_color_state_size))
             aux_enabled = false;
+         map_aux_addresses(screen, res);
       }
    }