OSDN Git Service

minigbm: One buffer for NV12
authorGurchetan Singh <gurchetansingh@chromium.org>
Fri, 15 Jul 2016 02:54:44 +0000 (19:54 -0700)
committerchrome-bot <chrome-bot@chromium.org>
Tue, 19 Jul 2016 00:32:55 +0000 (17:32 -0700)
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>
helpers.c
rockchip.c

index 2cb0408..e89c067 100644 (file)
--- a/helpers.c
+++ b/helpers.c
@@ -208,11 +208,11 @@ int gbm_gem_bo_destroy(struct gbm_bo *bo)
        size_t plane, i;
 
        for (plane = 0; plane < bo->num_planes; plane++) {
-               bool already_closed = false;
-               for (i = 1; i < plane && !already_closed; i++)
-                       if (bo->handles[i-1].u32 == bo->handles[plane].u32)
-                               already_closed = true;
-               if (already_closed)
+               for (i = 0; i < plane; i++)
+                       if (bo->handles[i].u32 == bo->handles[plane].u32)
+                               break;
+               /* Make sure close hasn't already been called on this handle */
+               if (i != plane)
                        continue;
 
                memset(&gem_close, 0, sizeof(gem_close));
index 0c0e0a8..edf97af 100644 (file)
@@ -24,61 +24,50 @@ static int gbm_rockchip_bo_create(struct gbm_bo *bo,
        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;
 
-       return 0;
+       ret = drmIoctl(bo->gbm->fd, DRM_IOCTL_ROCKCHIP_GEM_CREATE,
+                          &gem_create);
 
-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);
-               }
+       if (ret) {
+               fprintf(stderr, "minigbm: DRM_IOCTL_ROCKCHIP_GEM_CREATE failed "
+                               "(size=%zu)\n", size);
+       }
+       else {
+               for (plane = 0; plane < bo->num_planes; plane++)
+                       bo->handles[plane].u32 = gem_create.handle;
        }
 
        return ret;