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;