This new function is an import and a set tiling in one go. --- src/mesa/drivers/dri/i965/brw_bufmgr.c | 41 ++++++++++++++++++++++++++-------- src/mesa/drivers/dri/i965/brw_bufmgr.h | 4 ++++ 2 files changed, 36 insertions(+), 9 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.c b/src/mesa/drivers/dri/i965/brw_bufmgr.c index 469895e..889350c 100644 --- a/src/mesa/drivers/dri/i965/brw_bufmgr.c +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.c @@ -1133,8 +1133,9 @@ brw_bo_get_tiling(struct brw_bo *bo, uint32_t *tiling_mode, return 0; } -struct brw_bo * -brw_bo_gem_create_from_prime(struct brw_bufmgr *bufmgr, int prime_fd) +static struct brw_bo * +brw_bo_gem_create_from_prime_internal(struct brw_bufmgr *bufmgr, int prime_fd, + int tiling_mode, uint32_t stride) { int ret; uint32_t handle; @@ -1185,14 +1186,18 @@ brw_bo_gem_create_from_prime(struct brw_bufmgr *bufmgr, int prime_fd) bo->reusable = false; bo->external = true; - memclear(get_tiling); - get_tiling.handle = bo->gem_handle; - if (drmIoctl(bufmgr->fd, DRM_IOCTL_I915_GEM_GET_TILING, &get_tiling)) - goto err; + if (tiling_mode < 0) { + memclear(get_tiling); + get_tiling.handle = bo->gem_handle; + if (drmIoctl(bufmgr->fd, DRM_IOCTL_I915_GEM_GET_TILING, &get_tiling)) + goto err; - bo->tiling_mode = get_tiling.tiling_mode; - bo->swizzle_mode = get_tiling.swizzle_mode; - /* XXX stride is unknown */ + bo->tiling_mode = get_tiling.tiling_mode; + bo->swizzle_mode = get_tiling.swizzle_mode; + /* XXX stride is unknown */ + } else { + bo_set_tiling_internal(bo, tiling_mode, stride); + } out: mtx_unlock(&bufmgr->lock); @@ -1204,6 +1209,24 @@ err: return NULL; } +struct brw_bo * +brw_bo_gem_create_from_prime(struct brw_bufmgr *bufmgr, int prime_fd) +{ + return brw_bo_gem_create_from_prime_internal(bufmgr, prime_fd, -1, 0); +} + +struct brw_bo * +brw_bo_gem_create_from_prime_tiled(struct brw_bufmgr *bufmgr, int prime_fd, + uint32_t tiling_mode, uint32_t stride) +{ + assert(tiling_mode == I915_TILING_NONE || + tiling_mode == I915_TILING_X || + tiling_mode == I915_TILING_Y); + + return brw_bo_gem_create_from_prime_internal(bufmgr, prime_fd, + tiling_mode, stride); +} + static void brw_bo_make_external(struct brw_bo *bo) { diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.h b/src/mesa/drivers/dri/i965/brw_bufmgr.h index 8bfb0e4..6811e78 100644 --- a/src/mesa/drivers/dri/i965/brw_bufmgr.h +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.h @@ -339,6 +339,10 @@ void brw_destroy_hw_context(struct brw_bufmgr *bufmgr, uint32_t ctx_id); int brw_bo_gem_export_to_prime(struct brw_bo *bo, int *prime_fd); struct brw_bo *brw_bo_gem_create_from_prime(struct brw_bufmgr *bufmgr, int prime_fd); +struct brw_bo *brw_bo_gem_create_from_prime_tiled(struct brw_bufmgr *bufmgr, + int prime_fd, + uint32_t tiling_mode, + uint32_t stride); uint32_t brw_bo_export_gem_handle(struct brw_bo *bo); -- 2.5.0.400.gff86faf _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev