|
|
|
|
@ -77,6 +77,7 @@ EglDisplay::EglDisplay(::EGLDisplay display, const QList<QByteArray> &extensions |
|
|
|
|
: m_handle(display) |
|
|
|
|
, m_extensions(extensions) |
|
|
|
|
, m_owning(owning) |
|
|
|
|
, m_renderNode(determineRenderNode()) |
|
|
|
|
, m_supportsBufferAge(extensions.contains(QByteArrayLiteral("EGL_EXT_buffer_age")) && qgetenv("KWIN_USE_BUFFER_AGE") != "0") |
|
|
|
|
, m_supportsNativeFence(extensions.contains(QByteArrayLiteral("EGL_ANDROID_native_fence_sync"))) |
|
|
|
|
{ |
|
|
|
|
@ -135,27 +136,7 @@ static bool checkExtension(const QByteArrayView extensions, const QByteArrayView |
|
|
|
|
|
|
|
|
|
QString EglDisplay::renderNode() const |
|
|
|
|
{ |
|
|
|
|
const char *clientExtensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); |
|
|
|
|
if (checkExtension(clientExtensions, "EGL_EXT_device_query")) { |
|
|
|
|
EGLAttrib eglDeviceAttrib; |
|
|
|
|
if (eglQueryDisplayAttribEXT(m_handle, EGL_DEVICE_EXT, &eglDeviceAttrib)) { |
|
|
|
|
EGLDeviceEXT eglDevice = reinterpret_cast<EGLDeviceEXT>(eglDeviceAttrib); |
|
|
|
|
|
|
|
|
|
const char *deviceExtensions = eglQueryDeviceStringEXT(eglDevice, EGL_EXTENSIONS); |
|
|
|
|
if (checkExtension(deviceExtensions, "EGL_EXT_device_drm_render_node")) { |
|
|
|
|
if (const char *node = eglQueryDeviceStringEXT(eglDevice, EGL_DRM_RENDER_NODE_FILE_EXT)) { |
|
|
|
|
return QString::fromLocal8Bit(node); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (checkExtension(deviceExtensions, "EGL_EXT_device_drm")) { |
|
|
|
|
// Fallback to display device.
|
|
|
|
|
if (const char *node = eglQueryDeviceStringEXT(eglDevice, EGL_DRM_DEVICE_FILE_EXT)) { |
|
|
|
|
return QString::fromLocal8Bit(node); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return QString(); |
|
|
|
|
return m_renderNode; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool EglDisplay::supportsBufferAge() const |
|
|
|
|
@ -328,6 +309,31 @@ QHash<uint32_t, EglDisplay::DrmFormatInfo> EglDisplay::queryImportFormats() cons |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QString EglDisplay::determineRenderNode() const |
|
|
|
|
{ |
|
|
|
|
const char *clientExtensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); |
|
|
|
|
if (checkExtension(clientExtensions, "EGL_EXT_device_query")) { |
|
|
|
|
EGLAttrib eglDeviceAttrib; |
|
|
|
|
if (eglQueryDisplayAttribEXT(m_handle, EGL_DEVICE_EXT, &eglDeviceAttrib)) { |
|
|
|
|
EGLDeviceEXT eglDevice = reinterpret_cast<EGLDeviceEXT>(eglDeviceAttrib); |
|
|
|
|
|
|
|
|
|
const char *deviceExtensions = eglQueryDeviceStringEXT(eglDevice, EGL_EXTENSIONS); |
|
|
|
|
if (checkExtension(deviceExtensions, "EGL_EXT_device_drm_render_node")) { |
|
|
|
|
if (const char *node = eglQueryDeviceStringEXT(eglDevice, EGL_DRM_RENDER_NODE_FILE_EXT)) { |
|
|
|
|
return QString::fromLocal8Bit(node); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (checkExtension(deviceExtensions, "EGL_EXT_device_drm")) { |
|
|
|
|
// Fallback to display device.
|
|
|
|
|
if (const char *node = eglQueryDeviceStringEXT(eglDevice, EGL_DRM_DEVICE_FILE_EXT)) { |
|
|
|
|
return QString::fromLocal8Bit(node); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return QString(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
EGLImageKHR EglDisplay::createImage(EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list) const |
|
|
|
|
{ |
|
|
|
|
Q_ASSERT(m_functions.createImageKHR); |
|
|
|
|
|