Fix Desktop GL/EGL/GLESv2 linkage
This change fixes a few things in one go: * cmake's FindOpenGL cannot be used reliably to detect EGL. So use a custom module for that. * Added a custom module for GLESv2 detection, as cmake's FindOpenGL does not support that. * Map CONFIG += opengl to a WrapOpenGL target, which links against either GLESv2 or libGL - just like mkspecs/features/*/opengl.prf * cmake's FindOpenGL remains in use solely to detect the availability of desktop gl. Change-Id: I9315e5ad1fd88e1b7dc7e920053e98fb51fea7fc Reviewed-by: Volker Krause <volker.krause@kdab.com>
This commit is contained in:
parent
6424e70bbe
commit
519ef817ff
32
cmake/FindEGL.cmake
Normal file
32
cmake/FindEGL.cmake
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
include(CheckCXXSourceCompiles)
|
||||||
|
include(CMakePushCheckState)
|
||||||
|
|
||||||
|
find_library(EGL_LIBRARY NAMES EGL)
|
||||||
|
find_path(EGL_INCLUDE_DIR NAMES "EGL/egl.h" DOC "The EGL include path")
|
||||||
|
|
||||||
|
cmake_push_check_state(RESET)
|
||||||
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "${EGL_LIBRARY}")
|
||||||
|
list(APPEND CMAKE_REQUIRED_INCLUDES "${EGL_INCLUDE_DIR}")
|
||||||
|
|
||||||
|
check_cxx_source_compiles("
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
EGLint x = 0; EGLDisplay dpy = 0; EGLContext ctx = 0;
|
||||||
|
eglDestroyContext(dpy, ctx);
|
||||||
|
}" HAVE_EGL)
|
||||||
|
|
||||||
|
cmake_pop_check_state()
|
||||||
|
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(EGL DEFAULT_MSG EGL_INCLUDE_DIR EGL_LIBRARY HAVE_EGL)
|
||||||
|
|
||||||
|
mark_as_advanced(EGL_INCLUDE_DIR EGL_LIBRARY HAVE_EGL)
|
||||||
|
|
||||||
|
if(EGL_FOUND AND NOT TARGET EGL::EGL)
|
||||||
|
add_library(EGL::EGL UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(EGL::EGL PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${EGL_LIBRARY}"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${EGL_INCLUDE_DIR}")
|
||||||
|
endif()
|
40
cmake/FindGLESv2.cmake
Normal file
40
cmake/FindGLESv2.cmake
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
include(CheckCXXSourceCompiles)
|
||||||
|
|
||||||
|
find_library(GLESv2_LIBRARY NAMES GLESv2)
|
||||||
|
find_path(GLESv2_INCLUDE_DIR NAMES "GLES2/gl2.h" DOC "The OpenGLES 2 include path")
|
||||||
|
|
||||||
|
set(_libraries "${CMAKE_REQUIRED_LIBRARIES}")
|
||||||
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "${GLESv2_LIBRARY}")
|
||||||
|
set(_includes "${CMAKE_REQUIRED_INCLUDES}")
|
||||||
|
list(APPEND CMAKE_REQUIRED_INCLUDES "${GLESv2_INCLUDE_DIR}")
|
||||||
|
|
||||||
|
check_cxx_source_compiles("
|
||||||
|
#ifdef __APPLE__
|
||||||
|
# include <OpenGLES/ES2/gl.h>
|
||||||
|
#else
|
||||||
|
# define GL_GLEXT_PROTOTYPES
|
||||||
|
# include <GLES2/gl2.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
glUniform1f(1, GLfloat(1.0));
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
}" HAVE_GLESv2)
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_LIBRARY "${_libraries}")
|
||||||
|
unset(_libraries)
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES "${_includes}")
|
||||||
|
unset(_includes)
|
||||||
|
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(GLESv2 DEFAULT_MSG GLESv2_INCLUDE_DIR GLESv2_LIBRARY HAVE_GLESv2)
|
||||||
|
|
||||||
|
mark_as_advanced(GLESv2_INCLUDE_DIR GLESv2_LIBRARY HAVE_GLESv2)
|
||||||
|
|
||||||
|
if(GLESv2_FOUND AND NOT TARGET GLESv2::GLESv2)
|
||||||
|
add_library(GLESv2::GLESv2 UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(GLESv2::GLESv2 PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${GLESv2_LIBRARY}"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${GLESv2_INCLUDE_DIR}")
|
||||||
|
endif()
|
16
cmake/FindWrapOpenGL.cmake
Normal file
16
cmake/FindWrapOpenGL.cmake
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
# Logic derived from mkspecs/features/unix/opengl.prf: prefer GLESv2 over GL
|
||||||
|
|
||||||
|
if(TARGET WrapOpenGL)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(WrapOpenGL INTERFACE)
|
||||||
|
|
||||||
|
if(QT_FEATURE_opengles2)
|
||||||
|
find_package(GLESv2)
|
||||||
|
target_link_libraries(WrapOpenGL INTERFACE GLESv2::GLESv2)
|
||||||
|
else()
|
||||||
|
find_package(OpenGL)
|
||||||
|
target_link_libraries(WrapOpenGL INTERFACE OpenGL::GL)
|
||||||
|
endif()
|
@ -317,6 +317,12 @@ extend_target(Gui CONDITION TEST_architecture STREQUAL arm64 AND NOT APPLE_UIKIT
|
|||||||
DEFINES ENABLE_PIXMAN_DRAWHELPERS
|
DEFINES ENABLE_PIXMAN_DRAWHELPERS
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# With qmake, gui's opengl.pri used CONFIG += opengl, where opengl.prf
|
||||||
|
# acted like WrapOpenGL: direct linkage against either libGLESv2 or
|
||||||
|
# libGL, depending in the opengl _feature_. This is done by hand now
|
||||||
|
# here (where the feature is available).
|
||||||
|
find_package(WrapOpenGL)
|
||||||
|
|
||||||
extend_target(Gui CONDITION QT_FEATURE_opengl
|
extend_target(Gui CONDITION QT_FEATURE_opengl
|
||||||
SOURCES
|
SOURCES
|
||||||
opengl/qopengl.cpp opengl/qopengl.h opengl/qopengl_p.h
|
opengl/qopengl.cpp opengl/qopengl.h opengl/qopengl_p.h
|
||||||
@ -347,7 +353,7 @@ extend_target(Gui CONDITION QT_FEATURE_opengl
|
|||||||
opengl/qopenglversionfunctionsfactory.cpp opengl/qopenglversionfunctionsfactory_p.h
|
opengl/qopenglversionfunctionsfactory.cpp opengl/qopenglversionfunctionsfactory_p.h
|
||||||
opengl/qopenglvertexarrayobject.cpp opengl/qopenglvertexarrayobject.h
|
opengl/qopenglvertexarrayobject.cpp opengl/qopenglvertexarrayobject.h
|
||||||
LIBRARIES
|
LIBRARIES
|
||||||
OpenGL::GL
|
WrapOpenGL
|
||||||
)
|
)
|
||||||
|
|
||||||
extend_target(Gui CONDITION (QT_FEATURE_opengl) AND (NOT QT_FEATURE_opengles2)
|
extend_target(Gui CONDITION (QT_FEATURE_opengl) AND (NOT QT_FEATURE_opengles2)
|
||||||
|
@ -38,8 +38,8 @@ find_package(ATSPI2)
|
|||||||
set_package_properties(ATSPI2 PROPERTIES TYPE OPTIONAL)
|
set_package_properties(ATSPI2 PROPERTIES TYPE OPTIONAL)
|
||||||
find_package(Libdrm)
|
find_package(Libdrm)
|
||||||
set_package_properties(Libdrm PROPERTIES TYPE OPTIONAL)
|
set_package_properties(Libdrm PROPERTIES TYPE OPTIONAL)
|
||||||
find_package(OpenGL)
|
find_package(EGL)
|
||||||
set_package_properties(OpenGL PROPERTIES TYPE OPTIONAL)
|
set_package_properties(EGL PROPERTIES TYPE OPTIONAL)
|
||||||
find_package(Freetype)
|
find_package(Freetype)
|
||||||
set_package_properties(Freetype PROPERTIES TYPE OPTIONAL)
|
set_package_properties(Freetype PROPERTIES TYPE OPTIONAL)
|
||||||
find_package(Fontconfig)
|
find_package(Fontconfig)
|
||||||
@ -56,6 +56,10 @@ find_package(PNG)
|
|||||||
set_package_properties(PNG PROPERTIES TYPE OPTIONAL)
|
set_package_properties(PNG PROPERTIES TYPE OPTIONAL)
|
||||||
find_package(Mtdev)
|
find_package(Mtdev)
|
||||||
set_package_properties(Mtdev PROPERTIES TYPE OPTIONAL)
|
set_package_properties(Mtdev PROPERTIES TYPE OPTIONAL)
|
||||||
|
find_package(OpenGL)
|
||||||
|
set_package_properties(OpenGL PROPERTIES TYPE OPTIONAL)
|
||||||
|
find_package(GLESv2)
|
||||||
|
set_package_properties(GLESv2 PROPERTIES TYPE OPTIONAL)
|
||||||
find_package(Tslib)
|
find_package(Tslib)
|
||||||
set_package_properties(Tslib PROPERTIES TYPE OPTIONAL)
|
set_package_properties(Tslib PROPERTIES TYPE OPTIONAL)
|
||||||
find_package(Vulkan)
|
find_package(Vulkan)
|
||||||
@ -537,7 +541,7 @@ qt_feature("mtdev" PRIVATE
|
|||||||
)
|
)
|
||||||
qt_feature("opengles2" PUBLIC
|
qt_feature("opengles2" PUBLIC
|
||||||
LABEL "OpenGL ES 2.0"
|
LABEL "OpenGL ES 2.0"
|
||||||
CONDITION WIN32 OR ( NOT APPLE_WATCHOS AND NOT QT_FEATURE_opengl_desktop AND libs.opengl_es2 ) OR FIXME
|
CONDITION WIN32 OR ( NOT APPLE_WATCHOS AND NOT QT_FEATURE_opengl_desktop AND GLESv2_FOUND )
|
||||||
ENABLE INPUT_opengl STREQUAL 'es2'
|
ENABLE INPUT_opengl STREQUAL 'es2'
|
||||||
DISABLE INPUT_opengl STREQUAL 'desktop' OR INPUT_opengl STREQUAL 'dynamic' OR INPUT_opengl STREQUAL 'no'
|
DISABLE INPUT_opengl STREQUAL 'desktop' OR INPUT_opengl STREQUAL 'dynamic' OR INPUT_opengl STREQUAL 'no'
|
||||||
)
|
)
|
||||||
@ -586,7 +590,7 @@ qt_feature("openvg" PUBLIC
|
|||||||
)
|
)
|
||||||
qt_feature("egl" PUBLIC PRIVATE
|
qt_feature("egl" PUBLIC PRIVATE
|
||||||
LABEL "EGL"
|
LABEL "EGL"
|
||||||
CONDITION ( QT_FEATURE_opengl OR QT_FEATURE_openvg ) AND ( QT_FEATURE_angle OR OpenGL_EGL_FOUND )
|
CONDITION ( QT_FEATURE_opengl OR QT_FEATURE_openvg ) AND ( QT_FEATURE_angle OR EGL_FOUND )
|
||||||
)
|
)
|
||||||
qt_feature_definition("egl" "QT_NO_EGL" NEGATE VALUE "1")
|
qt_feature_definition("egl" "QT_NO_EGL" NEGATE VALUE "1")
|
||||||
qt_feature("egl_x11" PRIVATE
|
qt_feature("egl_x11" PRIVATE
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Generated from eglconvenience.pro.
|
# Generated from eglconvenience.pro.
|
||||||
|
|
||||||
find_package(OpenGL)
|
find_package(EGL)
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
## EglSupport Module:
|
## EglSupport Module:
|
||||||
@ -18,8 +18,12 @@ add_qt_module(EglSupport
|
|||||||
LIBRARIES
|
LIBRARIES
|
||||||
Qt::CorePrivate
|
Qt::CorePrivate
|
||||||
Qt::GuiPrivate
|
Qt::GuiPrivate
|
||||||
OpenGL::EGL
|
EGL::EGL
|
||||||
${CMAKE_DL_LIBS}
|
${CMAKE_DL_LIBS}
|
||||||
|
# CONFIG = "static" "internal_module" "egl"
|
||||||
|
# MODULE = "egl_support"
|
||||||
|
# PRECOMPILED_HEADER = "../../corelib/global/qt_pch.h"
|
||||||
|
# _LOADED = "qt_module"
|
||||||
)
|
)
|
||||||
|
|
||||||
## Scopes:
|
## Scopes:
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
# Generated from minimalegl.pro.
|
# Generated from minimalegl.pro.
|
||||||
|
|
||||||
|
find_package(FindWrapOpenGL)
|
||||||
|
|
||||||
#####################################################################
|
#####################################################################
|
||||||
## qminimalegl Plugin:
|
## qminimalegl Plugin:
|
||||||
#####################################################################
|
#####################################################################
|
||||||
@ -19,6 +21,7 @@ add_qt_plugin(qminimalegl
|
|||||||
Qt::EventDispatcherSupportPrivate
|
Qt::EventDispatcherSupportPrivate
|
||||||
Qt::FontDatabaseSupportPrivate
|
Qt::FontDatabaseSupportPrivate
|
||||||
Qt::EglSupportPrivate
|
Qt::EglSupportPrivate
|
||||||
|
WrapOpenGL
|
||||||
# CONFIG = "egl"
|
# CONFIG = "egl"
|
||||||
# OTHER_FILES = "minimalegl.json"
|
# OTHER_FILES = "minimalegl.json"
|
||||||
# PLUGIN_CLASS_NAME = "QMinimalEglIntegrationPlugin"
|
# PLUGIN_CLASS_NAME = "QMinimalEglIntegrationPlugin"
|
||||||
|
@ -52,7 +52,7 @@ def map_library(lib: str) -> Union[str, LibraryMapping, List[str]]:
|
|||||||
'cups': 'Cups',
|
'cups': 'Cups',
|
||||||
'double-conversion': 'WrapDoubleConversion',
|
'double-conversion': 'WrapDoubleConversion',
|
||||||
'drm': 'Libdrm',
|
'drm': 'Libdrm',
|
||||||
'egl': LibraryMapping(package="OpenGL", resultVariable="OpenGL_EGL"),
|
'egl': 'EGL',
|
||||||
'fontconfig': LibraryMapping(package='Fontconfig', resultVariable="FONTCONFIG"),
|
'fontconfig': LibraryMapping(package='Fontconfig', resultVariable="FONTCONFIG"),
|
||||||
'freetype': 'Freetype',
|
'freetype': 'Freetype',
|
||||||
'gbm': 'gbm',
|
'gbm': 'gbm',
|
||||||
@ -101,6 +101,7 @@ def map_library(lib: str) -> Union[str, LibraryMapping, List[str]]:
|
|||||||
'xrender': LibraryMapping(package="XCB", resultVariable="XCB_RENDER"),
|
'xrender': LibraryMapping(package="XCB", resultVariable="XCB_RENDER"),
|
||||||
'zlib': 'ZLIB',
|
'zlib': 'ZLIB',
|
||||||
'zstd': 'ZSTD',
|
'zstd': 'ZSTD',
|
||||||
|
'opengl_es2': 'GLESv2',
|
||||||
} # type: Dict[str, Union[str, List[str], LibraryMapping]]
|
} # type: Dict[str, Union[str, List[str], LibraryMapping]]
|
||||||
if lib not in libmap:
|
if lib not in libmap:
|
||||||
raise Exception(' XXXX Unknown library "{}".'.format(lib))
|
raise Exception(' XXXX Unknown library "{}".'.format(lib))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user