Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Link patches #149

Merged
merged 12 commits into from
Jan 23, 2020
181 changes: 112 additions & 69 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,37 @@ set(CMAKE_CXX_STANDARD 14)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

# All options defined here
### Dependencies
set(OpenGL_GL_PREFERENCE GLVND)
find_package(OpenGL)
if(OPENGL_FOUND)
add_definitions(-DXR_USE_GRAPHICS_API_OPENGL)
elseif(BUILD_ALL_EXTENSIONS)
message(FATAL_ERROR "OpenGL not found")
endif()

if(NOT CMAKE_VERSION VERSION_LESS 3.7.0)
# Find the Vulkan headers
find_package(VulkanHeaders)
find_package(Vulkan)
endif()
if(VulkanHeaders_FOUND)
add_definitions(-DXR_USE_GRAPHICS_API_VULKAN)
elseif(BUILD_ALL_EXTENSIONS)
message(FATAL_ERROR "Vulkan headers not found")
endif()

find_package(Threads REQUIRED)
find_package(JsonCpp)

### All options defined here
option(BUILD_LOADER "Build loader" ON)
option(BUILD_ALL_EXTENSIONS "Build loader and layers with all extensions" OFF)
option(BUILD_LOADER_WITH_EXCEPTION_HANDLING "Enable exception handling in the loader. Leave this on unless your standard library is built to not throw." ON)
option(
BUILD_LOADER_WITH_EXCEPTION_HANDLING
"Enable exception handling in the loader. Leave this on unless your standard library is built to not throw."
ON
)
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
option(DYNAMIC_LOADER "Build the loader as a .dll library" OFF)
else()
Expand All @@ -40,10 +67,9 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/conformance" AND NOT CMAKE_SYSTEM_NAME ST
endif()
include(CMakeDependentOption)

find_package(JsonCpp)
cmake_dependent_option(BUILD_WITH_SYSTEM_JSONCPP "Use system jsoncpp instead of vendored source" ON
"JSONCPP_FOUND" OFF)

cmake_dependent_option(
BUILD_WITH_SYSTEM_JSONCPP "Use system jsoncpp instead of vendored source" ON "JSONCPP_FOUND" OFF
)

# Several files use these compile-time OS switches
if(WIN32)
Expand All @@ -52,6 +78,19 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
add_definitions(-DXR_OS_LINUX)
endif()

# This is a little helper library for setting up OpenGL
if(OPENGL_FOUND AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/common/gfxwrapper_opengl.c")
add_library(openxr-gfxwrapper STATIC common/gfxwrapper_opengl.c common/gfxwrapper_opengl.h)
target_include_directories(openxr-gfxwrapper PUBLIC ${PROJECT_SOURCE_DIR}/external/include)
if(TARGET OpenGL::OpenGL)
target_link_libraries(openxr-gfxwrapper PUBLIC OpenGL::OpenGL)
elseif(TARGET OpenGL::GL)
target_link_libraries(openxr-gfxwrapper PUBLIC OpenGL::GL)
else()
target_link_libraries(openxr-gfxwrapper PUBLIC ${OPENGL_LIBRARIES})
endif()
endif()

# Determine the presentation backend for Linux systems.
# Use an include because the code is pretty big.
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
Expand All @@ -60,48 +99,49 @@ endif()

# Several files use these compile-time platform switches
if(WIN32)
add_definitions( -DXR_USE_PLATFORM_WIN32 )
elseif( PRESENTATION_BACKEND MATCHES "xlib" )
add_definitions( -DXR_USE_PLATFORM_XLIB )
elseif( PRESENTATION_BACKEND MATCHES "xcb" )
add_definitions( -DXR_USE_PLATFORM_XCB )
add_definitions(-DXR_USE_PLATFORM_WIN32)
elseif(PRESENTATION_BACKEND MATCHES "xlib")
add_definitions(-DXR_USE_PLATFORM_XLIB)
elseif(PRESENTATION_BACKEND MATCHES "xcb")
add_definitions(-DXR_USE_PLATFORM_XCB)

# TODO remove once conformance supports XCB
set(BUILD_CONFORMANCE_TESTS OFF)
elseif( PRESENTATION_BACKEND MATCHES "wayland" )
add_definitions( -DXR_USE_PLATFORM_WAYLAND )
elseif(PRESENTATION_BACKEND MATCHES "wayland")
add_definitions(-DXR_USE_PLATFORM_WAYLAND)

# TODO remove once conformance supports Wayland
set(BUILD_CONFORMANCE_TESTS OFF)
endif()

# Enable graphics API available to the build.
if (NOT CMAKE_VERSION VERSION_LESS 3.7.0)
# Find the Vulkan headers
find_package(VulkanHeaders)
if (VulkanHeaders_FOUND)
add_definitions(-DXR_USE_GRAPHICS_API_VULKAN)
endif()
# Find the Vulkan loader.
find_package(Vulkan)
# To use simply include ${Vulkan_LIBRARY} in your target_link_library or
# wherever you normally link your library files to your target.
add_library(openxr-all-supported INTERFACE)
if(BUILD_WITH_XLIB_HEADERS)
target_compile_definitions(openxr-all-supported INTERFACE XR_USE_PLATFORM_XLIB)
endif()

if (BUILD_ALL_EXTENSIONS AND NOT VulkanHeaders_FOUND)
message(FATAL_ERROR "Vulkan headers not found")
if(BUILD_WITH_XCB_HEADERS)
target_compile_definitions(openxr-all-supported INTERFACE XR_USE_PLATFORM_XCB)
endif()

if(BUILD_WITH_WAYLAND_HEADERS)
target_compile_definitions(openxr-all-supported INTERFACE XR_USE_PLATFORM_WAYLAND)
endif()

# Find glslc shader compiler.
# On Android, the NDK includes the binary, so no external dependency.
if(ANDROID)
file(GLOB glslc-folders ${ANDROID_NDK}/shader-tools/*)
file(GLOB glslc_folders ${ANDROID_NDK}/shader-tools/*)
find_program(
GLSL_COMPILER glslc
PATHS ${glslc_folders}
NO_DEFAULT_PATH
)
else()
file(GLOB glslc-folders $ENV{VULKAN_SDK}/*)
file(GLOB glslc_folders $ENV{VULKAN_SDK}/*)
find_program(GLSL_COMPILER glslc PATHS ${glslc_folders})
endif()
find_program(CMAKE_GLSL_COMPILER glslc PATHS ${glslc-folders} NO_DEFAULT_PATH)
if(CMAKE_GLSL_COMPILER)
message(STATUS "Found glslc: ${CMAKE_GLSL_COMPILER}")
if(GLSL_COMPILER)
message(STATUS "Found glslc: ${GLSL_COMPILER}")
else()
message(STATUS "Could NOT find glslc, using precompiled .spv files")
endif()
Expand All @@ -111,11 +151,11 @@ function(compile_glsl run_target_name)
foreach(in_file IN LISTS ARGN)
get_filename_component(glsl_stage ${in_file} NAME_WE)
set(out_file ${CMAKE_CURRENT_BINARY_DIR}/${glsl_stage}.spv)
if(CMAKE_GLSL_COMPILER)
if(GLSL_COMPILER)
# Run glslc if we can find it
add_custom_command(
OUTPUT ${out_file}
COMMAND ${CMAKE_GLSL_COMPILER} -mfmt=c -fshader-stage=${glsl_stage} ${in_file} -o ${out_file}
COMMAND ${GLSL_COMPILER} -mfmt=c -fshader-stage=${glsl_stage} ${in_file} -o ${out_file}
DEPENDS ${in_file}
)
else()
Expand All @@ -126,21 +166,11 @@ function(compile_glsl run_target_name)
endif()
list(APPEND glsl_output_files ${out_file})
endforeach()
add_custom_target(
${run_target_name} ALL
DEPENDS ${glsl_output_files}
)
set_target_properties(${run_target_name} PROPERTIES FOLDER ${HELPER_FOLDER})
add_custom_target(${run_target_name} ALL DEPENDS ${glsl_output_files})
set_target_properties(${run_target_name} PROPERTIES FOLDER ${HELPER_FOLDER})

endfunction()

find_package(OpenGL)
if (OPENGL_FOUND)
add_definitions(-DXR_USE_GRAPHICS_API_OPENGL)
elseif(BUILD_ALL_EXTENSIONS)
message(FATAL_ERROR "OpenGL not found")
endif()

if(WIN32)
add_definitions(-DXR_USE_GRAPHICS_API_D3D11)
add_definitions(-DXR_USE_GRAPHICS_API_D3D12)
Expand All @@ -155,8 +185,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/common_config.h.in ${CMAKE_CURRENT_BI
add_definitions(-DOPENXR_HAVE_COMMON_CONFIG)

# Be able to find pre-generated files, if used.
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include
${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include ${CMAKE_CURRENT_SOURCE_DIR})

add_definitions(-DXR_USE_TIMESPEC)

Expand All @@ -166,9 +195,13 @@ include(${CMAKE_CURRENT_SOURCE_DIR}/version.cmake)
# Path separators ( : or ; ) are not handled well in CMake.
# This seems like a reasonable approach.
if(WIN32)
set(CODEGEN_PYTHON_PATH "${PROJECT_SOURCE_DIR}/specification/scripts;${PROJECT_SOURCE_DIR}/src/scripts;$ENV{PYTHONPATH}")
set(CODEGEN_PYTHON_PATH
"${PROJECT_SOURCE_DIR}/specification/scripts;${PROJECT_SOURCE_DIR}/src/scripts;$ENV{PYTHONPATH}"
)
else()
set(CODEGEN_PYTHON_PATH "${PROJECT_SOURCE_DIR}/specification/scripts:${PROJECT_SOURCE_DIR}/src/scripts:$ENV{PYTHONPATH}")
set(CODEGEN_PYTHON_PATH
"${PROJECT_SOURCE_DIR}/specification/scripts:${PROJECT_SOURCE_DIR}/src/scripts:$ENV{PYTHONPATH}"
)
endif()

# General code generation macro used by several targets.
Expand All @@ -179,22 +212,26 @@ macro(run_xr_xml_generate dependency output)
list(APPEND GENERATED_OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/${output}")
else()
if(NOT PYTHON_EXECUTABLE)
message(FATAL_ERROR "Python 3 not found, but pre-generated ${CMAKE_CURRENT_SOURCE_DIR}/${output} not found")
message(
FATAL_ERROR
"Python 3 not found, but pre-generated ${CMAKE_CURRENT_SOURCE_DIR}/${output} not found"
)
endif()
add_custom_command(OUTPUT ${output}
COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CODEGEN_PYTHON_PATH}"
add_custom_command(
OUTPUT ${output}
COMMAND
${CMAKE_COMMAND} -E env "PYTHONPATH=${CODEGEN_PYTHON_PATH}"
${PYTHON_EXECUTABLE}
${PROJECT_SOURCE_DIR}/src/scripts/src_genxr.py
-registry ${PROJECT_SOURCE_DIR}/specification/registry/xr.xml
${output}
${PROJECT_SOURCE_DIR}/src/scripts/src_genxr.py
-registry ${PROJECT_SOURCE_DIR}/specification/registry/xr.xml
${output}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS
"${PROJECT_SOURCE_DIR}/specification/registry/xr.xml"
DEPENDS "${PROJECT_SOURCE_DIR}/specification/registry/xr.xml"
"${PROJECT_SOURCE_DIR}/specification/scripts/generator.py"
"${PROJECT_SOURCE_DIR}/specification/scripts/reg.py"
"${PROJECT_SOURCE_DIR}/src/scripts/${dependency}"
"${PROJECT_SOURCE_DIR}/src/scripts/src_genxr.py"
${ARGN}
${ARGN}
COMMENT "Generating ${output} using ${PYTHON_EXECUTABLE} on ${dependency}"
)
set_source_files_properties(${output} PROPERTIES GENERATED TRUE)
Expand All @@ -205,14 +242,23 @@ endmacro()

# Layer JSON generation macro used by several targets.
macro(gen_xr_layer_json filename layername libfile version desc genbad)
add_custom_command(OUTPUT ${filename}
COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${CODEGEN_PYTHON_PATH}"
add_custom_command(
OUTPUT ${filename}
COMMAND
${CMAKE_COMMAND} -E env "PYTHONPATH=${CODEGEN_PYTHON_PATH}"
${PYTHON_EXECUTABLE}
${PROJECT_SOURCE_DIR}/src/scripts/generate_api_layer_manifest.py
-f ${filename} -n ${layername} -l ${libfile} -a ${MAJOR}.${MINOR} -v ${version} ${genbad} -d ${desc}
${PROJECT_SOURCE_DIR}/src/scripts/generate_api_layer_manifest.py
-f ${filename}
-n ${layername}
-l ${libfile}
-a ${MAJOR}.${MINOR}
-v ${version}
${genbad}
-d ${desc}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${PROJECT_SOURCE_DIR}/src/scripts/generate_api_layer_manifest.py
COMMENT "Generating API Layer JSON ${filename} using -f ${filename} -n ${layername} -l ${libfile} -a ${MAJOR}.${MINOR} -v ${version} ${genbad} -d ${desc}"
COMMENT
"Generating API Layer JSON ${filename} using -f ${filename} -n ${layername} -l ${libfile} -a ${MAJOR}.${MINOR} -v ${version} ${genbad} -d ${desc}"
)
endmacro()

Expand All @@ -221,13 +267,13 @@ set(GENERATED_OUTPUT)
set(GENERATED_DEPENDS)
run_xr_xml_generate(utility_source_generator.py xr_generated_dispatch_table.h)
run_xr_xml_generate(utility_source_generator.py xr_generated_dispatch_table.c)
add_custom_target(xr_global_generated_files DEPENDS
${GENERATED_DEPENDS}
)
add_custom_target(xr_global_generated_files DEPENDS ${GENERATED_DEPENDS})
set_target_properties(xr_global_generated_files PROPERTIES FOLDER ${CODEGEN_FOLDER})

set(COMMON_GENERATED_OUTPUT ${GENERATED_OUTPUT})

set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")

if(BUILD_LOADER)
add_subdirectory(loader)
endif()
Expand All @@ -243,6 +289,3 @@ endif()
if(BUILD_CONFORMANCE_TESTS)
add_subdirectory(conformance)
endif()



2 changes: 2 additions & 0 deletions src/api_layers/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ add_library(XrApiLayer_api_dump SHARED
)
set_target_properties(XrApiLayer_api_dump PROPERTIES FOLDER ${API_LAYERS_FOLDER})

target_link_libraries(XrApiLayer_api_dump PRIVATE openxr-all-supported)
add_dependencies(XrApiLayer_api_dump
generate_openxr_header
xr_global_generated_files
Expand Down Expand Up @@ -128,6 +129,7 @@ add_library(XrApiLayer_core_validation SHARED
)
set_target_properties(XrApiLayer_core_validation PROPERTIES FOLDER ${API_LAYERS_FOLDER})

target_link_libraries(XrApiLayer_core_validation PRIVATE openxr-all-supported)
add_dependencies(XrApiLayer_core_validation
generate_openxr_header
xr_global_generated_files
Expand Down
Loading