Add X11 support for the DRIVE CX

The spec, added in 5.7.0, simply defined WIN_INTERFACE_CUSTOM, leading
to the generic, non-X11 typedefs for the EGL native types. This is
fine for the typical embedded use, but is not what is wanted when
targeting xcb, and leads to disabling EGL-on-X support.

Therefore, move the define into a comon header and let the individual
libs decide by defining or not defining QT_EGL_NO_X11. This sets both
MESA_EGL_NO_X11_HEADERS and WIN_INTERFACE_CUSTOM in qt_egl_p.h.

This way Qt builds supporting all three of eglfs (DRM+EGLDevice),
wayland, and xcb (EGL) can be generated out of the box.

[ChangeLog][Platform Specific Changes][Linux] xcb with EGL and OpenGL
ES, as well as eglfs with the eglfs_x11 backend, are now supported on
DRIVE CX boards when using the linux-drive-cx-g++ device spec.

Done-with: Louai Al-Khanji <louai.al-khanji@qt.io>
Task-number: QTBUG-55140
Change-Id: I6f186d16612e170995e3bca1214bcabad59af08e
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
bb10
Laszlo Agocs 2016-08-04 12:22:05 +02:00
parent c35fef9d3b
commit e694ced803
23 changed files with 157 additions and 33 deletions

View File

@ -10,6 +10,10 @@
# -no-gcc-sysroot \
# -opengl es2
# Note: This enables eglfs and wayland only. To enable xcb (with EGL
# support) as well, add -qt-xcb and fix the SDK's X11 headers. See
# QTBUG-55140.
include(../common/linux_device_pre.conf)
isEmpty(VIBRANTE_SDK_TOPDIR):error("You must pass -device-option VIBRANTE_SDK_TOPDIR=/path/to/sdk")
@ -31,7 +35,10 @@ QMAKE_LFLAGS += \
-Wl,-rpath-link,$$[QT_SYSROOT]/lib/aarch64-linux-gnu
DISTRO_OPTS += aarch64
COMPILER_FLAGS += -mtune=cortex-a57.cortex-a53 -march=armv8-a -DWIN_INTERFACE_CUSTOM
# Do not define WIN_INTERFACE_CUSTOM here. It is suitable for drm and
# wayland, but not X11. Leave it to qt_egl_p.h instead.
COMPILER_FLAGS += -mtune=cortex-a57.cortex-a53 -march=armv8-a
EGLFS_DEVICE_INTEGRATION = eglfs_kms_egldevice

View File

@ -41,7 +41,7 @@
#define QEGLNATIVECONTEXT_H
#include <QtCore/QMetaType>
#include <EGL/egl.h>
#include <QtPlatformSupport/private/qt_egl_p.h>
QT_BEGIN_NAMESPACE

View File

@ -1,7 +1,8 @@
contains(QT_CONFIG,egl) {
HEADERS += \
$$PWD/qeglconvenience_p.h \
$$PWD/qeglstreamconvenience_p.h
$$PWD/qeglstreamconvenience_p.h \
$$PWD/qt_egl_p.h
SOURCES += \
$$PWD/qeglconvenience.cpp \
@ -15,8 +16,8 @@ contains(QT_CONFIG,egl) {
$$PWD/qeglpbuffer.cpp
}
# Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
contains(QT_CONFIG,xlib) {
HEADERS += \

View File

@ -54,7 +54,7 @@
#include <QtGui/QSurfaceFormat>
#include <QtCore/QVector>
#include <QtCore/QSizeF>
#include <EGL/egl.h>
#include <QtPlatformSupport/private/qt_egl_p.h>
QT_BEGIN_NAMESPACE

View File

@ -53,7 +53,6 @@
#include <qpa/qplatformoffscreensurface.h>
#include <QtPlatformSupport/private/qeglplatformcontext_p.h>
#include <EGL/egl.h>
QT_BEGIN_NAMESPACE

View File

@ -55,7 +55,7 @@
#include <qpa/qplatformwindow.h>
#include <qpa/qplatformopenglcontext.h>
#include <QtCore/QVariant>
#include <EGL/egl.h>
#include <QtPlatformSupport/private/qt_egl_p.h>
QT_BEGIN_NAMESPACE

View File

@ -52,8 +52,7 @@
//
#include <qglobal.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <QtPlatformSupport/private/qt_egl_p.h>
// This provides runtime EGLDevice/Output/Stream support even when eglext.h in
// the sysroot is not up-to-date.

View File

@ -0,0 +1,117 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QT_EGL_P_H
#define QT_EGL_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#ifdef QT_EGL_NO_X11
# define MESA_EGL_NO_X11_HEADERS // MESA
# define WIN_INTERFACE_CUSTOM // NV
#endif // QT_EGL_NO_X11
#ifdef QT_EGL_WAYLAND
# define WAYLAND // NV
#endif // QT_EGL_WAYLAND
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <stdint.h>
QT_BEGIN_NAMESPACE
namespace QtInternal {
template <class FromType, class ToType>
struct QtEglConverter
{
static inline ToType convert(FromType v)
{ return v; }
};
template <>
struct QtEglConverter<uint32_t, uintptr_t>
{
static inline uintptr_t convert(uint32_t v)
{ return v; }
};
#if Q_PROCESSOR_WORDSIZE > 4
template <>
struct QtEglConverter<uintptr_t, uint32_t>
{
static inline uint32_t convert(uintptr_t v)
{ return uint32_t(v); }
};
#endif
template <>
struct QtEglConverter<uint32_t, void *>
{
static inline void *convert(uint32_t v)
{ return reinterpret_cast<void *>(uintptr_t(v)); }
};
template <>
struct QtEglConverter<void *, uint32_t>
{
static inline uint32_t convert(void *v)
{ return uintptr_t(v); }
};
} // QtInternal
template <class ToType, class FromType>
static inline ToType qt_egl_cast(FromType from)
{ return QtInternal::QtEglConverter<FromType, ToType>::convert(from); }
QT_END_NAMESPACE
#endif // QT_EGL_P_H

View File

@ -49,7 +49,7 @@
#include <QtPlatformSupport/private/qeglplatformcontext_p.h>
#include <QtPlatformSupport/private/qeglconvenience_p.h>
#include <EGL/egl.h>
#include <QtPlatformSupport/private/qt_egl_p.h>
QT_BEGIN_NAMESPACE

View File

@ -8,8 +8,8 @@ CONFIG += egl
LIBS += -lbcm_host
QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF
# Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
SOURCES += $$PWD/qeglfsbrcmmain.cpp \
$$PWD/qeglfsbrcmintegration.cpp

View File

@ -8,8 +8,8 @@ QT += core-private gui-private platformsupport-private eglfs_device_lib-private
INCLUDEPATH += $$PWD/../.. $$PWD/../eglfs_kms_support
# Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
CONFIG += link_pkgconfig
!contains(QT_CONFIG, no-pkg-config) {

View File

@ -4,7 +4,8 @@ QT += core-private gui-private platformsupport-private eglfs_device_lib-private
INCLUDEPATH += $$PWD/../.. $$PWD/../eglfs_kms_support
DEFINES += MESA_EGL_NO_X11_HEADERS
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
CONFIG += link_pkgconfig
!contains(QT_CONFIG, no-pkg-config) {

View File

@ -6,8 +6,8 @@ QT += core-private gui-private platformsupport-private eglfs_device_lib-private
INCLUDEPATH += $$PWD/../..
# Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
CONFIG += link_pkgconfig
!contains(QT_CONFIG, no-pkg-config) {

View File

@ -2,8 +2,8 @@ TARGET = qeglfs-mali-integration
QT += core-private gui-private platformsupport-private eglfs_device_lib-private
# Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
INCLUDEPATH += $$PWD/../..
CONFIG += egl

View File

@ -2,8 +2,8 @@ TARGET = qeglfs-x11-integration
QT += core-private gui-private platformsupport-private eglfs_device_lib-private
# Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
INCLUDEPATH += $$PWD/../..

View File

@ -281,12 +281,12 @@ EGLNativeWindowType QEglFSX11Integration::createNativeWindow(QPlatformWindow *pl
xcb_flush(m_connection);
return m_window;
return qt_egl_cast<EGLNativeWindowType>(m_window);
}
void QEglFSX11Integration::destroyNativeWindow(EGLNativeWindowType window)
{
xcb_destroy_window(m_connection, window);
xcb_destroy_window(m_connection, qt_egl_cast<xcb_window_t>(window));
}
bool QEglFSX11Integration::hasCapability(QPlatformIntegration::Capability cap) const

View File

@ -9,8 +9,8 @@ CONFIG += no_module_headers internal_module
QT += core-private gui-private platformsupport-private
LIBS += $$QMAKE_LIBS_DYNLOAD
# Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
DEFINES += QT_BUILD_EGL_DEVICE_LIB

View File

@ -48,7 +48,7 @@
#define Q_EGLFS_EXPORT Q_DECL_IMPORT
#endif
#include <EGL/egl.h>
#include <QtPlatformSupport/private/qt_egl_p.h>
#undef Status
#undef None
#undef Bool

View File

@ -6,8 +6,8 @@ QT += core-private gui-private platformsupport-private
#DEFINES += Q_OPENKODE
#Avoid X11 header collision
DEFINES += MESA_EGL_NO_X11_HEADERS
# Avoid X11 header collision, use generic EGL native types
DEFINES += QT_EGL_NO_X11
SOURCES = main.cpp \
qminimaleglintegration.cpp \

View File

@ -58,7 +58,7 @@
#include <QtGui/QOpenGLContext>
#include <QtGui/QScreen>
#include <EGL/egl.h>
#include <QtPlatformSupport/private/qt_egl_p.h>
QT_BEGIN_NAMESPACE

View File

@ -44,7 +44,7 @@
#include <QtCore/QTextStream>
#include <EGL/egl.h>
#include <QtPlatformSupport/private/qt_egl_p.h>
QT_BEGIN_NAMESPACE

View File

@ -46,7 +46,7 @@
#include <QtGui/private/qcssparser_p.h>
#include <QtGui/private/qtextengine_p.h>
#include <EGL/egl.h>
#include <QtPlatformSupport/private/qt_egl_p.h>
QT_BEGIN_NAMESPACE

View File

@ -65,7 +65,7 @@
#include <QtGui/private/qguiapplication_p.h>
#ifdef XCB_USE_EGL
#include <EGL/egl.h>
# include <QtPlatformSupport/private/qt_egl_p.h>
#endif
#ifdef XCB_USE_XLIB