Do not import multi-plane DMABUF.
[platform/adaptation/renesas_rcar/wayland-kms.git] / wayland-kms.c
index c6d37ff..2ea3a8d 100644 (file)
@@ -123,18 +123,36 @@ kms_authenticate(struct wl_client *client, struct wl_resource *resource,
 }
 
 static void
-kms_create_buffer(struct wl_client *client, struct wl_resource *resource,
-                 uint32_t id, int32_t prime_fd, int32_t width, int32_t height,
-                 uint32_t stride, uint32_t format, uint32_t handle)
+kms_create_mp_buffer(struct wl_client *client, struct wl_resource *resource,
+                    uint32_t id, int32_t width, int32_t height, uint32_t format,
+                    int32_t fd0, uint32_t stride0, int32_t fd1, uint32_t stride1,
+                    int32_t fd2, uint32_t stride2)
 {
        struct wl_kms *kms = resource->data;
        struct wl_kms_buffer *buffer;
-       int err;
+       int err, nplanes;
 
        switch (format) {
        case WL_KMS_FORMAT_ARGB8888:
        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;
+               break;
+
+       case WL_KMS_FORMAT_NV12:
+       case WL_KMS_FORMAT_NV21:
+       case WL_KMS_FORMAT_NV16:
+       case WL_KMS_FORMAT_NV61:
+               nplanes = 2;
                break;
+
        default:
                wl_resource_post_error(resource,
                                       WL_KMS_ERROR_INVALID_FORMAT,
@@ -152,12 +170,24 @@ kms_create_buffer(struct wl_client *client, struct wl_resource *resource,
        buffer->width = width;
        buffer->height = height;
        buffer->format = format;
-       buffer->stride = stride;
-       buffer->fd = prime_fd;
+       buffer->num_planes = nplanes;
+       buffer->stride = buffer->planes[0].stride = stride0;
+       buffer->fd = buffer->planes[0].fd = fd0;
 
-       WLKMS_DEBUG("%s: %s: prime_fd=%d\n", __FILE__, __func__, prime_fd);
+       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;
+       }
 
-       if ((err = drmPrimeFDToHandle(kms->fd, prime_fd, &buffer->handle))) {
+       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 ((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,
@@ -178,9 +208,20 @@ kms_create_buffer(struct wl_client *client, struct wl_resource *resource,
                                       buffer, destroy_buffer);
 }
 
+
+static void
+kms_create_buffer(struct wl_client *client, struct wl_resource *resource,
+                 uint32_t id, int32_t prime_fd, int32_t width, int32_t height,
+                 uint32_t stride, uint32_t format, uint32_t handle)
+{
+       kms_create_mp_buffer(client, resource, id, width, height, format, prime_fd, stride,
+                            0, 0, 0, 0);
+}
+
 const static struct wl_kms_interface kms_interface = {
        .authenticate = kms_authenticate,
        .create_buffer = kms_create_buffer,
+       .create_mp_buffer = kms_create_mp_buffer,
 };
 
 static void
@@ -232,7 +273,7 @@ struct wl_kms *wayland_kms_init(struct wl_display *display,
        kms->device_name = strdup(device_name);
        kms->fd = fd;
 
-       wl_global_create(display, &wl_kms_interface, 1, kms, bind_kms);
+       wl_global_create(display, &wl_kms_interface, 2, kms, bind_kms);
 
        /*
         * we're the server in the middle. we should forward the auth