On Sun, Jan 21, 2018 at 8:05 PM, Jason Ekstrand <ja...@jlekstrand.net> wrote: > 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); > + }
Since most of this logic is specific to the tiling == -1 case, maybe move the get_tiling path to brw_bo_gem_create_from_prime(). Either move bo_set_tiling() to brw_bo_gem_create_from_prime_tiled() or call it from here when stride > 0. Either way, Reviewed-by: Kristian H. Kristensen <hoegsb...@google.com> > > 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev