This interface is the same as drm_intel_bo_alloc except the allocated size isn't rounded up, so it bypasses the cache bucket.
The size of the BO created by drm_intel_bo_alloc for a 1920x800,4:2:0 YUV planar surface is 4M, it is about 2.2M if using drm_intel_bo_alloc_direct. Signed-off-by: Xiang, Haihao <haihao.xi...@intel.com> --- intel/intel_bufmgr.c | 9 +++++++++ intel/intel_bufmgr.h | 3 +++ intel/intel_bufmgr_gem.c | 21 ++++++++++++++++++--- intel/intel_bufmgr_priv.h | 8 ++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/intel/intel_bufmgr.c b/intel/intel_bufmgr.c index 9144fdd..1188253 100644 --- a/intel/intel_bufmgr.c +++ b/intel/intel_bufmgr.c @@ -50,6 +50,15 @@ drm_intel_bo *drm_intel_bo_alloc(drm_intel_bufmgr *bufmgr, const char *name, return bufmgr->bo_alloc(bufmgr, name, size, alignment); } +drm_intel_bo *drm_intel_bo_alloc_direct(drm_intel_bufmgr *bufmgr, const char *name, + unsigned long size, unsigned int alignment) +{ + if (bufmgr->bo_alloc_direct) + return bufmgr->bo_alloc_direct(bufmgr, name, size, alignment); + + return NULL; +} + drm_intel_bo *drm_intel_bo_alloc_for_render(drm_intel_bufmgr *bufmgr, const char *name, unsigned long size, diff --git a/intel/intel_bufmgr.h b/intel/intel_bufmgr.h index cbcddb6..9dd0443 100644 --- a/intel/intel_bufmgr.h +++ b/intel/intel_bufmgr.h @@ -78,9 +78,12 @@ struct _drm_intel_bo { }; #define BO_ALLOC_FOR_RENDER (1<<0) +#define BO_ALLOC_DIRECT (1<<1) drm_intel_bo *drm_intel_bo_alloc(drm_intel_bufmgr *bufmgr, const char *name, unsigned long size, unsigned int alignment); +drm_intel_bo *drm_intel_bo_alloc_direct(drm_intel_bufmgr *bufmgr, const char *name, + unsigned long size, unsigned int alignment); drm_intel_bo *drm_intel_bo_alloc_for_render(drm_intel_bufmgr *bufmgr, const char *name, unsigned long size, diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c index b76fd7e..a16cd16 100644 --- a/intel/intel_bufmgr_gem.c +++ b/intel/intel_bufmgr_gem.c @@ -556,17 +556,22 @@ drm_intel_gem_bo_alloc_internal(drm_intel_bufmgr *bufmgr, drm_intel_bo_gem *bo_gem; unsigned int page_size = getpagesize(); int ret; - struct drm_intel_gem_bo_bucket *bucket; + struct drm_intel_gem_bo_bucket *bucket = NULL; int alloc_from_cache; unsigned long bo_size; int for_render = 0; + int reusable = 1; if (flags & BO_ALLOC_FOR_RENDER) for_render = 1; /* Round the allocated size up to a power of two number of pages. */ - bucket = drm_intel_gem_bo_bucket_for_size(bufmgr_gem, size); + if (!(flags & BO_ALLOC_DIRECT)) + bucket = drm_intel_gem_bo_bucket_for_size(bufmgr_gem, size); + if (bucket == NULL) + reusable = 0; + /* If we don't have caching at this size, don't actually round the * allocation up. */ @@ -653,7 +658,7 @@ retry: bo_gem->has_error = 0; bo_gem->tiling_mode = I915_TILING_NONE; bo_gem->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; - bo_gem->reusable = 1; + bo_gem->reusable = reusable; drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem); @@ -683,6 +688,15 @@ drm_intel_gem_bo_alloc(drm_intel_bufmgr *bufmgr, } static drm_intel_bo * +drm_intel_gem_bo_alloc_direct(drm_intel_bufmgr *bufmgr, + const char *name, + unsigned long size, + unsigned int alignment) +{ + return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, BO_ALLOC_DIRECT); +} + +static drm_intel_bo * drm_intel_gem_bo_alloc_tiled(drm_intel_bufmgr *bufmgr, const char *name, int x, int y, int cpp, uint32_t *tiling_mode, unsigned long *pitch, unsigned long flags) @@ -2058,6 +2072,7 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size) bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2; bufmgr_gem->bufmgr.bo_alloc = drm_intel_gem_bo_alloc; + bufmgr_gem->bufmgr.bo_alloc_direct = drm_intel_gem_bo_alloc_direct; bufmgr_gem->bufmgr.bo_alloc_for_render = drm_intel_gem_bo_alloc_for_render; bufmgr_gem->bufmgr.bo_alloc_tiled = drm_intel_gem_bo_alloc_tiled; diff --git a/intel/intel_bufmgr_priv.h b/intel/intel_bufmgr_priv.h index f987d97..47277f4 100644 --- a/intel/intel_bufmgr_priv.h +++ b/intel/intel_bufmgr_priv.h @@ -51,6 +51,14 @@ struct _drm_intel_bufmgr { unsigned long size, unsigned int alignment); /** + * Allocate a buffer object. + * + * This is the same as bo_alloc except it bypasses the cache bucket + */ + drm_intel_bo *(*bo_alloc_direct) (drm_intel_bufmgr *bufmgr, const char *name, + unsigned long size, unsigned int alignment); + + /** * Allocate a buffer object, hinting that it will be used as a * render target. * -- 1.6.3.3 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx