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));
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;
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,