Mesa (main): anv: Add an anv_bo_is_pinned helper

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Nov 9 03:12:54 UTC 2021


Module: Mesa
Branch: main
Commit: 8817377ce2bbda62aad91a940e83c89c9fdd45f2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8817377ce2bbda62aad91a940e83c89c9fdd45f2

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Thu Nov  4 09:44:20 2021 -0500

anv: Add an anv_bo_is_pinned helper

If we ever want to stop depending on the EXEC_OBJECT_PINNED to detect
when something is pinned (like for VM_BIND), having a helper will reduce
the code churn.  This also gives us the opportunity to make it compile
away to true/false when we can figure it out just based on compile-time
GFX_VERx10.

Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13610>

---

 src/intel/vulkan/anv_acceleration_structure.c |  2 +-
 src/intel/vulkan/anv_allocator.c              | 12 +++++-------
 src/intel/vulkan/anv_batch_chain.c            | 10 +++++-----
 src/intel/vulkan/anv_device.c                 |  4 ++--
 src/intel/vulkan/anv_private.h                | 28 +++++++++++++++++++++++----
 src/intel/vulkan/genX_cmd_buffer.c            |  2 +-
 6 files changed, 38 insertions(+), 20 deletions(-)

diff --git a/src/intel/vulkan/anv_acceleration_structure.c b/src/intel/vulkan/anv_acceleration_structure.c
index 20dc202f4d4..0e4802f6be8 100644
--- a/src/intel/vulkan/anv_acceleration_structure.c
+++ b/src/intel/vulkan/anv_acceleration_structure.c
@@ -121,7 +121,7 @@ anv_GetAccelerationStructureDeviceAddressKHR(
                    pInfo->accelerationStructure);
 
    assert(!anv_address_is_null(accel->address));
-   assert(accel->address.bo->flags & EXEC_OBJECT_PINNED);
+   assert(anv_bo_is_pinned(accel->address.bo));
 
    return anv_address_physical(accel->address);
 }
diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c
index a35eefc370d..2da2df5e339 100644
--- a/src/intel/vulkan/anv_allocator.c
+++ b/src/intel/vulkan/anv_allocator.c
@@ -1602,9 +1602,7 @@ anv_bo_alloc_flags_to_bo_flags(struct anv_device *device,
 static void
 anv_bo_finish(struct anv_device *device, struct anv_bo *bo)
 {
-   if (bo->offset != 0 &&
-       (bo->flags & EXEC_OBJECT_PINNED) &&
-       !bo->has_fixed_address)
+   if (bo->offset != 0 && anv_bo_is_pinned(bo) && !bo->has_fixed_address)
       anv_vma_free(device, bo->offset, bo->size + bo->_ccs_size);
 
    if (bo->map && !bo->from_host_ptr)
@@ -1620,7 +1618,7 @@ anv_bo_vma_alloc_or_close(struct anv_device *device,
                           enum anv_bo_alloc_flags alloc_flags,
                           uint64_t explicit_address)
 {
-   assert(bo->flags & EXEC_OBJECT_PINNED);
+   assert(anv_bo_is_pinned(bo));
    assert(explicit_address == intel_48b_address(explicit_address));
 
    uint32_t align = 4096;
@@ -1746,7 +1744,7 @@ anv_device_alloc_bo(struct anv_device *device,
       }
    }
 
-   if (new_bo.flags & EXEC_OBJECT_PINNED) {
+   if (anv_bo_is_pinned(&new_bo)) {
       VkResult result = anv_bo_vma_alloc_or_close(device, &new_bo,
                                                   alloc_flags,
                                                   explicit_address);
@@ -1887,7 +1885,7 @@ anv_device_import_bo_from_host_ptr(struct anv_device *device,
             (alloc_flags & ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS) != 0,
       };
 
-      if (new_bo.flags & EXEC_OBJECT_PINNED) {
+      if (anv_bo_is_pinned(&new_bo)) {
          VkResult result = anv_bo_vma_alloc_or_close(device, &new_bo,
                                                      alloc_flags,
                                                      client_address);
@@ -2015,7 +2013,7 @@ anv_device_import_bo(struct anv_device *device,
             (alloc_flags & ANV_BO_ALLOC_CLIENT_VISIBLE_ADDRESS) != 0,
       };
 
-      if (new_bo.flags & EXEC_OBJECT_PINNED) {
+      if (anv_bo_is_pinned(&new_bo)) {
          assert(new_bo._ccs_size == 0);
          VkResult result = anv_bo_vma_alloc_or_close(device, &new_bo,
                                                      alloc_flags,
diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c
index 08377b4601a..ca5480707ac 100644
--- a/src/intel/vulkan/anv_batch_chain.c
+++ b/src/intel/vulkan/anv_batch_chain.c
@@ -181,7 +181,7 @@ anv_reloc_list_add_bo(struct anv_reloc_list *list,
                       struct anv_bo *target_bo)
 {
    assert(!target_bo->is_wrapper);
-   assert(target_bo->flags & EXEC_OBJECT_PINNED);
+   assert(anv_bo_is_pinned(target_bo));
 
    uint32_t idx = target_bo->gem_handle;
    VkResult result = anv_reloc_list_grow_deps(list, alloc,
@@ -211,7 +211,7 @@ anv_reloc_list_add(struct anv_reloc_list *list,
    assert(unwrapped_target_bo->gem_handle > 0);
    assert(unwrapped_target_bo->refcount > 0);
 
-   if (unwrapped_target_bo->flags & EXEC_OBJECT_PINNED)
+   if (anv_bo_is_pinned(unwrapped_target_bo))
       return anv_reloc_list_add_bo(list, alloc, unwrapped_target_bo);
 
    VkResult result = anv_reloc_list_grow(list, alloc, 1);
@@ -492,8 +492,8 @@ anv_batch_bo_link(struct anv_cmd_buffer *cmd_buffer,
       /* Use a bogus presumed offset to force a relocation */
       prev_bbo->relocs.relocs[reloc_idx].presumed_offset = -1;
    } else {
-      assert(prev_bbo->bo->flags & EXEC_OBJECT_PINNED);
-      assert(next_bbo->bo->flags & EXEC_OBJECT_PINNED);
+      assert(anv_bo_is_pinned(prev_bbo->bo));
+      assert(anv_bo_is_pinned(next_bbo->bo));
 
       write_reloc(cmd_buffer->device,
                   prev_bbo->bo->map + bb_start_offset + 4,
@@ -2053,7 +2053,7 @@ anv_queue_execbuf_locked(struct anv_queue *queue,
 
    struct drm_i915_gem_exec_object2 *objects = execbuf.objects;
    for (uint32_t k = 0; k < execbuf.bo_count; k++) {
-      if (execbuf.bos[k]->flags & EXEC_OBJECT_PINNED)
+      if (anv_bo_is_pinned(execbuf.bos[k]))
          assert(execbuf.bos[k]->offset == objects[k].offset);
       execbuf.bos[k]->offset = objects[k].offset;
    }
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 0bda7c85fcb..7462a8c2d32 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -4408,7 +4408,7 @@ VkDeviceAddress anv_GetBufferDeviceAddress(
    ANV_FROM_HANDLE(anv_buffer, buffer, pInfo->buffer);
 
    assert(!anv_address_is_null(buffer->address));
-   assert(buffer->address.bo->flags & EXEC_OBJECT_PINNED);
+   assert(anv_bo_is_pinned(buffer->address.bo));
 
    return anv_address_physical(buffer->address);
 }
@@ -4426,7 +4426,7 @@ uint64_t anv_GetDeviceMemoryOpaqueCaptureAddress(
 {
    ANV_FROM_HANDLE(anv_device_memory, memory, pInfo->memory);
 
-   assert(memory->bo->flags & EXEC_OBJECT_PINNED);
+   assert(anv_bo_is_pinned(memory->bo));
    assert(memory->bo->has_client_visible_address);
 
    return intel_48b_address(memory->bo->offset);
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 51dd4921179..896432be024 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -530,6 +530,28 @@ anv_bo_unwrap(struct anv_bo *bo)
    return bo;
 }
 
+static inline bool
+anv_bo_is_pinned(struct anv_bo *bo)
+{
+#if defined(GFX_VERx10) && GFX_VERx10 >= 90
+   /* Sky Lake and later always uses softpin */
+   assert(bo->flags & EXEC_OBJECT_PINNED);
+   return true;
+#elif defined(GFX_VERx10) && GFX_VERx10 < 80
+   /* Haswell and earlier never use softpin */
+   assert(!(bo->flags & EXEC_OBJECT_PINNED));
+   assert(!bo->has_fixed_address);
+   return false;
+#else
+   /* If we don't have a GFX_VERx10 #define, we need to look at the BO.  Also,
+    * for GFX version 8, we need to look at the BO because Broadwell softpins
+    * but Cherryview doesn't.
+    */
+   assert((bo->flags & EXEC_OBJECT_PINNED) || !bo->has_fixed_address);
+   return (bo->flags & EXEC_OBJECT_PINNED) != 0;
+#endif
+}
+
 /* Represents a lock-free linked list of "free" things.  This is used by
  * both the block pool and the state pools.  Unfortunately, in order to
  * solve the ABA problem, we can't use a single uint32_t head.
@@ -1653,9 +1675,7 @@ anv_address_is_null(struct anv_address addr)
 static inline uint64_t
 anv_address_physical(struct anv_address addr)
 {
-   if (addr.bo && (ANV_ALWAYS_SOFTPIN ||
-                   (addr.bo->flags & EXEC_OBJECT_PINNED))) {
-      assert(addr.bo->flags & EXEC_OBJECT_PINNED);
+   if (addr.bo && anv_bo_is_pinned(addr.bo)) {
       return intel_canonical_address(addr.bo->offset + addr.offset);
    } else {
       return intel_canonical_address(addr.offset);
@@ -1692,7 +1712,7 @@ _anv_combine_address(struct anv_batch *batch, void *location,
    if (address.bo == NULL) {
       return address.offset + delta;
    } else if (batch == NULL) {
-      assert(address.bo->flags & EXEC_OBJECT_PINNED);
+      assert(anv_bo_is_pinned(address.bo));
       return anv_address_physical(anv_address_add(address, delta));
    } else {
       assert(batch->start <= location && location < batch->end);
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index 42e9951fb4a..23b431eb1ad 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -5631,7 +5631,7 @@ genX(cmd_buffer_set_binding_for_gfx8_vb_flush)(struct anv_cmd_buffer *cmd_buffer
       return;
    }
 
-   assert(vb_address.bo && (vb_address.bo->flags & EXEC_OBJECT_PINNED));
+   assert(vb_address.bo && anv_bo_is_pinned(vb_address.bo));
    bound->start = intel_48b_address(anv_address_physical(vb_address));
    bound->end = bound->start + vb_size;
    assert(bound->end > bound->start); /* No overflow */



More information about the mesa-commit mailing list