Release DMABUFs when destroying the buffer.
[platform/adaptation/renesas_rcar/wayland-kms.git] / wayland-kms.c
index 29ada01..98b482d 100644 (file)
@@ -73,12 +73,15 @@ struct wl_kms {
 static void destroy_buffer(struct wl_resource *resource)
 {
        struct wl_kms_buffer *buffer = resource->data;
-       struct drm_gem_close close;
-       int ret;
+       struct drm_gem_close gem_close;
+       int i, ret;
+
+       for (i = 0; i < buffer->num_planes; i++)
+               close(buffer->planes[i].fd);
 
        if (buffer->handle) {
-               close.handle = buffer->handle;
-               ret = drmIoctl(buffer->kms->fd, DRM_IOCTL_GEM_CLOSE, &close);
+               gem_close.handle = buffer->handle;
+               ret = drmIoctl(buffer->kms->fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
                if (ret)
                        WLKMS_DEBUG("%s: %s: DRM_IOCTL_GEM_CLOSE failed.(%s)\n",
                                 __FILE__, __func__, strerror(errno));
@@ -137,7 +140,10 @@ kms_create_mp_buffer(struct wl_client *client, struct wl_resource *resource,
        case WL_KMS_FORMAT_XRGB8888:
        case WL_KMS_FORMAT_ABGR8888:
        case WL_KMS_FORMAT_XBGR8888:
+       case WL_KMS_FORMAT_RGB888:
+       case WL_KMS_FORMAT_BGR888:
        case WL_KMS_FORMAT_YUYV:
+       case WL_KMS_FORMAT_UYVY:
        case WL_KMS_FORMAT_RGB565:
        case WL_KMS_FORMAT_BGR565:
                nplanes = 1;
@@ -171,10 +177,20 @@ kms_create_mp_buffer(struct wl_client *client, struct wl_resource *resource,
        buffer->stride = buffer->planes[0].stride = stride0;
        buffer->fd = buffer->planes[0].fd = fd0;
 
+       if (nplanes > 1) {
+               buffer->planes[1].stride = stride1;
+               buffer->planes[1].fd = fd1;
+       }
+
+       if (nplanes > 2) {
+               buffer->planes[2].stride = stride2;
+               buffer->planes[2].fd = fd2;
+       }
+
        WLKMS_DEBUG("%s: %s: %d planes (%d, %d, %d)\n", __FILE__, __func__, nplanes, fd0, fd1, fd2);
 
        // XXX: Do we need to support multiplaner KMS BO?
-       if ((err = drmPrimeFDToHandle(kms->fd, fd0, &buffer->handle))) {
+       if ((nplanes == 1) && (err = drmPrimeFDToHandle(kms->fd, fd0, &buffer->handle))) {
                WLKMS_DEBUG("%s: %s: drmPrimeFDToHandle() failed...%d (%s)\n", __FILE__, __func__, err, strerror(errno));
                wl_resource_post_error(resource,
                                       WL_KMS_ERROR_INVALID_FD,