The open source OpenXR runtime
at main 342 lines 8.6 kB view raw
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 )