gbm: Pull out FourCC <-> DRIimage format table
Rather than duplicated (yet asymmetric) open-coded tables, pull them out to a common structure. Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
@@ -5,6 +5,7 @@ pkgconfig_DATA = main/gbm.pc
|
||||
|
||||
AM_CFLAGS = \
|
||||
-I$(top_srcdir)/include \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/loader \
|
||||
-I$(top_srcdir)/src/gbm/main \
|
||||
$(DLOPEN_CFLAGS) \
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
|
||||
#include "gbmint.h"
|
||||
#include "loader.h"
|
||||
#include "util/macros.h"
|
||||
|
||||
/* For importing wl_buffer */
|
||||
#if HAVE_WAYLAND_PLATFORM
|
||||
@@ -541,6 +542,65 @@ dri_screen_create_sw(struct gbm_dri_device *dri)
|
||||
return dri_screen_create_swrast(dri);
|
||||
}
|
||||
|
||||
static const struct {
|
||||
uint32_t gbm_format;
|
||||
int dri_image_format;
|
||||
} gbm_to_dri_image_formats[] = {
|
||||
{ GBM_FORMAT_R8, __DRI_IMAGE_FORMAT_R8 },
|
||||
{ GBM_FORMAT_GR88, __DRI_IMAGE_FORMAT_GR88 },
|
||||
{ GBM_FORMAT_RGB565, __DRI_IMAGE_FORMAT_RGB565 },
|
||||
{ GBM_FORMAT_XRGB8888, __DRI_IMAGE_FORMAT_XRGB8888 },
|
||||
{ GBM_FORMAT_ARGB8888, __DRI_IMAGE_FORMAT_ARGB8888 },
|
||||
{ GBM_FORMAT_XBGR8888, __DRI_IMAGE_FORMAT_XBGR8888 },
|
||||
{ GBM_FORMAT_ABGR8888, __DRI_IMAGE_FORMAT_ABGR8888 },
|
||||
{ GBM_FORMAT_XRGB2101010, __DRI_IMAGE_FORMAT_XRGB2101010 },
|
||||
{ GBM_FORMAT_ARGB2101010, __DRI_IMAGE_FORMAT_ARGB2101010 },
|
||||
};
|
||||
|
||||
/* The two GBM_BO_FORMAT_[XA]RGB8888 formats alias the GBM_FORMAT_*
|
||||
* formats of the same name. We want to accept them whenever someone
|
||||
* has a GBM format, but never return them to the user. */
|
||||
static int
|
||||
gbm_format_canonicalize(uint32_t gbm_format)
|
||||
{
|
||||
switch (gbm_format) {
|
||||
case GBM_BO_FORMAT_XRGB8888:
|
||||
return GBM_FORMAT_XRGB8888;
|
||||
case GBM_BO_FORMAT_ARGB8888:
|
||||
return GBM_FORMAT_ARGB8888;
|
||||
default:
|
||||
return gbm_format;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
gbm_format_to_dri_format(uint32_t gbm_format)
|
||||
{
|
||||
int i;
|
||||
|
||||
gbm_format = gbm_format_canonicalize(gbm_format);
|
||||
for (i = 0; i < ARRAY_SIZE(gbm_to_dri_image_formats); i++) {
|
||||
if (gbm_to_dri_image_formats[i].gbm_format == gbm_format)
|
||||
return gbm_to_dri_image_formats[i].dri_image_format;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gbm_dri_to_gbm_format(int dri_format)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(gbm_to_dri_image_formats); i++) {
|
||||
if (gbm_to_dri_image_formats[i].dri_image_format == dri_format)
|
||||
return gbm_to_dri_image_formats[i].gbm_format;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
gbm_dri_is_format_supported(struct gbm_device *gbm,
|
||||
uint32_t format,
|
||||
@@ -786,35 +846,6 @@ gbm_dri_bo_destroy(struct gbm_bo *_bo)
|
||||
free(bo);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gbm_dri_to_gbm_format(uint32_t dri_format)
|
||||
{
|
||||
uint32_t ret = 0;
|
||||
|
||||
switch (dri_format) {
|
||||
case __DRI_IMAGE_FORMAT_RGB565:
|
||||
ret = GBM_FORMAT_RGB565;
|
||||
break;
|
||||
case __DRI_IMAGE_FORMAT_XRGB8888:
|
||||
ret = GBM_FORMAT_XRGB8888;
|
||||
break;
|
||||
case __DRI_IMAGE_FORMAT_ARGB8888:
|
||||
ret = GBM_FORMAT_ARGB8888;
|
||||
break;
|
||||
case __DRI_IMAGE_FORMAT_XBGR8888:
|
||||
ret = GBM_FORMAT_XBGR8888;
|
||||
break;
|
||||
case __DRI_IMAGE_FORMAT_ABGR8888:
|
||||
ret = GBM_FORMAT_ABGR8888;
|
||||
break;
|
||||
default:
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct gbm_bo *
|
||||
gbm_dri_bo_import(struct gbm_device *gbm,
|
||||
uint32_t type, void *buffer, uint32_t usage)
|
||||
@@ -885,18 +916,8 @@ gbm_dri_bo_import(struct gbm_device *gbm,
|
||||
|
||||
/* 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:
|
||||
fourcc = GBM_FORMAT_XRGB8888;
|
||||
break;
|
||||
case GBM_BO_FORMAT_ARGB8888:
|
||||
fourcc = GBM_FORMAT_ARGB8888;
|
||||
break;
|
||||
default:
|
||||
fourcc = fd_data->format;
|
||||
}
|
||||
* the sARGB format. */
|
||||
fourcc = gbm_format_canonicalize(fd_data->format);
|
||||
|
||||
image = dri->image->createImageFromFds(dri->screen,
|
||||
fd_data->width,
|
||||
@@ -928,18 +949,8 @@ gbm_dri_bo_import(struct gbm_device *gbm,
|
||||
|
||||
/* 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 = GBM_FORMAT_XRGB8888;
|
||||
break;
|
||||
case GBM_BO_FORMAT_ARGB8888:
|
||||
fourcc = GBM_FORMAT_ARGB8888;
|
||||
break;
|
||||
default:
|
||||
fourcc = fd_data->format;
|
||||
}
|
||||
* the sARGB format. */
|
||||
fourcc = gbm_format_canonicalize(fd_data->format);
|
||||
|
||||
image = dri->image->createImageFromDmaBufs2(dri->screen, fd_data->width,
|
||||
fd_data->height, fourcc,
|
||||
@@ -1105,6 +1116,8 @@ gbm_dri_bo_create(struct gbm_device *gbm,
|
||||
*/
|
||||
assert(!(usage && count));
|
||||
|
||||
format = gbm_format_canonicalize(format);
|
||||
|
||||
if (usage & GBM_BO_USE_WRITE || dri->image == NULL)
|
||||
return create_dumb(gbm, width, height, format, usage);
|
||||
|
||||
@@ -1117,37 +1130,8 @@ gbm_dri_bo_create(struct gbm_device *gbm,
|
||||
bo->base.height = height;
|
||||
bo->base.format = format;
|
||||
|
||||
switch (format) {
|
||||
case GBM_FORMAT_R8:
|
||||
dri_format = __DRI_IMAGE_FORMAT_R8;
|
||||
break;
|
||||
case GBM_FORMAT_GR88:
|
||||
dri_format = __DRI_IMAGE_FORMAT_GR88;
|
||||
break;
|
||||
case GBM_FORMAT_RGB565:
|
||||
dri_format = __DRI_IMAGE_FORMAT_RGB565;
|
||||
break;
|
||||
case GBM_FORMAT_XRGB8888:
|
||||
case GBM_BO_FORMAT_XRGB8888:
|
||||
dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
|
||||
break;
|
||||
case GBM_FORMAT_ARGB8888:
|
||||
case GBM_BO_FORMAT_ARGB8888:
|
||||
dri_format = __DRI_IMAGE_FORMAT_ARGB8888;
|
||||
break;
|
||||
case GBM_FORMAT_ABGR8888:
|
||||
dri_format = __DRI_IMAGE_FORMAT_ABGR8888;
|
||||
break;
|
||||
case GBM_FORMAT_XBGR8888:
|
||||
dri_format = __DRI_IMAGE_FORMAT_XBGR8888;
|
||||
break;
|
||||
case GBM_FORMAT_ARGB2101010:
|
||||
dri_format = __DRI_IMAGE_FORMAT_ARGB2101010;
|
||||
break;
|
||||
case GBM_FORMAT_XRGB2101010:
|
||||
dri_format = __DRI_IMAGE_FORMAT_XRGB2101010;
|
||||
break;
|
||||
default:
|
||||
dri_format = gbm_format_to_dri_format(format);
|
||||
if (dri_format == 0) {
|
||||
errno = EINVAL;
|
||||
goto failed;
|
||||
}
|
||||
@@ -1315,7 +1299,7 @@ gbm_dri_surface_create(struct gbm_device *gbm,
|
||||
surf->base.gbm = gbm;
|
||||
surf->base.width = width;
|
||||
surf->base.height = height;
|
||||
surf->base.format = format;
|
||||
surf->base.format = gbm_format_canonicalize(format);
|
||||
surf->base.flags = flags;
|
||||
if (!modifiers) {
|
||||
assert(!count);
|
||||
|
||||
Reference in New Issue
Block a user