diff --git a/src/egl/drivers/dri2/platform_drm.c b/src/egl/drivers/dri2/platform_drm.c index 3853076db3f..beb15866452 100644 --- a/src/egl/drivers/dri2/platform_drm.c +++ b/src/egl/drivers/dri2/platform_drm.c @@ -38,6 +38,8 @@ #include "util/os_file.h" +#include "main/glconfig.h" + #include "egl_dri2.h" #include "egldevice.h" #include "loader.h" @@ -97,10 +99,8 @@ dri2_drm_config_is_compatible(struct dri2_egl_display *dri2_dpy, const __DRIconfig *config, struct gbm_surface *surface) { + const struct gl_config *gl_config = (struct gl_config *) config; const struct gbm_dri_visual *visual = NULL; - int shifts[4]; - unsigned int sizes[4]; - bool is_float; int i; /* Check that the EGLConfig being used to render to the surface is @@ -108,10 +108,6 @@ dri2_drm_config_is_compatible(struct dri2_egl_display *dri2_dpy, * otherwise-compatible formats is relatively common, explicitly allow * this. */ - dri2_get_shifts_and_sizes(dri2_dpy->core, config, shifts, sizes); - - dri2_get_render_type_float(dri2_dpy->core, config, &is_float); - for (i = 0; i < dri2_dpy->gbm_dri->num_visuals; i++) { visual = &dri2_dpy->gbm_dri->visual_table[i]; if (visual->gbm_format == surface->v0.format) @@ -121,21 +117,17 @@ dri2_drm_config_is_compatible(struct dri2_egl_display *dri2_dpy, if (i == dri2_dpy->gbm_dri->num_visuals) return false; - if (shifts[0] != visual->rgba_shifts.red || - shifts[1] != visual->rgba_shifts.green || - shifts[2] != visual->rgba_shifts.blue || - (shifts[3] > -1 && visual->rgba_shifts.alpha > -1 && - shifts[3] != visual->rgba_shifts.alpha) || - sizes[0] != visual->rgba_sizes.red || - sizes[1] != visual->rgba_sizes.green || - sizes[2] != visual->rgba_sizes.blue || - (sizes[3] > 0 && visual->rgba_sizes.alpha > 0 && - sizes[3] != visual->rgba_sizes.alpha) || - is_float != visual->is_float) { - return false; - } - return true; + const struct util_format_description *fmt_c = + util_format_description(gl_config->color_format); + const struct util_format_description *fmt_s = + util_format_description(visual->dri_image_format); + + if (util_is_format_compatible(fmt_c, fmt_s) || + util_is_format_compatible(fmt_s, fmt_c)) + return true; + + return false; } static _EGLSurface * @@ -504,26 +496,12 @@ drm_add_configs_for_visuals(_EGLDisplay *disp) for (unsigned i = 0; dri2_dpy->driver_configs[i]; i++) { const __DRIconfig *config = dri2_dpy->driver_configs[i]; - int shifts[4]; - unsigned int sizes[4]; - bool is_float; - - dri2_get_shifts_and_sizes(dri2_dpy->core, config, shifts, sizes); - - dri2_get_render_type_float(dri2_dpy->core, config, &is_float); + struct gl_config *gl_config = (struct gl_config *) config; for (unsigned j = 0; j < num_visuals; j++) { struct dri2_egl_config *dri2_conf; - if (visuals[j].rgba_shifts.red != shifts[0] || - visuals[j].rgba_shifts.green != shifts[1] || - visuals[j].rgba_shifts.blue != shifts[2] || - visuals[j].rgba_shifts.alpha != shifts[3] || - visuals[j].rgba_sizes.red != sizes[0] || - visuals[j].rgba_sizes.green != sizes[1] || - visuals[j].rgba_sizes.blue != sizes[2] || - visuals[j].rgba_sizes.alpha != sizes[3] || - visuals[j].is_float != is_float) + if (visuals[j].dri_image_format != gl_config->color_format) continue; const EGLint attr_list[] = { diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index b5f6b11b4c9..9cccb34e729 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -380,98 +380,24 @@ dri_screen_create_sw(struct gbm_dri_device *dri) } static const struct gbm_dri_visual gbm_dri_visuals_table[] = { - { - GBM_FORMAT_R8, __DRI_IMAGE_FORMAT_R8, - { 0, -1, -1, -1 }, - { 8, 0, 0, 0 }, - }, - { - GBM_FORMAT_R16, __DRI_IMAGE_FORMAT_R16, - { 0, -1, -1, -1 }, - { 16, 0, 0, 0 }, - }, - { - GBM_FORMAT_GR88, __DRI_IMAGE_FORMAT_GR88, - { 0, 8, -1, -1 }, - { 8, 8, 0, 0 }, - }, - { - GBM_FORMAT_GR1616, __DRI_IMAGE_FORMAT_GR1616, - { 0, 16, -1, -1 }, - { 16, 16, 0, 0 }, - }, - { - GBM_FORMAT_ARGB1555, __DRI_IMAGE_FORMAT_ARGB1555, - { 10, 5, 0, 11 }, - { 5, 5, 5, 1 }, - }, - { - GBM_FORMAT_RGB565, __DRI_IMAGE_FORMAT_RGB565, - { 11, 5, 0, -1 }, - { 5, 6, 5, 0 }, - }, - { - GBM_FORMAT_XRGB8888, __DRI_IMAGE_FORMAT_XRGB8888, - { 16, 8, 0, -1 }, - { 8, 8, 8, 0 }, - }, - { - GBM_FORMAT_ARGB8888, __DRI_IMAGE_FORMAT_ARGB8888, - { 16, 8, 0, 24 }, - { 8, 8, 8, 8 }, - }, - { - GBM_FORMAT_XBGR8888, __DRI_IMAGE_FORMAT_XBGR8888, - { 0, 8, 16, -1 }, - { 8, 8, 8, 0 }, - }, - { - GBM_FORMAT_ABGR8888, __DRI_IMAGE_FORMAT_ABGR8888, - { 0, 8, 16, 24 }, - { 8, 8, 8, 8 }, - }, - { - GBM_FORMAT_XRGB2101010, __DRI_IMAGE_FORMAT_XRGB2101010, - { 20, 10, 0, -1 }, - { 10, 10, 10, 0 }, - }, - { - GBM_FORMAT_ARGB2101010, __DRI_IMAGE_FORMAT_ARGB2101010, - { 20, 10, 0, 30 }, - { 10, 10, 10, 2 }, - }, - { - GBM_FORMAT_XBGR2101010, __DRI_IMAGE_FORMAT_XBGR2101010, - { 0, 10, 20, -1 }, - { 10, 10, 10, 0 }, - }, - { - GBM_FORMAT_ABGR2101010, __DRI_IMAGE_FORMAT_ABGR2101010, - { 0, 10, 20, 30 }, - { 10, 10, 10, 2 }, - }, - { - GBM_FORMAT_XBGR16161616, __DRI_IMAGE_FORMAT_XBGR16161616, - { 0, 16, 32, -1 }, - { 16, 16, 16, 0 }, - }, - { - GBM_FORMAT_ABGR16161616, __DRI_IMAGE_FORMAT_ABGR16161616, - { 0, 16, 32, 48 }, - { 16, 16, 16, 16 }, - }, - { - GBM_FORMAT_XBGR16161616F, __DRI_IMAGE_FORMAT_XBGR16161616F, - { 0, 16, 32, -1 }, - { 16, 16, 16, 0 }, - true, - }, - { - GBM_FORMAT_ABGR16161616F, __DRI_IMAGE_FORMAT_ABGR16161616F, - { 0, 16, 32, 48 }, - { 16, 16, 16, 16 }, - true, - }, + { GBM_FORMAT_R8, __DRI_IMAGE_FORMAT_R8 }, + { GBM_FORMAT_R16, __DRI_IMAGE_FORMAT_R16 }, + { GBM_FORMAT_GR88, __DRI_IMAGE_FORMAT_GR88 }, + { GBM_FORMAT_GR1616, __DRI_IMAGE_FORMAT_GR1616 }, + { GBM_FORMAT_ARGB1555, __DRI_IMAGE_FORMAT_ARGB1555 }, + { 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 }, + { GBM_FORMAT_XBGR2101010, __DRI_IMAGE_FORMAT_XBGR2101010 }, + { GBM_FORMAT_ABGR2101010, __DRI_IMAGE_FORMAT_ABGR2101010 }, + { GBM_FORMAT_XBGR16161616, __DRI_IMAGE_FORMAT_XBGR16161616 }, + { GBM_FORMAT_ABGR16161616, __DRI_IMAGE_FORMAT_ABGR16161616 }, + { GBM_FORMAT_XBGR16161616F, __DRI_IMAGE_FORMAT_XBGR16161616F }, + { GBM_FORMAT_ABGR16161616F, __DRI_IMAGE_FORMAT_ABGR16161616F }, }; static int diff --git a/src/gbm/backends/dri/gbm_driint.h b/src/gbm/backends/dri/gbm_driint.h index 76f6194aa8a..6600a82d1de 100644 --- a/src/gbm/backends/dri/gbm_driint.h +++ b/src/gbm/backends/dri/gbm_driint.h @@ -45,19 +45,6 @@ struct gbm_dri_bo; struct gbm_dri_visual { uint32_t gbm_format; int dri_image_format; - struct { - int red; - int green; - int blue; - int alpha; - } rgba_shifts; - struct { - unsigned int red; - unsigned int green; - unsigned int blue; - unsigned int alpha; - } rgba_sizes; - bool is_float; }; struct gbm_dri_device {