+static bool
+dri2_drm_config_is_compatible(struct dri2_egl_display *dri2_dpy,
+ const __DRIconfig *config,
+ struct gbm_surface *surface)
+{
+ 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
+ * compatible with the surface format. Since mixing ARGB and XRGB of
+ * 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->format)
+ break;
+ }
+
+ 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;
+}
+