diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/auxiliary/pipebuffer/pb_bufmgr.h | 3 | ||||
-rw-r--r-- | src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c | 23 | ||||
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 2 |
3 files changed, 23 insertions, 5 deletions
diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h b/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h index fe4c8c20071..3044ec881fd 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr.h @@ -162,7 +162,8 @@ pb_slab_range_manager_create(struct pb_manager *provider, struct pb_manager * pb_cache_manager_create(struct pb_manager *provider, unsigned usecs, - unsigned size_factor); + unsigned size_factor, + unsigned bypass_usage); struct pb_fence_ops; diff --git a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c index 6de5de04fe9..0469146d15b 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c +++ b/src/gallium/auxiliary/pipebuffer/pb_bufmgr_cache.c @@ -83,6 +83,7 @@ struct pb_cache_manager struct list_head delayed; pb_size numDelayed; unsigned size_factor; + unsigned bypass_usage; }; @@ -228,6 +229,9 @@ pb_cache_is_buffer_compat(struct pb_cache_buffer *buf, pb_size size, const struct pb_desc *desc) { + if (desc->usage & buf->mgr->bypass_usage) + return 0; + if(buf->base.size < size) return 0; @@ -339,7 +343,7 @@ pb_cache_manager_create_buffer(struct pb_manager *_mgr, assert(pipe_is_referenced(&buf->buffer->reference)); assert(pb_check_alignment(desc->alignment, buf->buffer->alignment)); - assert(pb_check_usage(desc->usage, buf->buffer->usage)); + assert(pb_check_usage(desc->usage & ~mgr->bypass_usage, buf->buffer->usage)); assert(buf->buffer->size >= size); pipe_reference_init(&buf->base.reference, 1); @@ -385,11 +389,23 @@ pb_cache_manager_destroy(struct pb_manager *mgr) FREE(mgr); } - +/** + * Create a caching buffer manager + * + * @param provider The buffer manager to which cache miss buffer requests + * should be redirected. + * @param usecs Unused buffers may be released from the cache after this + * time + * @param size_factor Declare buffers that are size_factor times bigger than + * the requested size as cache hits. + * @param bypass_usage Bitmask. If (requested usage & bypass_usage) != 0, + * buffer allocation requests are redirected to the provider. + */ struct pb_manager * pb_cache_manager_create(struct pb_manager *provider, unsigned usecs, - unsigned size_factor) + unsigned size_factor, + unsigned bypass_usage) { struct pb_cache_manager *mgr; @@ -406,6 +422,7 @@ pb_cache_manager_create(struct pb_manager *provider, mgr->provider = provider; mgr->usecs = usecs; mgr->size_factor = size_factor; + mgr->bypass_usage = bypass_usage; LIST_INITHEAD(&mgr->delayed); mgr->numDelayed = 0; pipe_mutex_init(mgr->mutex); diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c index b7137d221ca..6f0e2a57669 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c @@ -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, 2); + ws->cman = pb_cache_manager_create(ws->kman, 1000000, 2, 0); if (!ws->cman) goto fail; |