}
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_YUYV:
+ 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,
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);
+ WLKMS_DEBUG("%s: %s: %d planes (%d, %d, %d)\n", __FILE__, __func__, nplanes, fd0, fd1, fd2);
- if ((err = drmPrimeFDToHandle(kms->fd, prime_fd, &buffer->handle))) {
+ // XXX: Do we need to support multiplaner KMS BO?
+ if ((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,
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
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
<!-- KMS BO support. This object is created by the server and published
using the display's global event. -->
- <interface name="wl_kms" version="1">
+ <interface name="wl_kms" version="2">
<enum name="error">
<entry name="invalid_format" value="0"/>
<entry name="invalid_fd" value="1"/>
<arg name="handle" type="uint"/> <!-- XXX: Unused -->
</request>
+ <!-- Create a wayland buffer for the KMS BO buffer. The KMS
+ surface must have a prime FD. This is for a multi-planer. -->
+ <request name="create_mp_buffer" since="2">
+ <arg name="id" type="new_id" interface="wl_buffer"/>
+ <arg name="width" type="int" summary="Width"/>
+ <arg name="height" type="int" summary="Height"/>
+ <arg name="format" type="uint" summary="Pixelformat"/>
+ <arg name="fd0" type="fd" summary="DMABUF/PRIME FD for plane0"/>
+ <arg name="stride0" type="uint" summary="Stride for plane0"/>
+ <arg name="fd1" type="fd" summary="DMABUF/PRIME FD for plane1"/>
+ <arg name="stride1" type="uint" summary="Stride for plane1"/>
+ <arg name="fd2" type="fd" summary="DMABUF/PRIME FD for plane2"/>
+ <arg name="stride2" type="uint" summary="Stride for plane2"/>
+ </request>
+
<!-- Notification of the path of the drm device which is used by
the server. The client should use this device for creating
local buffers. Only buffers created from this device should