gbm: Export a per plane getter for stride
v2: Preserve legacy behavior when plane is 0 (Jason Ekstrand) EINVAL when input plane is greater than total planes (Jason Ekstrand) Don't leak the image after fromPlanar (Daniel) Move bo->image check below plane count preventing bad index succeeding (Daniel) v3: Fix DRIimage leak (using Jason's recommended change) Make plane 0 return planar stride. This might break legacy behavior (Jason) v4: Move bogus hunk for get_handle_for_plane to the right patch (Jason) Fix error handling path to be cleaner (Jason) v5: Add assert for dumb BOs to make sure plane == 0 (Jason) Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com> (v1) Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Acked-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
parent
ed4cf2440d
commit
7f6209e46f
|
@ -665,7 +665,40 @@ gbm_dri_bo_get_handle_for_plane(struct gbm_bo *_bo, int plane)
|
|||
static uint32_t
|
||||
gbm_dri_bo_get_stride(struct gbm_bo *_bo, int plane)
|
||||
{
|
||||
return _bo->stride;
|
||||
struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm);
|
||||
struct gbm_dri_bo *bo = gbm_dri_bo(_bo);
|
||||
__DRIimage *image;
|
||||
int stride = 0;
|
||||
|
||||
if (!dri->image || dri->image->base.version < 11 || !dri->image->fromPlanar) {
|
||||
/* Preserve legacy behavior if plane is 0 */
|
||||
if (plane == 0)
|
||||
return _bo->stride;
|
||||
|
||||
errno = ENOSYS;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (plane >= get_number_planes(dri, bo->image)) {
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (bo->image == NULL) {
|
||||
assert(plane == 0);
|
||||
return _bo->stride;
|
||||
}
|
||||
|
||||
image = dri->image->fromPlanar(bo->image, plane, NULL);
|
||||
if (image) {
|
||||
dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &stride);
|
||||
dri->image->destroyImage(image);
|
||||
} else {
|
||||
assert(plane == 0);
|
||||
dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE, &stride);
|
||||
}
|
||||
|
||||
return (uint32_t)stride;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -14,6 +14,7 @@ gbm_bo_unmap
|
|||
gbm_bo_get_width
|
||||
gbm_bo_get_height
|
||||
gbm_bo_get_stride
|
||||
gbm_bo_get_stride_for_plane
|
||||
gbm_bo_get_format
|
||||
gbm_bo_get_device
|
||||
gbm_bo_get_handle
|
||||
|
|
|
@ -165,7 +165,20 @@ gbm_bo_get_height(struct gbm_bo *bo)
|
|||
GBM_EXPORT uint32_t
|
||||
gbm_bo_get_stride(struct gbm_bo *bo)
|
||||
{
|
||||
return bo->gbm->bo_get_stride(bo, 0);
|
||||
return gbm_bo_get_stride_for_plane(bo, 0);
|
||||
}
|
||||
|
||||
/** Get the stride for the given plane
|
||||
*
|
||||
* \param bo The buffer object
|
||||
* \param plane for which you want the stride
|
||||
*
|
||||
* \sa gbm_bo_get_stride()
|
||||
*/
|
||||
GBM_EXPORT uint32_t
|
||||
gbm_bo_get_stride_for_plane(struct gbm_bo *bo, int plane)
|
||||
{
|
||||
return bo->gbm->bo_get_stride(bo, plane);
|
||||
}
|
||||
|
||||
/** Get the format of the buffer object
|
||||
|
|
|
@ -303,6 +303,9 @@ gbm_bo_get_height(struct gbm_bo *bo);
|
|||
uint32_t
|
||||
gbm_bo_get_stride(struct gbm_bo *bo);
|
||||
|
||||
uint32_t
|
||||
gbm_bo_get_stride_for_plane(struct gbm_bo *bo, int plane);
|
||||
|
||||
uint32_t
|
||||
gbm_bo_get_format(struct gbm_bo *bo);
|
||||
|
||||
|
|
Loading…
Reference in New Issue