[Mesa-dev] [PATCH 1/4] i965/drm: Reorganize code for the next patch

James Xiong james.xiong at intel.com
Tue May 1 23:25:29 UTC 2018


From: "Xiong, James" <james.xiong at intel.com>

split bo_alloc_internal, and add a new function cached_bo_for_size
searches for a suitable cached buffer for a given size.

Signed-off-by: Xiong, James <james.xiong at intel.com>
---
 src/mesa/drivers/dri/i965/brw_bufmgr.c | 92 +++++++++++++++++-----------------
 1 file changed, 45 insertions(+), 47 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.c b/src/mesa/drivers/dri/i965/brw_bufmgr.c
index 7cb1f03..e68da26 100644
--- a/src/mesa/drivers/dri/i965/brw_bufmgr.c
+++ b/src/mesa/drivers/dri/i965/brw_bufmgr.c
@@ -263,53 +263,29 @@ brw_bo_cache_purge_bucket(struct brw_bufmgr *bufmgr,
    }
 }
 
+/* search for a suitable cached bo for reuse */
 static struct brw_bo *
-bo_alloc_internal(struct brw_bufmgr *bufmgr,
-                  const char *name,
-                  uint64_t size,
-                  unsigned flags,
-                  uint32_t tiling_mode,
-                  uint32_t stride)
+cached_bo_for_size(struct brw_bufmgr *bufmgr,
+   uint64_t size,
+   uint32_t tiling_mode,
+   uint32_t stride,
+   unsigned flags)
 {
-   struct brw_bo *bo;
-   unsigned int page_size = getpagesize();
-   int ret;
-   struct bo_cache_bucket *bucket;
-   bool alloc_from_cache;
-   uint64_t bo_size;
-   bool busy = false;
-   bool zeroed = false;
-
-   if (flags & BO_ALLOC_BUSY)
-      busy = true;
-
-   if (flags & BO_ALLOC_ZEROED)
-      zeroed = true;
+   bool busy = (flags & BO_ALLOC_BUSY) ? true : false;
+   bool zeroed = (flags & BO_ALLOC_ZEROED) ? true : false;
+   struct bo_cache_bucket *bucket =
+      (bufmgr->bo_reuse) ? bucket_for_size(bufmgr, size) : NULL;
 
    /* BUSY does doesn't really jive with ZEROED as we have to wait for it to
     * be idle before we can memset.  Just disallow that combination.
     */
    assert(!(busy && zeroed));
 
-   /* Round the allocated size up to a power of two number of pages. */
-   bucket = bucket_for_size(bufmgr, size);
-
-   /* If we don't have caching at this size, don't actually round the
-    * allocation up.
-    */
-   if (bucket == NULL) {
-      bo_size = size;
-      if (bo_size < page_size)
-         bo_size = page_size;
-   } else {
-      bo_size = bucket->size;
-   }
-
-   mtx_lock(&bufmgr->lock);
-   /* Get a buffer out of the cache if available */
+   if(bucket != NULL && !list_empty(&bucket->head)) {
+      struct brw_bo *bo;
 retry:
-   alloc_from_cache = false;
-   if (bucket != NULL && !list_empty(&bucket->head)) {
+      bo = NULL;
+
       if (busy && !zeroed) {
          /* Allocate new render-target BOs from the tail (MRU)
           * of the list, as it will likely be hot in the GPU
@@ -319,7 +295,6 @@ retry:
           */
          bo = LIST_ENTRY(struct brw_bo, bucket->head.prev, head);
          list_del(&bo->head);
-         alloc_from_cache = true;
       } else {
          /* For non-render-target BOs (where we're probably
           * going to map it first thing in order to fill it
@@ -330,16 +305,15 @@ retry:
           */
          bo = LIST_ENTRY(struct brw_bo, bucket->head.next, head);
          if (!brw_bo_busy(bo)) {
-            alloc_from_cache = true;
             list_del(&bo->head);
          }
       }
 
-      if (alloc_from_cache) {
+      if (bo) {
          if (!brw_bo_madvise(bo, I915_MADV_WILLNEED)) {
             bo_free(bo);
             brw_bo_cache_purge_bucket(bufmgr, bucket);
-            goto retry;
+            return NULL;
          }
 
          if (bo_set_tiling_internal(bo, tiling_mode, stride)) {
@@ -353,20 +327,44 @@ retry:
                bo_free(bo);
                goto retry;
             }
-            memset(map, 0, bo_size);
+            memset(map, 0, bo->size);
          }
       }
+
+      return bo;
    }
 
-   if (!alloc_from_cache) {
+   return NULL;
+}
+
+static struct brw_bo *
+bo_alloc_internal(struct brw_bufmgr *bufmgr,
+                  const char *name,
+                  uint64_t size,
+                  unsigned flags,
+                  uint32_t tiling_mode,
+                  uint32_t stride)
+{
+   struct brw_bo *bo;
+   int ret;
+
+   /* align the request size to page size */
+   size = ALIGN(size, getpagesize());
+
+   mtx_lock(&bufmgr->lock);
+
+   /* Get a buffer out of the cache if available */
+   bo = cached_bo_for_size(bufmgr, size, tiling_mode, stride, flags);
+
+   if (bo == NULL) {
       bo = calloc(1, sizeof(*bo));
       if (!bo)
          goto err;
 
-      bo->size = bo_size;
+      bo->size = size;
       bo->idle = true;
 
-      struct drm_i915_gem_create create = { .size = bo_size };
+      struct drm_i915_gem_create create = { .size = size };
 
       /* All new BOs we get from the kernel are zeroed, so we don't need to
        * worry about that here.
@@ -413,7 +411,7 @@ retry:
    mtx_unlock(&bufmgr->lock);
 
    DBG("bo_create: buf %d (%s) %llub\n", bo->gem_handle, bo->name,
-       (unsigned long long) size);
+       (unsigned long long) bo->size);
 
    return bo;
 
-- 
2.7.4



More information about the mesa-dev mailing list