diff --git a/plugins/platforms/drm/egl_gbm_backend.cpp b/plugins/platforms/drm/egl_gbm_backend.cpp --- a/plugins/platforms/drm/egl_gbm_backend.cpp +++ b/plugins/platforms/drm/egl_gbm_backend.cpp @@ -258,17 +258,43 @@ EGLint count; EGLConfig configs[1024]; - if (eglChooseConfig(eglDisplay(), config_attribs, configs, 1, &count) == EGL_FALSE) { + if (!eglChooseConfig(eglDisplay(), config_attribs, configs, sizeof(configs)/sizeof(EGLConfig), &count)) { qCCritical(KWIN_DRM) << "choose config failed"; return false; } - if (count != 1) { - qCCritical(KWIN_DRM) << "choose config did not return a config" << count; - return false; + + qCDebug(KWIN_DRM) << "EGL buffer configs count:" << count; + + // loop through all configs, chosing the first one that has satisfying format + for (EGLint i = 0; i < count; i++) { + EGLint gbm_format, blue_size, red_size, green_size, alpha_size; + // query some configuration parameters, to show in debug log + eglGetConfigAttrib(eglDisplay(), configs[i], EGL_NATIVE_VISUAL_ID, &gbm_format); + // number of bits for color channel + eglGetConfigAttrib(eglDisplay(), configs[i], EGL_RED_SIZE, &red_size); + eglGetConfigAttrib(eglDisplay(), configs[i], EGL_GREEN_SIZE, &green_size); + eglGetConfigAttrib(eglDisplay(), configs[i], EGL_BLUE_SIZE, &blue_size); + eglGetConfigAttrib(eglDisplay(), configs[i], EGL_ALPHA_SIZE, &alpha_size); + + // output debug info + // GBM formats are declared as FOURCC code (integer from ASCII chars, so use this fact) + char gbm_format_str[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + memcpy(gbm_format_str, &gbm_format, sizeof(EGLint)); + qCDebug(KWIN_DRM) << i << "th config GBM format:" << gbm_format_str + << "; color sizes (RGBA order):" << red_size << green_size << blue_size << alpha_size; + + if (gbm_format == GBM_FORMAT_XRGB8888) { + setConfig(configs[i]); + return true; + } + if (gbm_format == GBM_FORMAT_ARGB8888) { + setConfig(configs[i]); + return true; + } } - setConfig(configs[0]); - return true; + qCCritical(KWIN_DRM) << "choose config did not return a suitable config" << count; + return false; } void EglGbmBackend::present()