diff --git a/cmake/FindEGL.cmake b/cmake/FindEGL.cmake new file mode 100644 index 00000000000..88997568b0c --- /dev/null +++ b/cmake/FindEGL.cmake @@ -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 + +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() diff --git a/cmake/FindGLESv2.cmake b/cmake/FindGLESv2.cmake new file mode 100644 index 00000000000..a4af6cbbbc0 --- /dev/null +++ b/cmake/FindGLESv2.cmake @@ -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 +#else +# define GL_GLEXT_PROTOTYPES +# include +#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() diff --git a/cmake/FindWrapOpenGL.cmake b/cmake/FindWrapOpenGL.cmake new file mode 100644 index 00000000000..4eefdfa8116 --- /dev/null +++ b/cmake/FindWrapOpenGL.cmake @@ -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() diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index b2520f5e066..4ea528e7aee 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -317,6 +317,12 @@ extend_target(Gui CONDITION TEST_architecture STREQUAL arm64 AND NOT APPLE_UIKIT 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 SOURCES 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/qopenglvertexarrayobject.cpp opengl/qopenglvertexarrayobject.h LIBRARIES - OpenGL::GL + WrapOpenGL ) extend_target(Gui CONDITION (QT_FEATURE_opengl) AND (NOT QT_FEATURE_opengles2) diff --git a/src/gui/configure.cmake b/src/gui/configure.cmake index e5888cc1d78..5e29a60463b 100644 --- a/src/gui/configure.cmake +++ b/src/gui/configure.cmake @@ -38,8 +38,8 @@ find_package(ATSPI2) set_package_properties(ATSPI2 PROPERTIES TYPE OPTIONAL) find_package(Libdrm) set_package_properties(Libdrm PROPERTIES TYPE OPTIONAL) -find_package(OpenGL) -set_package_properties(OpenGL PROPERTIES TYPE OPTIONAL) +find_package(EGL) +set_package_properties(EGL PROPERTIES TYPE OPTIONAL) find_package(Freetype) set_package_properties(Freetype PROPERTIES TYPE OPTIONAL) find_package(Fontconfig) @@ -56,6 +56,10 @@ find_package(PNG) set_package_properties(PNG PROPERTIES TYPE OPTIONAL) find_package(Mtdev) 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) set_package_properties(Tslib PROPERTIES TYPE OPTIONAL) find_package(Vulkan) @@ -537,7 +541,7 @@ qt_feature("mtdev" PRIVATE ) qt_feature("opengles2" PUBLIC 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' 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 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("egl_x11" PRIVATE diff --git a/src/platformsupport/eglconvenience/CMakeLists.txt b/src/platformsupport/eglconvenience/CMakeLists.txt index 2b20a9cb351..af5d277f7a9 100644 --- a/src/platformsupport/eglconvenience/CMakeLists.txt +++ b/src/platformsupport/eglconvenience/CMakeLists.txt @@ -1,6 +1,6 @@ # Generated from eglconvenience.pro. -find_package(OpenGL) +find_package(EGL) ##################################################################### ## EglSupport Module: @@ -18,8 +18,12 @@ add_qt_module(EglSupport LIBRARIES Qt::CorePrivate Qt::GuiPrivate - OpenGL::EGL + EGL::EGL ${CMAKE_DL_LIBS} + # CONFIG = "static" "internal_module" "egl" + # MODULE = "egl_support" + # PRECOMPILED_HEADER = "../../corelib/global/qt_pch.h" + # _LOADED = "qt_module" ) ## Scopes: diff --git a/src/plugins/platforms/minimalegl/CMakeLists.txt b/src/plugins/platforms/minimalegl/CMakeLists.txt index a038d07df95..f6d46c55a4e 100644 --- a/src/plugins/platforms/minimalegl/CMakeLists.txt +++ b/src/plugins/platforms/minimalegl/CMakeLists.txt @@ -1,5 +1,7 @@ # Generated from minimalegl.pro. +find_package(FindWrapOpenGL) + ##################################################################### ## qminimalegl Plugin: ##################################################################### @@ -19,6 +21,7 @@ add_qt_plugin(qminimalegl Qt::EventDispatcherSupportPrivate Qt::FontDatabaseSupportPrivate Qt::EglSupportPrivate + WrapOpenGL # CONFIG = "egl" # OTHER_FILES = "minimalegl.json" # PLUGIN_CLASS_NAME = "QMinimalEglIntegrationPlugin" diff --git a/util/cmake/configurejson2cmake.py b/util/cmake/configurejson2cmake.py index df77ea07046..840ffefd059 100755 --- a/util/cmake/configurejson2cmake.py +++ b/util/cmake/configurejson2cmake.py @@ -52,7 +52,7 @@ def map_library(lib: str) -> Union[str, LibraryMapping, List[str]]: 'cups': 'Cups', 'double-conversion': 'WrapDoubleConversion', 'drm': 'Libdrm', - 'egl': LibraryMapping(package="OpenGL", resultVariable="OpenGL_EGL"), + 'egl': 'EGL', 'fontconfig': LibraryMapping(package='Fontconfig', resultVariable="FONTCONFIG"), 'freetype': 'Freetype', 'gbm': 'gbm', @@ -101,6 +101,7 @@ def map_library(lib: str) -> Union[str, LibraryMapping, List[str]]: 'xrender': LibraryMapping(package="XCB", resultVariable="XCB_RENDER"), 'zlib': 'ZLIB', 'zstd': 'ZSTD', + 'opengl_es2': 'GLESv2', } # type: Dict[str, Union[str, List[str], LibraryMapping]] if lib not in libmap: raise Exception(' XXXX Unknown library "{}".'.format(lib))