minigbm: One buffer for NV12
Some of our Android framework code expects one fd per format. The gbm
API allows it, so let's go with this representation. Also fixed a bug
that comes up when bo->num_planes = 2, but the handles are the same.
BUG=chromium:616275
TEST=gbmtest, plane_test
Change-Id: Iec0e6319d144941a73c26497af2078112d5e4e64
Reviewed-on: https://chromium-review.googlesource.com/360905
Commit-Ready: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
diff --git a/rockchip.c b/rockchip.c
index 0c0e0a8..edf97af 100644
--- a/rockchip.c
+++ b/rockchip.c
@@ -24,61 +24,50 @@
size_t plane;
switch (format) {
- case GBM_FORMAT_NV12:
- width = ALIGN(width, 4);
- height = ALIGN(height, 4);
- bo->strides[0] = bo->strides[1] = width;
- bo->sizes[0] = height * bo->strides[0];
- bo->sizes[1] = height * bo->strides[1] / 2;
- bo->offsets[0] = bo->offsets[1] = 0;
- break;
- case GBM_FORMAT_XRGB8888:
- case GBM_FORMAT_ARGB8888:
- case GBM_FORMAT_ABGR8888:
- bo->strides[0] = gbm_stride_from_format(format, width);
- bo->sizes[0] = height * bo->strides[0];
- bo->offsets[0] = 0;
- break;
- default:
- fprintf(stderr, "minigbm: rockchip: unsupported format %4.4s\n",
- (char*)&format);
- assert(0);
- return -EINVAL;
+ case GBM_FORMAT_NV12:
+ width = ALIGN(width, 4);
+ height = ALIGN(height, 4);
+ bo->strides[0] = bo->strides[1] = width;
+ bo->sizes[0] = height * bo->strides[0];
+ bo->sizes[1] = height * bo->strides[1] / 2;
+ bo->offsets[0] = 0;
+ bo->offsets[1] = height * bo->strides[0];
+ break;
+ case GBM_FORMAT_XRGB8888:
+ case GBM_FORMAT_ARGB8888:
+ case GBM_FORMAT_ABGR8888:
+ bo->strides[0] = gbm_stride_from_format(format, width);
+ bo->sizes[0] = height * bo->strides[0];
+ bo->offsets[0] = 0;
+ break;
+ default:
+ fprintf(stderr, "minigbm: rockchip: unsupported format %4.4s\n",
+ (char*)&format);
+ assert(0);
+ return -EINVAL;
}
int ret;
- for (plane = 0; plane < bo->num_planes; plane++) {
- size_t size = bo->sizes[plane];
- struct drm_rockchip_gem_create gem_create;
+ size_t size = 0;
- memset(&gem_create, 0, sizeof(gem_create));
- gem_create.size = size;
+ for (plane = 0; plane < bo->num_planes; plane++)
+ size += bo->sizes[plane];
- ret = drmIoctl(bo->gbm->fd, DRM_IOCTL_ROCKCHIP_GEM_CREATE,
- &gem_create);
- if (ret) {
- fprintf(stderr, "minigbm: DRM_IOCTL_ROCKCHIP_GEM_CREATE failed "
- "(size=%zu)\n", size);
- goto cleanup_planes;
- }
+ struct drm_rockchip_gem_create gem_create;
- bo->handles[plane].u32 = gem_create.handle;
+ memset(&gem_create, 0, sizeof(gem_create));
+ gem_create.size = size;
+
+ ret = drmIoctl(bo->gbm->fd, DRM_IOCTL_ROCKCHIP_GEM_CREATE,
+ &gem_create);
+
+ if (ret) {
+ fprintf(stderr, "minigbm: DRM_IOCTL_ROCKCHIP_GEM_CREATE failed "
+ "(size=%zu)\n", size);
}
-
- return 0;
-
-cleanup_planes:
- for ( ; plane != 0; plane--) {
- struct drm_gem_close gem_close;
- memset(&gem_close, 0, sizeof(gem_close));
- gem_close.handle = bo->handles[plane - 1].u32;
- int gem_close_ret = drmIoctl(bo->gbm->fd, DRM_IOCTL_GEM_CLOSE,
- &gem_close);
- if (gem_close_ret) {
- fprintf(stderr,
- "minigbm: DRM_IOCTL_GEM_CLOSE failed: %d\n",
- gem_close_ret);
- }
+ else {
+ for (plane = 0; plane < bo->num_planes; plane++)
+ bo->handles[plane].u32 = gem_create.handle;
}
return ret;