Skip to content

Commit 93e952b

Browse files
committed
build: Add an internal-use static library for gfxwrapper.
Helping to untangle the deps Signed-off-by: Ryan Pavlik <[email protected]>
1 parent 53dffbd commit 93e952b

File tree

5 files changed

+109
-100
lines changed

5 files changed

+109
-100
lines changed

src/CMakeLists.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
2121
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
2222

2323
### Dependencies
24+
set(OpenGL_GL_PREFERENCE GLVND)
2425
find_package(OpenGL)
2526
if(OPENGL_FOUND)
2627
add_definitions(-DXR_USE_GRAPHICS_API_OPENGL)
@@ -72,6 +73,19 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
7273
add_definitions(-DXR_OS_LINUX)
7374
endif()
7475

76+
# This is a little helper library for setting up OpenGL
77+
if(OPENGL_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/common/gfxwrapper_opengl.c")
78+
add_library(openxr-gfxwrapper STATIC common/gfxwrapper_opengl.c common/gfxwrapper_opengl.h)
79+
target_include_directories(openxr-gfxwrapper PUBLIC ${PROJECT_SOURCE_DIR}/external/include)
80+
if(TARGET OpenGL::OpenGL)
81+
target_link_libraries(openxr-gfxwrapper PUBLIC OpenGL::OpenGL)
82+
elseif(TARGET OpenGL::GL)
83+
target_link_libraries(openxr-gfxwrapper PUBLIC OpenGL::GL)
84+
else()
85+
target_link_libraries(openxr-gfxwrapper PUBLIC ${OPENGL_LIBRARIES})
86+
endif()
87+
endif()
88+
7589
# Determine the presentation backend for Linux systems.
7690
# Use an include because the code is pretty big.
7791
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")

src/cmake/presentation.cmake

Lines changed: 80 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,105 @@
11
set(PRESENTATION_BACKENDS xlib xcb wayland)
2-
set(PRESENTATION_BACKEND xlib CACHE STRING
3-
"Presentation backend chosen at configure time")
4-
set_property(CACHE PRESENTATION_BACKEND PROPERTY STRINGS
5-
${PRESENTATION_BACKENDS})
2+
set(PRESENTATION_BACKEND
3+
xlib
4+
CACHE STRING "Presentation backend chosen at configure time"
5+
)
6+
set_property(CACHE PRESENTATION_BACKEND PROPERTY STRINGS ${PRESENTATION_BACKENDS})
67

78
list(FIND PRESENTATION_BACKENDS ${PRESENTATION_BACKEND} index)
89
if(index EQUAL -1)
9-
message(FATAL_ERROR "Presentation backend must be one of
10-
${PRESENTATION_BACKENDS}")
10+
message(FATAL_ERROR "Presentation backend must be one of ${PRESENTATION_BACKENDS}")
1111
endif()
1212

1313
message(STATUS "Using presentation backend: ${PRESENTATION_BACKEND}")
1414

15+
find_package(X11)
1516

16-
if( PRESENTATION_BACKEND MATCHES "xlib" )
17-
find_package(X11 REQUIRED)
18-
if (BUILD_TESTS AND ((NOT X11_Xxf86vm_LIB) OR (NOT X11_Xrandr_LIB)))
17+
find_package(PkgConfig)
18+
19+
if(PKG_CONFIG_FOUND)
20+
pkg_search_module(XCB xcb)
21+
22+
pkg_search_module(WAYLAND_CLIENT wayland-client)
23+
endif()
24+
25+
26+
if(PRESENTATION_BACKEND MATCHES "xlib")
27+
if(BUILD_TESTS AND (NOT X11_Xxf86vm_LIB OR NOT X11_Xrandr_LIB))
1928
message(FATAL_ERROR "OpenXR tests using xlib backend requires Xxf86vm and Xrandr")
2029
endif()
2130

22-
add_definitions( -DSUPPORT_X )
23-
add_definitions( -DOS_LINUX_XLIB )
24-
set( XLIB_LIBRARIES
25-
${X11_LIBRARIES}
26-
${X11_Xxf86vm_LIB}
27-
${X11_Xrandr_LIB} )
28-
29-
elseif( PRESENTATION_BACKEND MATCHES "xcb" )
30-
find_package(PkgConfig REQUIRED)
31-
# XCB + XCB GLX is limited to OpenGL 2.1
32-
# add_definitions( -DOS_LINUX_XCB )
33-
# XCB + Xlib GLX 1.3
34-
add_definitions( -DOS_LINUX_XCB_GLX )
35-
36-
pkg_search_module(X11 REQUIRED x11)
37-
pkg_search_module(XCB REQUIRED xcb)
31+
if(TARGET openxr-gfxwrapper)
32+
target_compile_definitions(openxr-gfxwrapper PUBLIC OS_LINUX_XLIB)
33+
target_link_libraries(openxr-gfxwrapper PRIVATE ${X11_X11_LIB} ${X11_Xxf86vm_LIB} ${X11_Xrandr_LIB})
34+
35+
if(TARGET OpenGL::OpenGL)
36+
target_link_libraries(openxr-gfxwrapper PUBLIC OpenGL::OpenGL)
37+
elseif(TARGET OpenGL::GLX)
38+
target_link_libraries(openxr-gfxwrapper PUBLIC OpenGL::GLX)
39+
else()
40+
target_link_libraries(openxr-gfxwrapper PUBLIC ${OPENGL_LIBRARIES} ${OPENGL_glx_LIBRARY})
41+
endif()
42+
endif()
43+
elseif(PRESENTATION_BACKEND MATCHES "xcb")
3844
pkg_search_module(XCB_RANDR REQUIRED xcb-randr)
3945
pkg_search_module(XCB_KEYSYMS REQUIRED xcb-keysyms)
4046
pkg_search_module(XCB_GLX REQUIRED xcb-glx)
4147
pkg_search_module(XCB_DRI2 REQUIRED xcb-dri2)
4248
pkg_search_module(XCB_ICCCM REQUIRED xcb-icccm)
4349

44-
set( XCB_LIBRARIES
45-
${XCB_LIBRARIES}
46-
${XCB_KEYSYMS_LIBRARIES}
47-
${XCB_RANDR_LIBRARIES}
48-
${XCB_GLX_LIBRARIES}
49-
${XCB_DRI2_LIBRARIES}
50-
${X11_LIBRARIES} )
51-
52-
elseif( PRESENTATION_BACKEND MATCHES "wayland" )
53-
find_package(PkgConfig REQUIRED)
54-
pkg_search_module(WAYLAND_CLIENT REQUIRED wayland-client)
50+
if(TARGET openxr-gfxwrapper)
51+
# XCB + XCB GLX is limited to OpenGL 2.1
52+
# target_compile_definitions(openxr-gfxwrapper PUBLIC OS_LINUX_XCB )
53+
# XCB + Xlib GLX 1.3
54+
target_compile_definitions(openxr-gfxwrapper PUBLIC OS_LINUX_XCB_GLX)
55+
56+
target_link_libraries(openxr-gfxwrapper PRIVATE ${X11_X11_LIB} ${XCB_KEYSYMS_LIBRARIES} ${XCB_RANDR_LIBRARIES})
57+
endif()
58+
elseif(PRESENTATION_BACKEND MATCHES "wayland")
59+
5560
pkg_search_module(WAYLAND_EGL REQUIRED wayland-egl)
5661
pkg_search_module(WAYLAND_SCANNER REQUIRED wayland-scanner)
5762
pkg_search_module(WAYLAND_PROTOCOLS REQUIRED wayland-protocols>=1.7)
5863
pkg_search_module(EGL REQUIRED egl)
5964

60-
add_definitions( -DOS_LINUX_WAYLAND )
61-
set( WAYLAND_LIBRARIES
62-
${EGL_LIBRARIES}
63-
${WAYLAND_CLIENT_LIBRARIES}
64-
${WAYLAND_EGL_LIBRARIES} )
65-
66-
# generate wayland protocols
67-
set(WAYLAND_PROTOCOLS_DIR ${PROJECT_SOURCE_DIR}/wayland-protocols/)
68-
file(MAKE_DIRECTORY ${WAYLAND_PROTOCOLS_DIR})
69-
70-
pkg_get_variable(WAYLAND_PROTOCOLS_DATADIR wayland-protocols pkgdatadir)
71-
pkg_get_variable(WAYLAND_SCANNER wayland-scanner wayland_scanner)
72-
73-
set(PROTOCOL xdg-shell-unstable-v6)
74-
set(PROTOCOL_XML
75-
${WAYLAND_PROTOCOLS_DATADIR}/unstable/xdg-shell/${PROTOCOL}.xml)
76-
77-
if( EXISTS ${PROTOCOL_XML} )
78-
execute_process(COMMAND
79-
${WAYLAND_SCANNER}
80-
code
81-
${PROTOCOL_XML}
82-
${WAYLAND_PROTOCOLS_DIR}/${PROTOCOL}.c)
83-
execute_process(COMMAND
84-
${WAYLAND_SCANNER}
85-
client-header
86-
${PROTOCOL_XML}
87-
${WAYLAND_PROTOCOLS_DIR}/${PROTOCOL}.h)
88-
89-
set( WAYLAND_PROTOCOL_SRC
90-
${WAYLAND_PROTOCOLS_DIR}/${PROTOCOL}.c
91-
${WAYLAND_PROTOCOLS_DIR}/${PROTOCOL}.h )
92-
93-
include_directories(${WAYLAND_PROTOCOLS_DIR})
94-
else()
95-
message(FATAL_ERROR
96-
"xdg-shell-unstable-v6.xml not found in "
97-
${WAYLAND_PROTOCOLS_DATADIR}
98-
"\nYour wayland-protocols package does not "
99-
"contain xdg-shell-unstable-v6.")
65+
if(TARGET openxr-gfxwrapper)
66+
# generate wayland protocols
67+
set(WAYLAND_PROTOCOLS_DIR ${PROJECT_BINARY_DIR}/wayland-protocols/)
68+
file(MAKE_DIRECTORY ${WAYLAND_PROTOCOLS_DIR})
69+
70+
pkg_get_variable(WAYLAND_PROTOCOLS_DATADIR wayland-protocols pkgdatadir)
71+
pkg_get_variable(WAYLAND_SCANNER wayland-scanner wayland_scanner)
72+
73+
set(PROTOCOL xdg-shell-unstable-v6)
74+
set(PROTOCOL_XML ${WAYLAND_PROTOCOLS_DATADIR}/unstable/xdg-shell/${PROTOCOL}.xml)
75+
76+
if(NOT EXISTS ${PROTOCOL_XML})
77+
message(FATAL_ERROR "xdg-shell-unstable-v6.xml not found in " ${WAYLAND_PROTOCOLS_DATADIR}
78+
"\nYour wayland-protocols package does not " "contain xdg-shell-unstable-v6."
79+
)
80+
endif()
81+
add_custom_command(
82+
OUTPUT ${WAYLAND_PROTOCOLS_DIR}/${PROTOCOL}.c
83+
COMMAND ${WAYLAND_SCANNER} code ${PROTOCOL_XML} ${WAYLAND_PROTOCOLS_DIR}/${PROTOCOL}.c
84+
VERBATIM
85+
)
86+
add_custom_command(
87+
OUTPUT ${WAYLAND_PROTOCOLS_DIR}/${PROTOCOL}.h
88+
COMMAND ${WAYLAND_SCANNER} client-header ${PROTOCOL_XML} ${WAYLAND_PROTOCOLS_DIR}/${PROTOCOL}.h
89+
VERBATIM
90+
)
91+
92+
target_sources(openxr-gfxwrapper
93+
PRIVATE
94+
${WAYLAND_PROTOCOLS_DIR}/${PROTOCOL}.c
95+
${WAYLAND_PROTOCOLS_DIR}/${PROTOCOL}.h
96+
)
97+
98+
target_include_directories(openxr-gfxwrapper PUBLIC ${WAYLAND_PROTOCOLS_DIR})
99+
target_link_libraries(
100+
openxr-gfxwrapper PRIVATE ${EGL_LIBRARIES} ${WAYLAND_CLIENT_LIBRARIES} ${WAYLAND_EGL_LIBRARIES}
101+
)
102+
target_compile_definitions(openxr-gfxwrapper PUBLIC OS_LINUX_WAYLAND)
103+
target_link_libraries(openxr-gfxwrapper PRIVATE ${EGL_LIBRARIES} ${WAYLAND_CLIENT_LIBRARIES})
100104
endif()
101105
endif()

src/tests/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
#
1717

1818
add_subdirectory(list)
19+
if(OPENGL_FOUND AND NOT TARGET openxr-gfxwrapper)
20+
return()
21+
endif()
22+
1923
add_subdirectory(hello_xr)
2024
if(BUILD_LOADER)
2125
add_subdirectory(loader_test)

src/tests/hello_xr/CMakeLists.txt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,11 @@ if(VulkanHeaders_INCLUDE_DIRS)
5757
${VulkanHeaders_INCLUDE_DIRS}
5858
)
5959
endif()
60-
if(OPENGL_FOUND)
61-
target_sources(hello_xr
62-
PRIVATE
63-
${PROJECT_SOURCE_DIR}/src/common/gfxwrapper_opengl.c
64-
)
65-
endif()
6660

6761
target_link_libraries(hello_xr openxr_loader)
62+
if(TARGET openxr-gfxwrapper)
63+
target_link_libraries(hello_xr openxr-gfxwrapper)
64+
endif()
6865
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
6966
if(MSVC)
7067
target_compile_definitions(hello_xr PRIVATE _CRT_SECURE_NO_WARNINGS)
@@ -73,8 +70,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
7370
target_link_libraries(hello_xr d3d11 d3dcompiler dxgi ${OPENGL_gl_LIBRARY})
7471
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
7572
target_compile_options(hello_xr PRIVATE -Wall)
76-
target_link_libraries(hello_xr m pthread GL ${XLIB_LIBRARIES} ${XCB_LIBRARIES} ${WAYLAND_LIBRARIES})
77-
target_sources(hello_xr PRIVATE ${WAYLAND_PROTOCOL_SRC})
73+
target_link_libraries(hello_xr m pthread)
7874
endif()
7975

8076
if(Vulkan_LIBRARY)

src/tests/loader_test/CMakeLists.txt

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,16 @@
1818
add_executable(loader_test
1919
loader_test_utils.cpp
2020
loader_test.cpp
21-
${PROJECT_SOURCE_DIR}/src/common/gfxwrapper_opengl.c
2221
${PROJECT_SOURCE_DIR}/src/common/filesystem_utils.cpp
2322
)
2423
set_target_properties(loader_test PROPERTIES FOLDER ${TESTS_FOLDER})
2524

26-
add_dependencies(loader_test
27-
generate_openxr_header
28-
)
29-
target_include_directories(loader_test
25+
add_dependencies(loader_test generate_openxr_header)
26+
if(TARGET openxr-gfxwrapper)
27+
target_link_libraries(loader_test openxr-gfxwrapper)
28+
endif()
29+
target_include_directories(
30+
loader_test
3031
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
3132
PRIVATE ${PROJECT_BINARY_DIR}/src
3233
PRIVATE ${PROJECT_BINARY_DIR}/include
@@ -48,17 +49,7 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
4849
loader_test PRIVATE -Wall -Wno-unused-function -Wno-format-truncation
4950
)
5051

51-
if(PRESENTATION_BACKEND MATCHES "xlib")
52-
target_link_libraries(
53-
loader_test ${X11_Xxf86vm_LIB} ${X11_Xrandr_LIB} ${X11_LIBRARIES}
54-
)
55-
elseif(PRESENTATION_BACKEND MATCHES "xcb")
56-
target_link_libraries(loader_test ${XCB_LIBRARIES})
57-
elseif(PRESENTATION_BACKEND MATCHES "wayland")
58-
target_link_libraries(loader_test ${WAYLAND_LIBRARIES})
59-
target_sources(loader_test PRIVATE ${WAYLAND_PROTOCOL_SRC})
60-
endif()
61-
target_link_libraries(loader_test -lstdc++fs openxr_loader m -lpthread GL)
52+
target_link_libraries(loader_test -lstdc++fs openxr_loader m -lpthread)
6253
else()
6354
message(FATAL_ERROR "Unsupported Platform")
6455
endif()

0 commit comments

Comments
 (0)