[Mesa-dev] [PATCH 04/11] gbm: Axe buffer import format conversion table
Emil Velikov
emil.l.velikov at gmail.com
Mon Jul 3 11:06:26 UTC 2017
Hi Dan,
On 16 June 2017 at 18:14, Daniel Stone <daniels at collabora.com> wrote:
> 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.
>
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> ---
> src/gbm/backends/dri/gbm_dri.c | 62 +++++++++++++++---------------------------
> 1 file changed, 22 insertions(+), 40 deletions(-)
>
> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
> index 19be440d48..84f37d4cf5 100644
> --- a/src/gbm/backends/dri/gbm_dri.c
> +++ b/src/gbm/backends/dri/gbm_dri.c
> @@ -859,23 +859,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;
AFACIT not all the WL_DRM_FORMAT_* have a GBM_FORMAT_* equivalent.
Regardless, I think we're safe atm. (as the formats supported are
identical on both gbm/wl side) but it will cause subtle breakage as
one enhances the WL side. Please add a note if you prefer to keep the
hunk.
> break;
> }
> #endif
> @@ -904,23 +890,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;
> }
>
This and below is fine, but I think we'd want to have a "make check"
test at a later stage.
With the WL addressed (left as original or with a comment), patch is
Reviewed-by: Emil Velikov <emil.velikov at collabora.com>
-Emil
Formats have bit us in the past, so it's better to catch that before
we break Gnome/mutter, KDE, Weston etc.
To minimise test/script update the test and ensure the headers are
sane for consumption, I'm thinking of the following:
- script(?) that greps for GBM_FORMAT_* gbm.h + __DRI_IMAGE_FOURCC
dri_interface.h
- compares the values - say a simple C program but anything will do
#include "gbm.h"
#include "dri_interface.h"
int
main(void)
{
assert(GBM_FORMAT_FOO == __DRI_IMAGE_FOURCC_FOO);
....
}
More information about the mesa-dev
mailing list