pipebuffer, winsys: Add a size match parameter to the cached buffer manager
authorThomas Hellstrom <thellstrom@vmware.com>
Sat, 8 Feb 2014 17:51:15 +0000 (09:51 -0800)
committerBrian Paul <brianp@vmware.com>
Fri, 14 Feb 2014 15:21:44 +0000 (08:21 -0700)
In some situations it's important to restrict the sizes of buffers that the
cached buffer manager is allowed to return

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Cc: "10.1" <mesa-stable@lists.freedesktop.org>
src/gallium/auxiliary/pipebuffer/pb_bufmgr.h
src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c

index 2c88cf435c7c436e80b514358458f8cd3829a02b..fe4c8c20071d7f0abe1ec7242e735dcd3bb83ce2 100644 (file)
@@ -161,7 +161,8 @@ pb_slab_range_manager_create(struct pb_manager *provider,
  */
 struct pb_manager *
 pb_cache_manager_create(struct pb_manager *provider, 
-                       unsigned usecs); 
+                       unsigned usecs,
+                       unsigned size_factor); 
 
 
 struct pb_fence_ops;
index 9728bf4ee8bc3ac919accd25da5a94d69fd3ceb1..6de5de04fe95f84946be3afee5cef5b8b4497b71 100644 (file)
@@ -82,6 +82,7 @@ struct pb_cache_manager
    
    struct list_head delayed;
    pb_size numDelayed;
+   unsigned size_factor;
 };
 
 
@@ -231,7 +232,7 @@ pb_cache_is_buffer_compat(struct pb_cache_buffer *buf,
       return 0;
 
    /* be lenient with size */
-   if(buf->base.size >= 2*size)
+   if(buf->base.size > buf->mgr->size_factor*size)
       return 0;
    
    if(!pb_check_alignment(desc->alignment, buf->base.alignment))
@@ -387,7 +388,8 @@ pb_cache_manager_destroy(struct pb_manager *mgr)
 
 struct pb_manager *
 pb_cache_manager_create(struct pb_manager *provider, 
-                       unsigned usecs) 
+                       unsigned usecs,
+                       unsigned size_factor) 
 {
    struct pb_cache_manager *mgr;
 
@@ -403,6 +405,7 @@ pb_cache_manager_create(struct pb_manager *provider,
    mgr->base.flush = pb_cache_manager_flush;
    mgr->provider = provider;
    mgr->usecs = usecs;
+   mgr->size_factor = size_factor;
    LIST_INITHEAD(&mgr->delayed);
    mgr->numDelayed = 0;
    pipe_mutex_init(mgr->mutex);
index c28f3a7b89e6c1ce23b83653d15be6653dfbab7a..b7137d221ca058eea60961e4928715b61dc6dc2d 100644 (file)
@@ -645,7 +645,7 @@ PUBLIC struct radeon_winsys *radeon_drm_winsys_create(int fd)
     ws->kman = radeon_bomgr_create(ws);
     if (!ws->kman)
         goto fail;
-    ws->cman = pb_cache_manager_create(ws->kman, 1000000);
+    ws->cman = pb_cache_manager_create(ws->kman, 1000000, 2);
     if (!ws->cman)
         goto fail;