X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=wayland-kms.c;h=2ea3a8d853c3301fe7c25fae46601f2e9e9a6a31;hb=79ef0ee652e146c879b83acaee9baf438704d73b;hp=c6d37ff9e16cd5d267251cbfecc640854db8c5bf;hpb=1794307177f81d3bce02f7708ba18ef7442e3368;p=platform%2Fadaptation%2Frenesas_rcar%2Fwayland-kms.git diff --git a/wayland-kms.c b/wayland-kms.c index c6d37ff..2ea3a8d 100644 --- a/wayland-kms.c +++ b/wayland-kms.c @@ -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