The open source OpenXR runtime
1# Copyright 2019-2024, Collabora, Ltd.
2# SPDX-License-Identifier: BSL-1.0
3
4###
5# Client library
6#
7
8add_library(comp_client STATIC)
9
10target_link_libraries(
11 comp_client
12 PUBLIC xrt-interfaces
13 PRIVATE aux_util
14 )
15target_include_directories(comp_client PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
16
17if(XRT_HAVE_VULKAN)
18 target_sources(
19 comp_client PRIVATE client/comp_vk_client.c client/comp_vk_client.h
20 client/comp_vk_glue.c
21 )
22 target_link_libraries(comp_client PRIVATE aux_vk)
23endif()
24
25if(XRT_HAVE_OPENGL OR XRT_HAVE_OPENGLES)
26 target_sources(
27 comp_client
28 PRIVATE client/comp_gl_client.c client/comp_gl_client.h
29 client/comp_gl_memobj_swapchain.c client/comp_gl_memobj_swapchain.h
30 )
31 target_link_libraries(comp_client PRIVATE aux_ogl)
32endif()
33
34if(XRT_HAVE_OPENGL)
35 target_sources(comp_client PRIVATE client/comp_gl_glue.c)
36endif()
37
38if(XRT_HAVE_OPENGLES)
39 target_sources(comp_client PRIVATE client/comp_gles_glue.c)
40endif()
41
42if(XRT_HAVE_EGL)
43 target_sources(
44 comp_client
45 PRIVATE client/comp_gl_eglimage_swapchain.c client/comp_gl_eglimage_swapchain.h
46 client/comp_egl_client.c client/comp_egl_client.h
47 )
48endif()
49
50if(XRT_HAVE_OPENGL_GLX AND XRT_HAVE_XLIB)
51 target_sources(
52 comp_client PRIVATE client/comp_gl_xlib_client.c client/comp_gl_xlib_client.h
53 client/comp_gl_xlib_glue.c
54 )
55 target_link_libraries(comp_client PRIVATE OpenGL::GLX)
56endif()
57
58if(XRT_HAVE_OPENGL AND WIN32)
59 target_sources(
60 comp_client PRIVATE client/comp_gl_win32_client.c client/comp_gl_win32_client.h
61 client/comp_gl_win32_glue.c
62 )
63endif()
64
65if(XRT_HAVE_D3D11 OR XRT_HAVE_D3D12)
66 target_link_libraries(comp_client PRIVATE aux_d3d)
67 target_sources(comp_client PRIVATE client/comp_d3d_common.cpp client/comp_d3d_common.hpp)
68endif()
69
70if(XRT_HAVE_D3D11)
71 target_sources(
72 comp_client PRIVATE client/comp_d3d11_client.cpp client/comp_d3d11_client.h
73 client/comp_d3d11_glue.c
74 )
75endif()
76
77if(XRT_HAVE_D3D12)
78 target_sources(
79 comp_client PRIVATE client/comp_d3d12_client.cpp client/comp_d3d12_client.h
80 client/comp_d3d12_glue.c
81 )
82endif()
83
84##
85# Render library
86#
87
88if(XRT_HAVE_VULKAN)
89 set(SHADERS
90 shaders/blit.comp
91 shaders/clear.comp
92 shaders/distortion.comp
93 shaders/layer.comp
94 shaders/mesh.frag
95 shaders/mesh.vert
96 shaders/layer_cylinder.frag
97 shaders/layer_cylinder.vert
98 shaders/layer_equirect2.frag
99 shaders/layer_equirect2.vert
100 shaders/layer_projection.vert
101 shaders/layer_quad.vert
102 shaders/layer_shared.frag
103 )
104
105 spirv_shaders(
106 SHADER_HEADERS
107 SPIRV_VERSION
108 1.0 # Currently targeting Vulkan 1.0
109 SOURCES
110 ${SHADERS}
111 )
112
113 add_library(
114 comp_render STATIC
115 ${SHADER_HEADERS}
116 render/render_buffer.c
117 render/render_compute.c
118 render/render_distortion.c
119 render/render_gfx.c
120 render/render_interface.h
121 render/render_resources.c
122 render/render_shaders.c
123 render/render_sub_alloc.c
124 render/render_util.c
125 )
126 # The aux_vk library needs to be public to include Vulkan.
127 target_link_libraries(
128 comp_render
129 PUBLIC xrt-interfaces aux_vk
130 PRIVATE aux_util aux_os
131 )
132 # So it can be used without any other compositor libraries.
133 target_include_directories(comp_render PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
134 # Shaders - marked SYSTEM so we get no warnings
135 target_include_directories(comp_render SYSTEM PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
136
137 add_subdirectory(shaders)
138endif()
139
140##
141# Util library
142#
143
144if(XRT_HAVE_VULKAN)
145 add_library(
146 comp_util STATIC
147 util/comp_base.h
148 util/comp_base.c
149 util/comp_high_level_render.c
150 util/comp_high_level_render.h
151 util/comp_high_level_scratch.c
152 util/comp_high_level_scratch.h
153 util/comp_layer_accum.h
154 util/comp_layer_accum.c
155 util/comp_render.h
156 util/comp_render_cs.c
157 util/comp_render_gfx.c
158 util/comp_render_helpers.h
159 util/comp_scratch.c
160 util/comp_scratch.h
161 util/comp_semaphore.h
162 util/comp_semaphore.c
163 util/comp_swapchain.h
164 util/comp_swapchain.c
165 util/comp_sync.h
166 util/comp_sync.c
167 util/comp_vulkan.h
168 util/comp_vulkan.c
169 )
170 target_link_libraries(
171 comp_util
172 PUBLIC xrt-interfaces
173 PRIVATE aux_util aux_os aux_vk comp_render
174 )
175 target_include_directories(comp_util PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
176endif()
177
178##
179# Main library
180#
181
182if(XRT_MODULE_COMPOSITOR_MAIN)
183
184 add_library(
185 comp_main STATIC
186 main/comp_compositor.c
187 main/comp_compositor.h
188 main/comp_documentation.h
189 main/comp_main_interface.h
190 main/comp_renderer.c
191 main/comp_renderer.h
192 main/comp_settings.c
193 main/comp_settings.h
194 main/comp_target.h
195 main/comp_target_swapchain.c
196 main/comp_target_swapchain.h
197 main/comp_window.h
198 main/comp_window_debug_image.c
199 main/comp_mirror_to_debug_gui.c
200 main/comp_mirror_to_debug_gui.h
201 )
202 target_link_libraries(
203 comp_main
204 PUBLIC xrt-interfaces
205 PRIVATE
206 aux_util
207 aux_os
208 aux_vk
209 comp_util
210 comp_render
211 )
212 target_include_directories(comp_main PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
213
214 if(XRT_HAVE_XCB)
215 target_sources(comp_main PRIVATE main/comp_window_xcb.c)
216 target_include_directories(comp_main SYSTEM PRIVATE ${XCB_INCLUDE_DIRS})
217 target_link_libraries(comp_main PRIVATE ${XCB_LIBRARIES})
218 if(XRT_HAVE_EGL)
219 target_include_directories(comp_main SYSTEM PRIVATE ${EGL_INCLUDE_DIRS})
220 target_link_libraries(comp_main PRIVATE ${XCB_LIBRARIES})
221 endif()
222 endif()
223 if(XRT_HAVE_XCB AND XRT_HAVE_XLIB)
224 target_sources(
225 comp_main PRIVATE main/comp_window_direct_randr.c
226 main/comp_window_direct_nvidia.c
227 )
228 target_link_libraries(comp_main PRIVATE ${X11_X11_LIB})
229 endif()
230 if(XRT_FEATURE_WINDOW_PEEK)
231 target_sources(comp_main PRIVATE main/comp_window_peek.c)
232 target_link_libraries(comp_main PRIVATE SDL2::SDL2)
233 endif()
234 if(WIN32)
235 target_sources(comp_main PRIVATE main/comp_window_mswin.c)
236 endif()
237 if(VK_USE_PLATFORM_DISPLAY_KHR)
238 target_sources(comp_main PRIVATE main/comp_window_vk_display.c)
239 endif()
240 if(VK_USE_PLATFORM_DISPLAY_KHR OR XRT_HAVE_XCB)
241 target_sources(comp_main PRIVATE main/comp_window_direct.c)
242 endif()
243
244 # generate wayland protocols
245 if(XRT_HAVE_WAYLAND)
246 target_sources(comp_main PRIVATE main/comp_window_wayland.c)
247 pkg_get_variable(WL_PROTOS_PKG_DIR wayland-protocols pkgdatadir)
248 pkg_get_variable(WL_SCANNER wayland-scanner wayland_scanner)
249
250 set(WL_PROTOS_DIR "${CMAKE_CURRENT_BINARY_DIR}/wayland-protocols")
251 file(MAKE_DIRECTORY "${WL_PROTOS_DIR}")
252
253 set(WL_PROTOS_XML ${WL_PROTOS_PKG_DIR}/stable/xdg-shell/xdg-shell.xml)
254
255 target_include_directories(
256 comp_main SYSTEM PRIVATE ${WL_PROTOS_DIR} ${WAYLAND_INCLUDE_DIRS}
257 )
258 target_link_libraries(comp_main PRIVATE ${WAYLAND_LIBRARIES})
259
260 if(XRT_HAVE_WAYLAND_DIRECT)
261 list(
262 APPEND WL_PROTOS_XML
263 ${WL_PROTOS_PKG_DIR}/staging/drm-lease/drm-lease-v1.xml
264 )
265
266 target_sources(comp_main PRIVATE main/comp_window_direct_wayland.c)
267
268 target_link_libraries(comp_main PRIVATE PkgConfig::LIBDRM)
269 endif()
270
271 foreach(wl_proto_xml ${WL_PROTOS_XML})
272 get_filename_component(WL_PROTO ${wl_proto_xml} NAME_WE)
273
274 set(WL_PROTO_C "${WL_PROTOS_DIR}/${WL_PROTO}.c")
275 set(WL_PROTO_H "${WL_PROTOS_DIR}/${WL_PROTO}-client-protocol.h")
276
277 add_custom_command(
278 OUTPUT "${WL_PROTO_C}"
279 COMMAND
280 "${WL_SCANNER}" private-code "${wl_proto_xml}"
281 "${WL_PROTO_C}"
282 VERBATIM
283 DEPENDS "${WL_SCANNER}" "${wl_proto_xml}"
284 COMMENT "Generating ${WL_PROTO_C}"
285 )
286
287 add_custom_command(
288 OUTPUT "${WL_PROTO_H}"
289 COMMAND
290 "${WL_SCANNER}" client-header "${wl_proto_xml}"
291 "${WL_PROTO_H}"
292 VERBATIM
293 DEPENDS "${WL_SCANNER}" "${wl_proto_xml}"
294 COMMENT "Generating ${WL_PROTO_H}"
295 )
296
297 target_sources(comp_main PRIVATE ${WL_PROTO_C} ${WL_PROTO_H})
298 endforeach()
299
300 endif()
301 if(ANDROID)
302 target_sources(comp_main PRIVATE main/comp_window_android.c)
303 target_link_libraries(comp_main PRIVATE aux_ogl aux_android)
304 endif()
305endif()
306
307###
308# Null compositor
309#
310
311if(XRT_MODULE_COMPOSITOR_NULL)
312 add_subdirectory(null)
313endif()
314
315###
316# Multi client compositor library
317#
318
319add_library(
320 comp_multi STATIC multi/comp_multi_compositor.c multi/comp_multi_interface.h
321 multi/comp_multi_private.h multi/comp_multi_system.c
322 )
323target_link_libraries(
324 comp_multi
325 PUBLIC xrt-interfaces
326 PRIVATE aux_util aux_os
327 )
328target_include_directories(comp_multi PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
329
330if(XRT_MODULE_COMPOSITOR_MAIN)
331 target_link_libraries(comp_main PRIVATE comp_multi)
332endif()
333
334###
335# Mock native compositor
336add_library(comp_mock STATIC mock/mock_compositor.cpp mock/mock_compositor.h)
337target_include_directories(comp_mock PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
338target_link_libraries(
339 comp_mock
340 PUBLIC xrt-interfaces
341 PRIVATE aux_util
342 )