aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Stone <[email protected]>2017-06-16 10:28:03 +0100
committerDaniel Stone <[email protected]>2017-07-18 22:16:20 +0100
commit6f8d8b17a1e25361881dfa4f91a43c1c04b029f9 (patch)
tree1a1679bb38089441c0d72aaf57837b9599c5b3c1
parent28ccf8587e1e1c0e9a7b08296807c343f33dc9de (diff)
gbm: Axe buffer import format conversion table
Wayland buffers coming from wl_drm use the WL_DRM_FORMAT_* enums, which are identical to GBM_FORMAT_*. Similarly, FD imports do not need to convert between GBM and DRI FourCC, since they are (almost) completely compatible. This widens the formats accepted by gbm_bo_import() when importing wl_buffers; previously, only XRGB8888, ARGB8888, RGB565 and YUYV were supported. Reviewed-by: Emil Velikov <[email protected]>
-rw-r--r--src/egl/wayland/wayland-drm/wayland-drm.xml3
-rw-r--r--src/gbm/backends/dri/gbm_dri.c62
-rw-r--r--src/gbm/main/gbm.h6
3 files changed, 30 insertions, 41 deletions
diff --git a/src/egl/wayland/wayland-drm/wayland-drm.xml b/src/egl/wayland/wayland-drm/wayland-drm.xml
index 5e64622df67..83aa5615539 100644
--- a/src/egl/wayland/wayland-drm/wayland-drm.xml
+++ b/src/egl/wayland/wayland-drm/wayland-drm.xml
@@ -39,7 +39,8 @@
<enum name="format">
<!-- The drm format codes match the #defines in drm_fourcc.h.
The formats actually supported by the compositor will be
- reported by the format event. -->
+ reported by the format event. New codes must not be added,
+ unless directly taken from drm_fourcc.h. -->
<entry name="c8" value="0x20203843"/>
<entry name="rgb332" value="0x38424752"/>
<entry name="bgr233" value="0x38524742"/>
diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index ecb360773c3..d4bf2430341 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -850,23 +850,9 @@ gbm_dri_bo_import(struct gbm_device *gbm,
image = dri->image->dupImage(wb->driver_buffer, NULL);
- switch (wb->format) {
- case WL_DRM_FORMAT_XRGB8888:
- gbm_format = GBM_FORMAT_XRGB8888;
- break;
- case WL_DRM_FORMAT_ARGB8888:
- gbm_format = GBM_FORMAT_ARGB8888;
- break;
- case WL_DRM_FORMAT_RGB565:
- gbm_format = GBM_FORMAT_RGB565;
- break;
- case WL_DRM_FORMAT_YUYV:
- gbm_format = GBM_FORMAT_YUYV;
- break;
- default:
- dri->image->destroyImage(image);
- return NULL;
- }
+ /* GBM_FORMAT_* is identical to WL_DRM_FORMAT_*, so no conversion
+ * required. */
+ gbm_format = wb->format;
break;
}
#endif
@@ -895,23 +881,27 @@ gbm_dri_bo_import(struct gbm_device *gbm,
{
struct gbm_import_fd_data *fd_data = buffer;
int stride = fd_data->stride, offset = 0;
- int dri_format;
+ int fourcc;
+ /* GBM's GBM_FORMAT_* tokens are a strict superset of the DRI FourCC
+ * tokens accepted by createImageFromFds, except for not supporting
+ * the sARGB format. Also, GBM_BO_FORMAT_* are defined differently to
+ * their GBM_FORMAT_* equivalents, so remap them here. */
switch (fd_data->format) {
case GBM_BO_FORMAT_XRGB8888:
- dri_format = GBM_FORMAT_XRGB8888;
+ fourcc = GBM_FORMAT_XRGB8888;
break;
case GBM_BO_FORMAT_ARGB8888:
- dri_format = GBM_FORMAT_ARGB8888;
+ fourcc = GBM_FORMAT_ARGB8888;
break;
default:
- dri_format = fd_data->format;
+ fourcc = fd_data->format;
}
image = dri->image->createImageFromFds(dri->screen,
fd_data->width,
fd_data->height,
- dri_format,
+ fourcc,
&fd_data->fd, 1,
&stride, &offset,
NULL);
@@ -936,27 +926,19 @@ gbm_dri_bo_import(struct gbm_device *gbm,
return NULL;
}
- switch(fd_data->format) {
- case GBM_FORMAT_RGB565:
- fourcc = __DRI_IMAGE_FOURCC_RGB565;
- break;
- case GBM_FORMAT_ARGB8888:
- case GBM_BO_FORMAT_ARGB8888:
- fourcc = __DRI_IMAGE_FOURCC_ARGB8888;
- break;
- case GBM_FORMAT_XRGB8888:
+ /* GBM's GBM_FORMAT_* tokens are a strict superset of the DRI FourCC
+ * tokens accepted by createImageFromDmaBufs2, except for not supporting
+ * the sARGB format. Also, GBM_BO_FORMAT_* are defined differently to
+ * their GBM_FORMAT_* equivalents, so remap them here. */
+ switch (fd_data->format) {
case GBM_BO_FORMAT_XRGB8888:
- fourcc = __DRI_IMAGE_FOURCC_XRGB8888;
- break;
- case GBM_FORMAT_ABGR8888:
- fourcc = __DRI_IMAGE_FOURCC_ABGR8888;
+ fourcc = GBM_FORMAT_XRGB8888;
break;
- case GBM_FORMAT_XBGR8888:
- fourcc = __DRI_IMAGE_FOURCC_XBGR8888;
+ case GBM_BO_FORMAT_ARGB8888:
+ fourcc = GBM_FORMAT_ARGB8888;
break;
default:
- errno = EINVAL;
- return NULL;
+ fourcc = fd_data->format;
}
image = dri->image->createImageFromDmaBufs2(dri->screen, fd_data->width,
@@ -973,7 +955,7 @@ gbm_dri_bo_import(struct gbm_device *gbm,
return NULL;
}
- gbm_format = fd_data->format;
+ gbm_format = fourcc;
break;
}
diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
index 6a9bf1fc2a8..879f003f1b4 100644
--- a/src/gbm/main/gbm.h
+++ b/src/gbm/main/gbm.h
@@ -77,6 +77,12 @@ enum gbm_bo_format {
GBM_BO_FORMAT_ARGB8888
};
+
+/**
+ * The FourCC format codes are taken from the drm_fourcc.h definition, and
+ * re-namespaced. New GBM formats must not be added, unless they are
+ * identical ports from drm_fourcc.
+ */
#define __gbm_fourcc_code(a,b,c,d) ((uint32_t)(a) | ((uint32_t)(b) << 8) | \
((uint32_t)(c) << 16) | ((uint32_t)(d) << 24))