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:
Simon Hausmann 2019-02-11 16:58:26 +01:00
parent 6424e70bbe
commit 519ef817ff
8 changed files with 114 additions and 8 deletions

32
cmake/FindEGL.cmake Normal file
View 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
View 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()

View 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()

View File

@ -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)

View File

@ -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

View File

@ -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:

View File

@ -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"

View File

@ -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))