The open source OpenXR runtime
1# Copyright 2020-2021, Collabora, Ltd.
2#
3# SPDX-License-Identifier: BSL-1.0
4#
5# Distributed under the Boost Software License, Version 1.0.
6# (See accompanying file LICENSE_1_0.txt or copy at
7# http://www.boost.org/LICENSE_1_0.txt)
8#
9# Original Author:
10# 2020-2021, Rylie Pavlik <rylie.pavlik@collabora.com> <rylie@ryliepavlik.com>
11
12#[[.rst:
13FindOpenGLES
14---------------
15
16Find the OpenGL ES graphics API.
17
18Components
19^^^^^^^^^^
20
21The following components are supported:
22
23* ``V1`` - OpenGL ES 1 (including emulation on OpenGL ES 2)
24* ``V2`` - OpenGL ES 2
25* ``V3`` - OpenGL ES 3
26* ``V31` - OpenGL ES 3.1 - same as 3 but checking also for gl31.h
27* ``V32` - OpenGL ES 3.2 - same as 3 but checking also for gl32.h
28
29If none are specified, the default is ``V2``.
30
31Targets
32^^^^^^^
33
34If successful, some subset of the following imported targets are created.
35
36* ``OpenGLES::OpenGLESv1``
37* ``OpenGLES::OpenGLESv2``
38* ``OpenGLES::OpenGLESv3``
39* ``OpenGLES::OpenGLESv31``
40* ``OpenGLES::OpenGLESv32``
41
42Cache variables
43^^^^^^^^^^^^^^^
44
45The following cache variable may also be set to assist/control the operation of this module:
46
47``OpenGLES_ROOT_DIR``
48 The root to search for OpenGLES.
49#]]
50
51set(OpenGLES_ROOT_DIR
52 "${OpenGLES_ROOT_DIR}"
53 CACHE PATH "Root to search for OpenGLES")
54
55if(NOT OpenGLES_FIND_COMPONENTS)
56 set(OpenGLES_FIND_COMPONENTS V2)
57endif()
58
59if(NOT ANDROID)
60 find_package(PkgConfig QUIET)
61 if(PKG_CONFIG_FOUND)
62 set(_old_prefix_path "${CMAKE_PREFIX_PATH}")
63 # So pkg-config uses OpenGLES_ROOT_DIR too.
64 if(OpenGLES_ROOT_DIR)
65 list(APPEND CMAKE_PREFIX_PATH ${OpenGLES_ROOT_DIR})
66 endif()
67 pkg_check_modules(PC_glesv1_cm QUIET glesv1_cm)
68 pkg_check_modules(PC_glesv2 QUIET glesv2)
69 # Restore
70 set(CMAKE_PREFIX_PATH "${_old_prefix_path}")
71 endif()
72endif()
73
74find_path(
75 OpenGLES_V1_INCLUDE_DIR
76 NAMES GLES/gl.h
77 PATHS ${OpenGLES_ROOT_DIR}
78 HINTS ${PC_glesv2_INCLUDE_DIRS} ${PC_glesv1_cm_INCLUDE_DIRS}
79 PATH_SUFFIXES include)
80find_path(
81 OpenGLES_V2_INCLUDE_DIR
82 NAMES GLES2/gl2.h
83 PATHS ${OpenGLES_ROOT_DIR}
84 HINTS ${PC_glesv2_INCLUDE_DIRS} ${PC_glesv1_cm_INCLUDE_DIRS}
85 PATH_SUFFIXES include)
86find_path(
87 OpenGLES_V3_INCLUDE_DIR
88 NAMES GLES3/gl3.h
89 PATHS ${OpenGLES_ROOT_DIR}
90 HINTS ${OpenGLES_V1_INCLUDE_DIR} ${OpenGLES_V2_INCLUDE_DIR}
91 ${PC_glesv2_INCLUDE_DIRS} ${PC_glesv1_cm_INCLUDE_DIRS}
92 PATH_SUFFIXES include)
93find_path(
94 OpenGLES_V31_INCLUDE_DIR
95 NAMES GLES3/gl31.h
96 PATHS ${OpenGLES_ROOT_DIR}
97 HINTS ${OpenGLES_V1_INCLUDE_DIR} ${OpenGLES_V2_INCLUDE_DIR}
98 ${OpenGLES_V3_INCLUDE_DIR} ${PC_glesv2_INCLUDE_DIRS}
99 ${PC_glesv1_cm_INCLUDE_DIRS}
100 PATH_SUFFIXES include)
101find_path(
102 OpenGLES_V32_INCLUDE_DIR
103 NAMES GLES3/gl32.h
104 PATHS ${OpenGLES_ROOT_DIR}
105 HINTS ${OpenGLES_V1_INCLUDE_DIR} ${OpenGLES_V2_INCLUDE_DIR}
106 ${OpenGLES_V3_INCLUDE_DIR} ${OpenGLES_V31_INCLUDE_DIR}
107 ${PC_glesv2_INCLUDE_DIRS} ${PC_glesv1_cm_INCLUDE_DIRS}
108 PATH_SUFFIXES include)
109
110find_library(
111 OpenGLES_V1_LIBRARY
112 NAMES GLES GLESv1_CM
113 PATHS ${OpenGLES_ROOT_DIR}
114 HINTS ${PC_glesv1_cm_LIBRARY_DIRS}
115 PATH_SUFFIXES lib)
116find_library(
117 OpenGLES_V2_LIBRARY
118 NAMES GLESv2 OpenGLES # for Apple framework
119 PATHS ${OpenGLES_ROOT_DIR}
120 HINTS ${PC_glesv2_LIBRARY_DIRS}
121 PATH_SUFFIXES lib)
122find_library(
123 OpenGLES_V3_LIBRARY
124 NAMES GLESv3
125 PATHS ${OpenGLES_ROOT_DIR}
126 HINTS ${PC_glesv2_LIBRARY_DIRS}
127 PATH_SUFFIXES lib)
128
129if(OpenGLES_V2_LIBRARY AND NOT OpenGLES_V3_LIBRARY)
130 set(OpenGLES_V3_LIBRARY ${OpenGLES_V2_LIBRARY})
131endif()
132
133set(_gles_required_vars)
134foreach(_comp IN LISTS OpenGLES_FIND_COMPONENTS)
135 if(_comp STREQUAL "V1")
136 list(APPEND _gles_required_vars OpenGLES_V1_LIBRARY
137 OpenGLES_V1_INCLUDE_DIR)
138 if(OpenGLES_V1_INCLUDE_DIR AND OpenGLES_V1_LIBRARY)
139 set(OpenGLES_${_comp}_FOUND TRUE)
140 else()
141 set(OpenGLES_${_comp}_FOUND FALSE)
142 endif()
143 elseif(_comp STREQUAL "V2")
144 list(APPEND _gles_required_vars OpenGLES_V2_LIBRARY
145 OpenGLES_V2_INCLUDE_DIR)
146 if(OpenGLES_V2_INCLUDE_DIR AND OpenGLES_V2_LIBRARY)
147 set(OpenGLES_${_comp}_FOUND TRUE)
148 else()
149 set(OpenGLES_${_comp}_FOUND FALSE)
150 endif()
151 elseif(_comp STREQUAL "V3")
152 list(APPEND _gles_required_vars OpenGLES_V3_LIBRARY
153 OpenGLES_V3_INCLUDE_DIR)
154 if(OpenGLES_V3_INCLUDE_DIR AND OpenGLES_V3_LIBRARY)
155 set(OpenGLES_${_comp}_FOUND TRUE)
156 else()
157 set(OpenGLES_${_comp}_FOUND FALSE)
158 endif()
159 elseif(_comp STREQUAL "V31")
160 list(APPEND _gles_required_vars OpenGLES_V3_LIBRARY
161 OpenGLES_V31_INCLUDE_DIR)
162
163 if(OpenGLES_V31_INCLUDE_DIR AND OpenGLES_V3_LIBRARY)
164 set(OpenGLES_${_comp}_FOUND TRUE)
165 else()
166 set(OpenGLES_${_comp}_FOUND FALSE)
167 endif()
168 elseif(_comp STREQUAL "V32")
169 list(APPEND _gles_required_vars OpenGLES_V3_LIBRARY
170 OpenGLES_V32_INCLUDE_DIR)
171 if(OpenGLES_V32_INCLUDE_DIR AND OpenGLES_V3_LIBRARY)
172 set(OpenGLES_${_comp}_FOUND TRUE)
173 else()
174 set(OpenGLES_${_comp}_FOUND FALSE)
175 endif()
176 else()
177 message(
178 WARNING "${_comp} is not a recognized OpenGL-ES component/version")
179 set(OpenGLES_${_comp}_FOUND FALSE)
180 endif()
181endforeach()
182if(_gles_required_vars)
183 list(REMOVE_DUPLICATES _gles_required_vars)
184endif()
185
186include(FindPackageHandleStandardArgs)
187find_package_handle_standard_args(
188 OpenGLES
189 REQUIRED_VARS ${_gles_required_vars}
190 HANDLE_COMPONENTS)
191if(OpenGLES_FOUND)
192 if(OpenGLES_V1_FOUND AND NOT TARGET OpenGLES::OpenGLESv1)
193 add_library(OpenGLES::OpenGLESv1 SHARED IMPORTED)
194
195 set_target_properties(
196 OpenGLES::OpenGLESv1
197 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
198 "${OpenGLES_V1_INCLUDE_DIR}"
199 IMPORTED_LINK_INTERFACE_LANGUAGES "C"
200 IMPORTED_LOCATION ${OpenGLES_V1_LIBRARY})
201 endif()
202 if(OpenGLES_V2_FOUND AND NOT TARGET OpenGLES::OpenGLESv2)
203 add_library(OpenGLES::OpenGLESv2 SHARED IMPORTED)
204
205 set_target_properties(
206 OpenGLES::OpenGLESv2
207 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
208 "${OpenGLES_V2_INCLUDE_DIR}"
209 IMPORTED_LINK_INTERFACE_LANGUAGES "C"
210 IMPORTED_LOCATION ${OpenGLES_V2_LIBRARY})
211 endif()
212 if(OpenGLES_V3_FOUND)
213 if(NOT TARGET OpenGLES::OpenGLESv3)
214 add_library(OpenGLES::OpenGLESv3 SHARED IMPORTED)
215
216 set_target_properties(
217 OpenGLES::OpenGLESv3
218 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
219 "${OpenGLES_V3_INCLUDE_DIR}"
220 IMPORTED_LINK_INTERFACE_LANGUAGES "C"
221 IMPORTED_LOCATION ${OpenGLES_V3_LIBRARY})
222 endif()
223 if(OpenGLES_V31_FOUND AND NOT TARGET OpenGLES::OpenGLESv31)
224 add_library(OpenGLES::OpenGLESv31 SHARED IMPORTED)
225
226 set_target_properties(
227 OpenGLES::OpenGLESv31
228 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
229 "${OpenGLES_V31_INCLUDE_DIR}"
230 IMPORTED_LINK_INTERFACE_LANGUAGES "C"
231 IMPORTED_LOCATION ${OpenGLES_V3_LIBRARY})
232 endif()
233 if(OpenGLES_V32_FOUND AND NOT TARGET OpenGLES::OpenGLESv32)
234 add_library(OpenGLES::OpenGLESv32 SHARED IMPORTED)
235
236 set_target_properties(
237 OpenGLES::OpenGLESv32
238 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
239 "${OpenGLES_V32_INCLUDE_DIR}"
240 IMPORTED_LINK_INTERFACE_LANGUAGES "C"
241 IMPORTED_LOCATION ${OpenGLES_V3_LIBRARY})
242 endif()
243 endif()
244 mark_as_advanced(
245 OpenGLES_V1_LIBRARY
246 OpenGLES_V1_INCLUDE_DIR
247 OpenGLES_V2_LIBRARY
248 OpenGLES_V2_INCLUDE_DIR
249 OpenGLES_V3_LIBRARY
250 OpenGLES_V3_INCLUDE_DIR
251 OpenGLES_V31_INCLUDE_DIR
252 OpenGLES_V32_INCLUDE_DIR)
253endif()
254mark_as_advanced(OpenGLES_ROOT_DIR)
255
256include(FeatureSummary)
257set_package_properties(
258 OpenGLES PROPERTIES
259 URL "https://www.khronos.org/opengles/"
260 DESCRIPTION
261 "A cross-platform graphics API, specialized for mobile and embedded, defined as a subset of desktop OpenGL."
262)