SDL: CMake: Generic check for desktop GL and EGL on Linux systems

From 6a2af48ad73f8fc4e129ae7fc60589c82923224d Mon Sep 17 00:00:00 2001
From: Nicolas Caramelli <[EMAIL REDACTED]>
Date: Thu, 6 May 2021 15:43:16 +0200
Subject: [PATCH] CMake: Generic check for desktop GL and EGL on Linux systems

---
 CMakeLists.txt        | 12 +++---
 cmake/sdlchecks.cmake | 98 ++++++++++++++++++-------------------------
 2 files changed, 46 insertions(+), 64 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ec6b7a7464..92ed7995d0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1202,14 +1202,14 @@ elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS)
     CheckRPI()
     CheckX11()
     CheckDirectFB()
-    CheckOpenGLX11()
-    CheckOpenGLESX11()
+    # Need to check for EGL first because KMSDRM and Wayland depends on it.
+    CheckEGL()
+    CheckKMSDRM()
+    CheckGLX()
+    CheckOpenGL()
+    CheckOpenGLES()
     CheckWayland()
     CheckVivante()
-    # Need to check EGL before checking KMSDRM because KMSDRM depends on it.
-    CheckEGLKMSDRM()
-    CheckKMSDRM()
-    CheckOpenGLKMSDRM()
   endif()
 
   if(UNIX)
diff --git a/cmake/sdlchecks.cmake b/cmake/sdlchecks.cmake
index f21a9005d2..d3f6cec1f7 100644
--- a/cmake/sdlchecks.cmake
+++ b/cmake/sdlchecks.cmake
@@ -593,6 +593,10 @@ macro(CheckX11)
       set(CMAKE_REQUIRED_LIBRARIES)
     endif()
   endif()
+  if(NOT HAVE_VIDEO_X11)
+    # Prevent Mesa from including X11 headers
+    list(APPEND EXTRA_CFLAGS "-DMESA_EGL_NO_X11_HEADERS -DEGL_NO_X11")
+  endif()
 endmacro()
 
 macro(WaylandProtocolGen _SCANNER _CODE_MODE _XML _PROTL)
@@ -627,7 +631,7 @@ macro(CheckWayland)
     pkg_check_modules(WAYLAND wayland-client wayland-scanner wayland-egl wayland-cursor egl xkbcommon)
     pkg_check_modules(WAYLAND_SCANNER_1_15 "wayland-scanner>=1.15")
 
-    if(WAYLAND_FOUND)
+    if(WAYLAND_FOUND AND HAVE_VIDEO_OPENGL_EGL)
       execute_process(
         COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=wayland_scanner wayland-scanner
         WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
@@ -777,36 +781,15 @@ macro(CheckVivante)
   endif(VIDEO_VIVANTE)
 endmacro(CheckVivante)
 
-# Requires:
-# - libglvnd
-macro(CheckOpenGLKMSDRM)
-  if(VIDEO_OPENGL AND HAVE_VIDEO_KMSDRM)
-    check_c_source_compiles("
-        #include <GL/gl.h>
-        int main(int argc, char** argv) {}" HAVE_VIDEO_OPENGL)
-
-    if(HAVE_VIDEO_OPENGL)
-      set(HAVE_VIDEO_OPENGL TRUE)
-      set(SDL_VIDEO_OPENGL 1)
-      set(SDL_VIDEO_RENDER_OGL 1)
-    endif()
-  endif()
-endmacro()
-
 # Requires:
 # - nada
-macro(CheckOpenGLX11)
+macro(CheckGLX)
   if(VIDEO_OPENGL)
     check_c_source_compiles("
-        #include <GL/gl.h>
         #include <GL/glx.h>
-        int main(int argc, char** argv) {}" HAVE_VIDEO_OPENGL)
-
-    if(HAVE_VIDEO_OPENGL)
-      set(HAVE_VIDEO_OPENGL TRUE)
-      set(SDL_VIDEO_OPENGL 1)
+        int main(int argc, char** argv) {}" HAVE_VIDEO_OPENGL_GLX)
+    if(HAVE_VIDEO_OPENGL_GLX)
       set(SDL_VIDEO_OPENGL_GLX 1)
-      set(SDL_VIDEO_RENDER_OGL 1)
     endif()
   endif()
 endmacro()
@@ -814,61 +797,60 @@ endmacro()
 # Requires:
 # - PkgCheckModules
 macro(CheckEGL)
-  pkg_check_modules(EGL egl)
-  string(REPLACE "-D_THREAD_SAFE;" "-D_THREAD_SAFE=1;" EGL_CFLAGS "${EGL_CFLAGS}")
-endmacro()
-
-# Requires:
-# - PkgCheckModules
-macro(CheckEGLKMSDRM)
-  if (HAVE_VIDEO_OPENGLES OR HAVE_VIDEO_OPENGL)
-    CheckEGL()
+  if (VIDEO_OPENGL OR VIDEO_OPENGLES)
+    pkg_check_modules(EGL egl)
+    string(REPLACE "-D_THREAD_SAFE;" "-D_THREAD_SAFE=1;" EGL_CFLAGS "${EGL_CFLAGS}")
     set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${EGL_CFLAGS}")
     check_c_source_compiles("
-	#define EGL_API_FB
-	#define MESA_EGL_NO_X11_HEADERS
-	#define EGL_NO_X11
-	#include <EGL/egl.h>
-	#include <EGL/eglext.h>
-	int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGL_EGL)
+        #define EGL_API_FB
+        #define MESA_EGL_NO_X11_HEADERS
+        #define EGL_NO_X11
+        #include <EGL/egl.h>
+        #include <EGL/eglext.h>
+        int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGL_EGL)
     if(HAVE_VIDEO_OPENGL_EGL)
-	set(SDL_VIDEO_OPENGL_EGL 1)
+      set(SDL_VIDEO_OPENGL_EGL 1)
     endif()
   endif()
 endmacro()
 
 # Requires:
-# - PkgCheckModules
-macro(CheckOpenGLESX11)
-  CheckEGL()
-  set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${EGL_CFLAGS}")
-  if(VIDEO_OPENGLES)
+# - nada
+macro(CheckOpenGL)
+  if(VIDEO_OPENGL)
     check_c_source_compiles("
-        #define EGL_API_FB
-        #include <EGL/egl.h>
-        int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGL_EGL)
-    if(HAVE_VIDEO_OPENGL_EGL)
-        set(SDL_VIDEO_OPENGL_EGL 1)
+        #include <GL/gl.h>
+        #include <GL/glext.h>
+        int main(int argc, char** argv) {}" HAVE_VIDEO_OPENGL)
+    if(HAVE_VIDEO_OPENGL)
+      set(SDL_VIDEO_OPENGL 1)
+      set(SDL_VIDEO_RENDER_OGL 1)
     endif()
+  endif()
+endmacro()
+
+# Requires:
+# - nada
+macro(CheckOpenGLES)
+  if(VIDEO_OPENGLES)
     check_c_source_compiles("
-      #include <GLES/gl.h>
-      #include <GLES/glext.h>
-      int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGLES_V1)
+        #include <GLES/gl.h>
+        #include <GLES/glext.h>
+        int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGLES_V1)
     if(HAVE_VIDEO_OPENGLES_V1)
         set(HAVE_VIDEO_OPENGLES TRUE)
         set(SDL_VIDEO_OPENGL_ES 1)
         set(SDL_VIDEO_RENDER_OGL_ES 1)
     endif()
     check_c_source_compiles("
-      #include <GLES2/gl2.h>
-      #include <GLES2/gl2ext.h>
-      int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGLES_V2)
+        #include <GLES2/gl2.h>
+        #include <GLES2/gl2ext.h>
+        int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGLES_V2)
     if(HAVE_VIDEO_OPENGLES_V2)
         set(HAVE_VIDEO_OPENGLES TRUE)
         set(SDL_VIDEO_OPENGL_ES2 1)
         set(SDL_VIDEO_RENDER_OGL_ES2 1)
     endif()
-
   endif()
 endmacro()