From 8a2b9a014f7d477a89a9ae836d83e5b5c08e5d13 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Thu, 15 Feb 2018 11:41:10 +0100 Subject: [PATCH] check for EGL_KHR_platform_gbm extension as well Summary: some drivers, like Mali have EGL_KHR_platform_gbm but not EGL_MESA_platform_gbm Test Plan: pending a test on rock64 board Reviewers: #kwin, #plasma, davidedmundson, graesslin Reviewed By: #kwin, #plasma, graesslin Subscribers: graesslin, garg, davidedmundson, plasma-devel, kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D10346 --- plugins/platforms/drm/egl_gbm_backend.cpp | 10 +++++++--- plugins/platforms/virtual/egl_gbm_backend.cpp | 12 ++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/plugins/platforms/drm/egl_gbm_backend.cpp b/plugins/platforms/drm/egl_gbm_backend.cpp index 092cee3774..815f9ea096 100644 --- a/plugins/platforms/drm/egl_gbm_backend.cpp +++ b/plugins/platforms/drm/egl_gbm_backend.cpp @@ -90,9 +90,13 @@ bool EglGbmBackend::initializeEgl() // Use eglGetPlatformDisplayEXT() to get the display pointer // if the implementation supports it. if (display == EGL_NO_DISPLAY) { + const bool hasMesaGBM = hasClientExtension(QByteArrayLiteral("EGL_MESA_platform_gbm")); + const bool hasKHRGBM = hasClientExtension(QByteArrayLiteral("EGL_KHR_platform_gbm")); + const GLenum platform = hasMesaGBM ? EGL_PLATFORM_GBM_MESA : EGL_PLATFORM_GBM_KHR; + if (!hasClientExtension(QByteArrayLiteral("EGL_EXT_platform_base")) || - !hasClientExtension(QByteArrayLiteral("EGL_MESA_platform_gbm"))) { - setFailed("EGL_EXT_platform_base and/or EGL_MESA_platform_gbm missing"); + (!hasMesaGBM && !hasKHRGBM)) { + setFailed("missing one or more extensions between EGL_EXT_platform_base, EGL_MESA_platform_gbm, EGL_KHR_platform_gbm"); return false; } @@ -103,7 +107,7 @@ bool EglGbmBackend::initializeEgl() } m_backend->setGbmDevice(device); - display = eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_MESA, device, nullptr); + display = eglGetPlatformDisplayEXT(platform, device, nullptr); } if (display == EGL_NO_DISPLAY) diff --git a/plugins/platforms/virtual/egl_gbm_backend.cpp b/plugins/platforms/virtual/egl_gbm_backend.cpp index 3057105231..cce4d3d4d3 100644 --- a/plugins/platforms/virtual/egl_gbm_backend.cpp +++ b/plugins/platforms/virtual/egl_gbm_backend.cpp @@ -99,22 +99,26 @@ bool EglGbmBackend::initializeEgl() // Use eglGetPlatformDisplayEXT() to get the display pointer // if the implementation supports it. if (display == EGL_NO_DISPLAY) { + const bool hasMesaGBM = hasClientExtension(QByteArrayLiteral("EGL_MESA_platform_gbm")); + const bool hasKHRGBM = hasClientExtension(QByteArrayLiteral("EGL_KHR_platform_gbm")); + const GLenum platform = hasMesaGBM ? EGL_PLATFORM_GBM_MESA : EGL_PLATFORM_GBM_KHR; + if (!hasClientExtension(QByteArrayLiteral("EGL_EXT_platform_base")) || - !hasClientExtension(QByteArrayLiteral("EGL_MESA_platform_gbm"))) { - setFailed("EGL_EXT_platform_base and/or EGL_MESA_platform_gbm missing"); + (!hasMesaGBM && !hasKHRGBM)) { + setFailed("missing one or more extensions between EGL_EXT_platform_base, EGL_MESA_platform_gbm, EGL_KHR_platform_gbm"); return false; } #if HAVE_GBM initGbmDevice(); if (auto device = m_backend->gbmDevice()) { - display = eglGetPlatformDisplayEXT(EGL_PLATFORM_GBM_MESA, device, nullptr); + display = eglGetPlatformDisplayEXT(platform, device, nullptr); } #endif if (display == EGL_NO_DISPLAY) { qCWarning(KWIN_VIRTUAL) << "Failed to create EGLDisplay through GBM device, trying with default device"; - display = eglGetPlatformDisplay(EGL_PLATFORM_GBM_MESA, EGL_DEFAULT_DISPLAY, nullptr); + display = eglGetPlatformDisplayEXT(platform, EGL_DEFAULT_DISPLAY, nullptr); } }