From 11a75eab998013563bfeae7a2373d89c4fe5e8b0 Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Mon, 22 Oct 2018 01:58:24 -0600 Subject: [PATCH] CMake: Build OpenGL ES (1&2) display modules Also reorganizes Package.cmake a little, getting more of the package discovery logic under the PackageConfig.cmake system. --- cmake/modules/FindEGL.cmake | 27 +++++++++ cmake/modules/FindOpenGLES1.cmake | 27 +++++++++ cmake/modules/FindOpenGLES2.cmake | 27 +++++++++ dtool/Config.cmake | 14 ----- dtool/LocalSetup.cmake | 24 -------- dtool/Package.cmake | 76 ++++++++++++++++++++---- panda/CMakeLists.txt | 5 ++ panda/metalibs/pandagles/CMakeLists.txt | 9 +++ panda/metalibs/pandagles2/CMakeLists.txt | 9 +++ panda/src/egldisplay/CMakeLists.txt | 54 +++++++++++++++++ panda/src/gles2gsg/CMakeLists.txt | 22 +++++++ panda/src/glesgsg/CMakeLists.txt | 22 +++++++ 12 files changed, 268 insertions(+), 48 deletions(-) create mode 100644 cmake/modules/FindEGL.cmake create mode 100644 cmake/modules/FindOpenGLES1.cmake create mode 100644 cmake/modules/FindOpenGLES2.cmake create mode 100644 panda/metalibs/pandagles/CMakeLists.txt create mode 100644 panda/metalibs/pandagles2/CMakeLists.txt create mode 100644 panda/src/egldisplay/CMakeLists.txt create mode 100644 panda/src/gles2gsg/CMakeLists.txt create mode 100644 panda/src/glesgsg/CMakeLists.txt diff --git a/cmake/modules/FindEGL.cmake b/cmake/modules/FindEGL.cmake new file mode 100644 index 0000000000..eced64105b --- /dev/null +++ b/cmake/modules/FindEGL.cmake @@ -0,0 +1,27 @@ +# Filename: FindEGL.cmake +# Authors: CFSworks (21 Oct, 2018) +# +# Usage: +# find_package(EGL [REQUIRED] [QUIET]) +# +# Once done this will define: +# EGL_FOUND - system has EGL +# EGL_INCLUDE_DIR - the include directory containing EGL/egl.h +# EGL_LIBRARY - the library to link against for EGL +# + +if(NOT EGL_INCLUDE_DIR) + find_path(EGL_INCLUDE_DIR "EGL/egl.h") + + mark_as_advanced(EGL_INCLUDE_DIR) +endif() + +if(NOT EGL_LIBRARY) + find_library(EGL_LIBRARY + NAMES "EGL") + + mark_as_advanced(EGL_LIBRARY) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(EGL DEFAULT_MSG EGL_INCLUDE_DIR EGL_LIBRARY) diff --git a/cmake/modules/FindOpenGLES1.cmake b/cmake/modules/FindOpenGLES1.cmake new file mode 100644 index 0000000000..2314cef70f --- /dev/null +++ b/cmake/modules/FindOpenGLES1.cmake @@ -0,0 +1,27 @@ +# Filename: FindOpenGLES1.cmake +# Authors: CFSworks (21 Oct, 2018) +# +# Usage: +# find_package(OpenGLES1 [REQUIRED] [QUIET]) +# +# Once done this will define: +# OPENGLES1_FOUND - system has OpenGL ES 1.x +# OPENGLES1_INCLUDE_DIR - the include directory containing GLES/gl.h +# OPENGLES1_LIBRARY - the library to link against for OpenGL ES 1.x +# + +if(NOT OPENGLES1_INCLUDE_DIR) + find_path(OPENGLES1_INCLUDE_DIR "GLES/gl.h") + + mark_as_advanced(OPENGLES1_INCLUDE_DIR) +endif() + +if(NOT OPENGLES1_LIBRARY) + find_library(OPENGLES1_LIBRARY + NAMES "GLESv1" "GLESv1_CM" "GLES_CM") + + mark_as_advanced(OPENGLES1_LIBRARY) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenGLES1 DEFAULT_MSG OPENGLES1_INCLUDE_DIR OPENGLES1_LIBRARY) diff --git a/cmake/modules/FindOpenGLES2.cmake b/cmake/modules/FindOpenGLES2.cmake new file mode 100644 index 0000000000..42a8cfedce --- /dev/null +++ b/cmake/modules/FindOpenGLES2.cmake @@ -0,0 +1,27 @@ +# Filename: FindOpenGLES2.cmake +# Authors: CFSworks (21 Oct, 2018) +# +# Usage: +# find_package(OpenGLES2 [REQUIRED] [QUIET]) +# +# Once done this will define: +# OPENGLES2_FOUND - system has OpenGL ES 2.x +# OPENGLES2_INCLUDE_DIR - the include directory containing GLES2/gl2.h +# OPENGLES2_LIBRARY - the library to link against for OpenGL ES 2.x +# + +if(NOT OPENGLES2_INCLUDE_DIR) + find_path(OPENGLES2_INCLUDE_DIR "GLES2/gl2.h") + + mark_as_advanced(OPENGLES2_INCLUDE_DIR) +endif() + +if(NOT OPENGLES2_LIBRARY) + find_library(OPENGLES2_LIBRARY + NAMES "GLESv2") + + mark_as_advanced(OPENGLES2_LIBRARY) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenGLES2 DEFAULT_MSG OPENGLES2_INCLUDE_DIR OPENGLES2_LIBRARY) diff --git a/dtool/Config.cmake b/dtool/Config.cmake index 3bcf8ace8e..1d39651c91 100644 --- a/dtool/Config.cmake +++ b/dtool/Config.cmake @@ -482,20 +482,6 @@ mark_as_advanced(SDL_LIBRARY) mark_as_advanced(SDL_LIBRARY_TEMP) -# Is X11 insalled, and where? -find_package(X11 QUIET) - -if(NOT X11_Xkb_FOUND OR NOT X11_Xutil_FOUND) - # Panda implicitly requires these supplementary X11 libs; if we can't find - # them, we just say we didn't find X11 at all. - set(X11_FOUND OFF) -endif() - -package_option(X11 - "Provides X-server support on Unix platforms. X11 may need to be linked -against for tinydisplay, but probably only on a Linux platform.") - - # TODO: XF86DGA # This defines if we have XF86DGA installed. #find_package(XF86DGA QUIET) diff --git a/dtool/LocalSetup.cmake b/dtool/LocalSetup.cmake index 8a4006de86..36727adba9 100644 --- a/dtool/LocalSetup.cmake +++ b/dtool/LocalSetup.cmake @@ -155,24 +155,6 @@ endif() # Now go through all the packages and report whether we have them. show_packages() -if(HAVE_GTK2) - message("+ gtk+-2") -else() - message("- Did not find gtk+-2") -endif() - -if(HAVE_GLES) - message("+ OpenGL ES 1") -else() - message("- Did not find OpenGL ES 1") -endif() - -if(HAVE_GLES2) - message("+ OpenGL ES 2") -else() - message("- Did not find OpenGL ES 2") -endif() - if(HAVE_DX9) message("+ DirectX9") else() @@ -185,12 +167,6 @@ else() message("- Not building Tinydisplay") endif() -if(HAVE_X11) - message("+ X11") -else() - message("- Did not find X11") -endif() - if(HAVE_OPENCV) message("+ OpenCV") else() diff --git a/dtool/Package.cmake b/dtool/Package.cmake index 79dbeae29f..eae931ce75 100644 --- a/dtool/Package.cmake +++ b/dtool/Package.cmake @@ -300,9 +300,11 @@ endif() # -# ------------ FreeType ------------ +# ------------ UI libraries ------------ # +# Freetype + find_package(Freetype QUIET) package_option(FREETYPE @@ -312,12 +314,14 @@ package_option(FREETYPE config_package(FREETYPE "FreeType") +# GTK2 + # Find and configure GTK set(Freetype_FIND_QUIETLY TRUE) # Fix for builtin FindGTK2 set(GTK2_GTK_FIND_QUIETLY TRUE) # Fix for builtin FindGTK2 find_package(GTK2 QUIET COMPONENTS gtk) -#config_package(GTK2 "gtk+-2") package_option(GTK2) +config_package(GTK2 "gtk+-2") # # ------------ Physics engines ------------ @@ -377,18 +381,70 @@ package_option(GL config_package(GL "OpenGL") +# OpenGL ES 1 +find_package(OpenGLES1 QUIET) + +package_option(GLES1 + "Enable support for OpenGL ES 1.x rendering APIs." + FOUND_AS OPENGLES1) + +config_package(GLES1 "OpenGL ES 1.x") + +# OpenGL ES 2 +find_package(OpenGLES2 QUIET) + +package_option(GLES2 + "Enable support for OpenGL ES 2.x rendering APIs." + FOUND_AS OPENGLES2) + +config_package(GLES2 "OpenGL ES 2.x") + +# +# ------------ Display APIs ------------ +# + +# X11 +find_package(X11 QUIET) + +if(NOT X11_Xkb_FOUND OR NOT X11_Xutil_FOUND) + # Panda implicitly requires these supplementary X11 libs; if we can't find + # them, we just say we didn't find X11 at all. + set(X11_FOUND OFF) +endif() + +package_option(X11 + "Provides X-server support on Unix platforms. X11 may need to be linked +against for tinydisplay, but probably only on a Linux platform.") + +set(HAVE_GLX_AVAILABLE OFF) +if(HAVE_GL AND HAVE_X11 AND NOT APPLE) + set(HAVE_GLX_AVAILABLE ON) +endif() + +option(HAVE_GLX "Enables GLX. Requires OpenGL and X11." ${HAVE_GLX_AVAILABLE}) +if(HAVE_GLX AND NOT HAVE_GLX_AVAILABLE) + message(SEND_ERROR "HAVE_GLX manually set to ON but it is not available!") +endif() + +if(HAVE_GLX) + config_package(X11 "X11 (with GLX)") +else() + config_package(X11 "X11 (without GLX)") +endif() + +# EGL +find_package(EGL QUIET) + +package_option(EGL + "Enable support for the Khronos EGL context management interface for + OpenGL ES. This is necessary to support OpenGL ES under X11.") + +config_package(EGL "EGL") + ######## # TODO # ######## -# Find and configure OpenGL ES 1 -#find_package(GLES) -#config_package(GLES COMMENT "OpenGL ES 1") - -# Find and configure OpenGL ES 2 -#find_package(GLES) -#config_package(GLES COMMENT "OpenGL ES 2") - # Find and configure DirectX 9 #find_package(DX9) #config_package(DX9 COMMENT "DirectX9") diff --git a/panda/CMakeLists.txt b/panda/CMakeLists.txt index 2b976e5220..3f0eb57e7d 100644 --- a/panda/CMakeLists.txt +++ b/panda/CMakeLists.txt @@ -19,10 +19,13 @@ add_subdirectory(src/downloadertools) add_subdirectory(src/dxml) add_subdirectory(src/egg) add_subdirectory(src/egg2pg) +add_subdirectory(src/egldisplay) add_subdirectory(src/event) add_subdirectory(src/express) add_subdirectory(src/ffmpeg) add_subdirectory(src/framework) +add_subdirectory(src/glesgsg) +add_subdirectory(src/gles2gsg) add_subdirectory(src/glgsg) add_subdirectory(src/glstuff) add_subdirectory(src/glxdisplay) @@ -68,6 +71,8 @@ add_subdirectory(metalibs/panda) add_subdirectory(metalibs/pandaegg) add_subdirectory(metalibs/pandaexpress) add_subdirectory(metalibs/pandagl) +add_subdirectory(metalibs/pandagles) +add_subdirectory(metalibs/pandagles2) add_subdirectory(metalibs/pandaphysics) # Now add the Python modules: diff --git a/panda/metalibs/pandagles/CMakeLists.txt b/panda/metalibs/pandagles/CMakeLists.txt new file mode 100644 index 0000000000..817cfc2026 --- /dev/null +++ b/panda/metalibs/pandagles/CMakeLists.txt @@ -0,0 +1,9 @@ +if(NOT HAVE_GLES1 OR NOT HAVE_EGL) + return() +endif() + +add_metalib(pandagles ${MODULE_TYPE} pandagles.cxx + COMPONENTS p3egldisplay_gles1 p3glesgsg) +set_target_properties(pandagles PROPERTIES DEFINE_SYMBOL BUILDING_PANDAGLES) + +install(TARGETS pandagles DESTINATION ${MODULE_DESTINATION}) diff --git a/panda/metalibs/pandagles2/CMakeLists.txt b/panda/metalibs/pandagles2/CMakeLists.txt new file mode 100644 index 0000000000..cb0e887254 --- /dev/null +++ b/panda/metalibs/pandagles2/CMakeLists.txt @@ -0,0 +1,9 @@ +if(NOT HAVE_GLES2 OR NOT HAVE_EGL) + return() +endif() + +add_metalib(pandagles2 ${MODULE_TYPE} pandagles2.cxx + COMPONENTS p3egldisplay_gles2 p3gles2gsg) +set_target_properties(pandagles2 PROPERTIES DEFINE_SYMBOL BUILDING_PANDAGLES2) + +install(TARGETS pandagles2 DESTINATION ${MODULE_DESTINATION}) diff --git a/panda/src/egldisplay/CMakeLists.txt b/panda/src/egldisplay/CMakeLists.txt new file mode 100644 index 0000000000..c5e51d18bf --- /dev/null +++ b/panda/src/egldisplay/CMakeLists.txt @@ -0,0 +1,54 @@ +if(NOT HAVE_EGL OR NOT HAVE_X11) + return() +endif() + +if(NOT HAVE_GLES1 AND NOT HAVE_GLES2) + return() +endif() + +set(P3EGLDISPLAY_HEADERS + config_egldisplay.h + eglGraphicsBuffer.h + eglGraphicsPipe.h eglGraphicsPipe.I + eglGraphicsPixmap.h + eglGraphicsStateGuardian.h eglGraphicsStateGuardian.I + eglGraphicsWindow.h eglGraphicsWindow.I +) + +set(P3EGLDISPLAY_SOURCES + config_egldisplay.cxx + eglGraphicsBuffer.cxx + eglGraphicsPipe.cxx + eglGraphicsPixmap.cxx + eglGraphicsStateGuardian.cxx + eglGraphicsWindow.cxx +) + +composite_sources(p3egldisplay P3EGLDISPLAY_SOURCES) + +# We actually build this twice! Once for GLES1, once for GLES2. +if(HAVE_GLES1) + add_component_library(p3egldisplay_gles1 SYMBOL BUILDING_PANDAGLES + ${P3EGLDISPLAY_HEADERS} ${P3EGLDISPLAY_SOURCES}) + target_compile_definitions(p3egldisplay_gles1 PUBLIC OPENGLES_1) + target_link_libraries(p3egldisplay_gles1 p3glesgsg p3x11display + PKG::EGL PKG::GLES1) + + if(NOT BUILD_METALIBS) + install(TARGETS p3egldisplay_gles1 DESTINATION lib) + endif() +endif() + +if(HAVE_GLES2) + add_component_library(p3egldisplay_gles2 SYMBOL BUILDING_PANDAGLES2 + ${P3EGLDISPLAY_HEADERS} ${P3EGLDISPLAY_SOURCES}) + target_compile_definitions(p3egldisplay_gles2 PUBLIC OPENGLES_2) + target_link_libraries(p3egldisplay_gles2 p3gles2gsg p3x11display + PKG::EGL PKG::GLES2) + + if(NOT BUILD_METALIBS) + install(TARGETS p3egldisplay_gles2 DESTINATION lib) + endif() +endif() + +install(FILES ${P3EGLDISPLAY_HEADERS} DESTINATION include/panda3d) diff --git a/panda/src/gles2gsg/CMakeLists.txt b/panda/src/gles2gsg/CMakeLists.txt new file mode 100644 index 0000000000..6bbd4ca9c8 --- /dev/null +++ b/panda/src/gles2gsg/CMakeLists.txt @@ -0,0 +1,22 @@ +if(NOT HAVE_GLES2) + return() +endif() + +set(P3GLES2GSG_HEADERS + config_gles2gsg.h + gles2gsg.h) + +set(P3GLES2GSG_SOURCES + config_gles2gsg.cxx + gles2gsg.cxx) + +composite_sources(p3gles2gsg P3GLES2GSG_SOURCES) +add_component_library(p3gles2gsg SYMBOL BUILDING_PANDAGLES2 + ${P3GLE2SGSG_HEADERS} ${P3GLES2GSG_SOURCES}) +target_link_libraries(p3gles2gsg p3glstuff panda + PKG::GLES2) + +if(NOT BUILD_METALIBS) + install(TARGETS p3gles2gsg DESTINATION lib RUNTIME DESTINATION bin) +endif() +install(FILES ${P3GLES2GSG_HEADERS} DESTINATION include/panda3d) diff --git a/panda/src/glesgsg/CMakeLists.txt b/panda/src/glesgsg/CMakeLists.txt new file mode 100644 index 0000000000..993303a3f7 --- /dev/null +++ b/panda/src/glesgsg/CMakeLists.txt @@ -0,0 +1,22 @@ +if(NOT HAVE_GLES1) + return() +endif() + +set(P3GLESGSG_HEADERS + config_glesgsg.h + glesgsg.h) + +set(P3GLESGSG_SOURCES + config_glesgsg.cxx + glesgsg.cxx) + +composite_sources(p3glesgsg P3GLESGSG_SOURCES) +add_component_library(p3glesgsg SYMBOL BUILDING_PANDAGLES + ${P3GLESGSG_HEADERS} ${P3GLESGSG_SOURCES}) +target_link_libraries(p3glesgsg p3glstuff panda + PKG::GLES1) + +if(NOT BUILD_METALIBS) + install(TARGETS p3glesgsg DESTINATION lib RUNTIME DESTINATION bin) +endif() +install(FILES ${P3GLESGSG_HEADERS} DESTINATION include/panda3d)