diff options
author | Ben Widawsky <[email protected]> | 2016-10-26 16:02:23 -0700 |
---|---|---|
committer | Ben Widawsky <[email protected]> | 2017-03-09 15:35:44 -0800 |
commit | 2ee34bd5dcf30f202c9f37e3d986640f71b8a210 (patch) | |
tree | 03be27dd1feb00d44578acbd5e37fc7d00ea43fe /src/gbm/backends/dri | |
parent | 7f6209e46f8de409f182931e0ca23bb64f1a8e39 (diff) |
gbm: Export a per plane getter for offset
Unlike stride, there was no previous offset getter, so it can be right
on the first try.
v2: Return EINVAL when plane is greater than total planes to make it
match the similar APIs.
Avoid leak after fromPlanar (Daniel)
Make sure when getting offsets we consider dumb images (Daniel)
v3: Use Jason's recommendation for handling the non-planar case.
v4: Return int64_t so we can get real errors
v5: Add an assertion for dumb BOs (Jason)
Signed-off-by: Ben Widawsky <[email protected]>
Reviewed-by: Eric Engestrom <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Acked-by: Daniel Stone <[email protected]>
Diffstat (limited to 'src/gbm/backends/dri')
-rw-r--r-- | src/gbm/backends/dri/gbm_dri.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 5a98b6aba68..7106dc12292 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -701,6 +701,40 @@ gbm_dri_bo_get_stride(struct gbm_bo *_bo, int plane) return (uint32_t)stride; } +static int64_t +gbm_dri_bo_get_offset(struct gbm_bo *_bo, int plane) +{ + struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm); + struct gbm_dri_bo *bo = gbm_dri_bo(_bo); + int offset = 0; + + if (!dri->image || dri->image->base.version < 13 || !dri->image->fromPlanar) { + errno = ENOSYS; + return -1; + } + + if (plane >= get_number_planes(dri, bo->image)) { + errno = EINVAL; + return -2; + } + + /* Dumb images have no offset */ + if (bo->image == NULL) { + assert(plane == 0); + return 0; + } + + __DRIimage *image = dri->image->fromPlanar(bo->image, plane, NULL); + if (image) { + dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_OFFSET, &offset); + dri->image->destroyImage(image); + } else { + dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_OFFSET, &offset); + } + + return (uint32_t)offset; +} + static void gbm_dri_bo_destroy(struct gbm_bo *_bo) { @@ -1196,6 +1230,7 @@ dri_device_create(int fd) dri->base.base.bo_get_planes = gbm_dri_bo_get_planes; dri->base.base.bo_get_handle = gbm_dri_bo_get_handle_for_plane; dri->base.base.bo_get_stride = gbm_dri_bo_get_stride; + dri->base.base.bo_get_offset = gbm_dri_bo_get_offset; dri->base.base.bo_destroy = gbm_dri_bo_destroy; dri->base.base.destroy = dri_destroy; dri->base.base.surface_create = gbm_dri_surface_create; |