Files
2025-09-04 10:54:47 +08:00

388 lines
13 KiB
CMake

# Copyright (c) 2019-2025, Arm Limited and Contributors
# Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 the "License";
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
cmake_minimum_required(VERSION 3.10)
project(third_party LANGUAGES C CXX)
# glm
add_library(glm INTERFACE)
set(GLM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/glm)
target_sources(glm INTERFACE ${GLM_DIR}/glm/glm.hpp)
target_include_directories(glm SYSTEM INTERFACE ${GLM_DIR})
target_compile_definitions(glm INTERFACE
GLM_FORCE_SWIZZLE
GLM_FORCE_RADIANS
GLM_FORCE_CTOR_INIT
GLM_ENABLE_EXPERIMENTAL
)
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
target_compile_definitions(glm INTERFACE GLM_FORCE_CXX14)
endif()
# tinygltf
add_library(tinygltf INTERFACE)
set(TINYGLTF_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tinygltf)
target_sources(tinygltf INTERFACE ${TINYGLTF_DIR}/tiny_gltf.h ${TINYGLTF_DIR}/json.hpp)
target_include_directories(tinygltf SYSTEM INTERFACE ${TINYGLTF_DIR})
# vulkan
add_library(vulkan INTERFACE)
set(VULKAN_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vulkan/include)
target_sources(vulkan INTERFACE ${VULKAN_INCLUDE_DIR}/vulkan/vulkan.h)
target_include_directories(vulkan SYSTEM INTERFACE ${VULKAN_INCLUDE_DIR})
target_compile_definitions(vulkan INTERFACE VK_NO_PROTOTYPES)
if(VKB_ENABLE_PORTABILITY)
# When portability is enabled, must enable Vulkan beta extensions for access to VK_KHR_portability_subset
target_compile_definitions(vulkan INTERFACE VK_ENABLE_BETA_EXTENSIONS)
endif()
if(ANDROID)
target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_ANDROID_KHR)
elseif(WIN32)
target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_WIN32_KHR)
elseif(APPLE)
target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_METAL_EXT)
elseif(UNIX)
# Choose WSI based on VKB_WSI_SELECTION
if (VKB_WSI_SELECTION STREQUAL XCB OR VKB_WSI_SELECTION STREQUAL XLIB OR VKB_WSI_SELECTION STREQUAL WAYLAND)
find_package(PkgConfig REQUIRED)
endif()
if (VKB_WSI_SELECTION STREQUAL XCB)
pkg_check_modules(XCB xcb REQUIRED)
if (XCB_FOUND)
target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_XCB_KHR)
endif()
elseif (VKB_WSI_SELECTION STREQUAL XLIB)
pkg_check_modules(X11 x11 REQUIRED)
if (X11_FOUND)
target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_XLIB_KHR)
endif()
elseif (VKB_WSI_SELECTION STREQUAL WAYLAND)
pkg_check_modules(WAYLAND wayland-client REQUIRED)
if (WAYLAND_FOUND)
target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_WAYLAND_KHR)
endif()
elseif (VKB_WSI_SELECTION STREQUAL D2D)
set(DIRECT_TO_DISPLAY TRUE)
set(DIRECT_TO_DISPLAY TRUE PARENT_SCOPE)
target_compile_definitions(vulkan INTERFACE VK_USE_PLATFORM_DISPLAY_KHR)
else()
message(FATAL_ERROR "Unknown WSI")
endif()
endif()
# vma
add_library(vma INTERFACE)
set(VMA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vma/include)
target_sources(vma INTERFACE ${VMA_DIR}/vk_mem_alloc.h)
target_include_directories(vma SYSTEM INTERFACE ${VMA_DIR})
target_link_libraries(vma INTERFACE vulkan)
# libktx
set(KTX_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ktx)
set(KTX_SOURCES
${KTX_DIR}/lib/checkheader.c
${KTX_DIR}/external/dfdutils/createdfd.c
${KTX_DIR}/external/dfdutils/colourspaces.c
${KTX_DIR}/external/dfdutils/dfd.h
${KTX_DIR}/external/dfdutils/dfd2vk.inl
${KTX_DIR}/external/dfdutils/interpretdfd.c
${KTX_DIR}/external/dfdutils/printdfd.c
${KTX_DIR}/external/dfdutils/queries.c
${KTX_DIR}/external/dfdutils/vk2dfd.c
${KTX_DIR}/external/etcdec/etcdec.cxx
${KTX_DIR}/lib/etcunpack.cxx
${KTX_DIR}/lib/filestream.c
${KTX_DIR}/lib/filestream.h
${KTX_DIR}/lib/formatsize.h
${KTX_DIR}/lib/hashlist.c
${KTX_DIR}/lib/info.c
${KTX_DIR}/lib/ktxint.h
${KTX_DIR}/lib/memstream.c
${KTX_DIR}/lib/memstream.h
${KTX_DIR}/lib/strings.c
${KTX_DIR}/lib/swap.c
${KTX_DIR}/lib/uthash.h
${KTX_DIR}/lib/texture.c
${KTX_DIR}/lib/texture.h
${KTX_DIR}/utils/unused.h
# Basis Universal
${KTX_DIR}/lib/basis_sgd.h
${KTX_DIR}/lib/basis_transcode.cpp
${KTX_DIR}/lib/miniz_wrapper.cpp
${KTX_DIR}/external/basisu/transcoder/basisu_containers.h
${KTX_DIR}/external/basisu/transcoder/basisu_containers_impl.h
${KTX_DIR}/external/basisu/transcoder/basisu_file_headers.h
${KTX_DIR}/external/basisu/transcoder/basisu_transcoder_internal.h
${KTX_DIR}/external/basisu/transcoder/basisu_transcoder_uastc.h
${KTX_DIR}/external/basisu/transcoder/basisu_transcoder.cpp
${KTX_DIR}/external/basisu/transcoder/basisu_transcoder.h
${KTX_DIR}/external/basisu/transcoder/basisu.h
${KTX_DIR}/external/basisu/zstd/zstd.c
# KT1
${KTX_DIR}/lib/texture1.c
${KTX_DIR}/lib/texture1.h
# KTX2
${KTX_DIR}/lib/texture2.c
${KTX_DIR}/lib/texture2.h
# Vulkan support
${KTX_DIR}/lib/vk_format.h
${KTX_DIR}/lib/vkformat_check.c
${KTX_DIR}/lib/vkformat_enum.h
${KTX_DIR}/lib/vkformat_str.c
${KTX_DIR}/lib/vkformat_typesize.c
${KTX_DIR}/lib/vkformat_check_variant.c
${KTX_DIR}/lib/vk_funcs.c
${KTX_DIR}/lib/vk_funcs.h
${KTX_DIR}/lib/vkloader.c
)
set(KTX_INCLUDE_DIRS
${KTX_DIR}/include
${KTX_DIR}/lib
${KTX_DIR}/utils
${KTX_DIR}/external
${KTX_DIR}/external/basisu/zstd
${KTX_DIR}/external/basisu/transcoder
${KTX_DIR}/other_include
)
add_library(ktx STATIC ${KTX_SOURCES})
target_compile_definitions(ktx PUBLIC LIBKTX)
if (WIN32)
target_compile_definitions(ktx PUBLIC "KTX_API=__declspec(dllexport)")
endif()
target_compile_definitions(ktx PUBLIC KTX_FEATURE_WRITE=0)
target_compile_definitions(ktx PUBLIC BASISD_SUPPORT_KTX2_ZSTD=0)
target_compile_definitions(ktx PUBLIC BASISU_NO_ITERATOR_DEBUG_LEVEL)
target_include_directories(ktx SYSTEM PUBLIC ${KTX_INCLUDE_DIRS})
target_link_libraries(ktx PUBLIC vulkan)
set_target_properties(ktx PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
# volk
set(VOLK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/volk")
set(VOLK_FILES
"${VOLK_DIR}/volk.c"
"${VOLK_DIR}/volk.h")
add_library(volk STATIC ${VOLK_FILES})
set_target_properties(volk PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_link_libraries(volk PUBLIC vulkan)
target_include_directories(volk SYSTEM PUBLIC ${VOLK_DIR})
if (VKB_WSI_SELECTION STREQUAL XCB)
target_include_directories(volk SYSTEM PUBLIC ${XCB_INCLUDE_DIRS})
elseif (VKB_WSI_SELECTION STREQUAL XLIB)
target_include_directories(volk SYSTEM PUBLIC ${X11_INCLUDE_DIRS})
elseif (VKB_WSI_SELECTION STREQUAL WAYLAND)
target_include_directories(volk SYSTEM PUBLIC ${WAYLAND_INCLUDE_DIRS})
endif()
set_property(TARGET volk PROPERTY FOLDER "ThirdParty")
# imgui
set(IMGUI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/imgui")
set(IMGUI_FILES
"${IMGUI_DIR}/imgui.cpp"
"${IMGUI_DIR}/imgui_demo.cpp"
"${IMGUI_DIR}/imgui_draw.cpp"
"${IMGUI_DIR}/imgui_tables.cpp"
"${IMGUI_DIR}/imgui_widgets.cpp"
"${IMGUI_DIR}/imconfig.h"
"${IMGUI_DIR}/imgui.h"
"${IMGUI_DIR}/imgui_internal.h"
"${IMGUI_DIR}/imstb_rectpack.h"
"${IMGUI_DIR}/imstb_textedit.h"
"${IMGUI_DIR}/imstb_truetype.h")
add_library(imgui STATIC ${IMGUI_FILES})
target_include_directories(imgui SYSTEM PUBLIC ${IMGUI_DIR})
set_target_properties(imgui PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
# spirv-cross
add_subdirectory(spirv-cross)
set_target_properties(spirv-cross PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
set_target_properties(spirv-cross-c PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
set_target_properties(spirv-cross-core PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
set_target_properties(spirv-cross-glsl PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
set_target_properties(spirv-cross-cpp PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
set_target_properties(spirv-cross-hlsl PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
set_target_properties(spirv-cross-msl PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
set_target_properties(spirv-cross-reflect PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
set_target_properties(spirv-cross-util PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
if(ANDROID)
# hwcpipe
add_subdirectory(hwcpipe)
set_target_properties(hwcpipe PROPERTIES FOLDER "ThirdParty" POSITION_INDEPENDENT_CODE ON)
endif()
# stb
add_library(stb INTERFACE)
target_include_directories(stb SYSTEM INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/stb")
# Allow the user to specify the ASTC architecture explicitly if building for a platform
# other than the host architecture (i.e. x86 on an x64 CPU)
if (NOT (DEFINED ASTC_ARCH))
if (APPLE)
# Always use NEON when host is arm64 or cross-compiling to iOS physical devices,
# otherwise look for supported vector instructions based on x86_64 host processor.
# Don't use AVX2 since it builds for x86_64h which does not match x86_64 project,
# and lastly fall back to NATIVE if no matches found.
if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "arm64" OR ${CMAKE_OSX_SYSROOT} STREQUAL "iphoneos")
set(ASTC_ARCH NEON)
else()
include( FindSSE41 )
include( FindSSE2 )
if (${SSE41_FOUND})
set(ASTC_ARCH SSE41)
elseif(${SSE2_FOUND})
set(ASTC_ARCH SSE2)
else()
set(ASTC_ARCH NATIVE)
endif()
endif()
else()
include( FindAVX2 )
include( FindSSE41 )
include( FindSSE2 )
include( FindNEON )
if (${AVX2_FOUND})
set(ASTC_ARCH AVX2)
elseif(${SSE41_FOUND})
set(ASTC_ARCH SSE41)
elseif(${SSE2_FOUND})
set(ASTC_ARCH SSE2)
elseif(${NEON_FOUND})
set(ASTC_ARCH NEON)
else()
set(ASTC_ARCH NATIVE)
endif()
endif()
endif()
string(TOUPPER ${ASTC_ARCH} ASTC_ARCH)
string(TOLOWER ${ASTC_ARCH} ASTC_ARCH_LOWER)
# This is seemingly inconsistent, but the target library for SSE41 has a "." in its name
if(${ASTC_ARCH_LOWER} STREQUAL "sse41")
set(ASTC_ARCH_LOWER "sse4.1")
endif()
set(ASTCENC_ISA_${ASTC_ARCH} ON)
set(ASTCENC_CLI OFF)
set(ASTCENC_UNITTEST OFF)
set(ASTCENC_DECOMPRESSOR ON)
set(ASTCENC_UNIVERSAL_BUILD OFF)
set(ASTC_RAW_TARGET astcdec-${ASTC_ARCH_LOWER}-static)
set(ASTC_TARGET ${ASTC_RAW_TARGET} PARENT_SCOPE)
# astc
add_subdirectory(astc)
# astc doesn't have separate directories for it's source code and public interface. Additionally, it includes it's
# own copy of STB. In order to avoid conflicts, we copy the only header we need to the build directory and alter the
# INTERFACE_INCLUDE_DIRECTORIES of the target
if (NOT TARGET ${ASTC_RAW_TARGET})
message(FATAL_ERROR "Couldn't find expected ASTC library target")
endif()
get_target_property(ASTC_BINARY_DIR ${ASTC_RAW_TARGET} BINARY_DIR)
file(
COPY astc/Source/astcenc.h
DESTINATION ${ASTC_BINARY_DIR}/Include)
set_target_properties(${ASTC_RAW_TARGET} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ""
INCLUDE_DIRECTORIES ""
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${ASTC_BINARY_DIR}/Include
)
target_include_directories(${ASTC_RAW_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/astc/Source)
target_include_directories(${ASTC_RAW_TARGET} SYSTEM INTERFACE ${ASTC_BINARY_DIR}/Include)
if (MSVC)
target_compile_definitions(${ASTC_RAW_TARGET} PRIVATE _CRT_SECURE_NO_WARNINGS)
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
target_compile_options(gtest PUBLIC -Wno-deprecated-declarations)
endif ()
endif ()
set_property(TARGET ${ASTC_RAW_TARGET} PROPERTY FOLDER "ThirdParty")
if(NOT ANDROID AND NOT IOS)
if (NOT DIRECT_TO_DISPLAY)
# GLFW
option(GLFW_BUILD_DOCS OFF)
option(GLFW_BUILD_TESTS OFF)
option(GLFW_BUILD_EXAMPLES OFF)
option(GLFW_BUILD_TESTS OFF)
option(GLFW_INSTALL OFF)
option(BUILD_SHARED_LIBS ON)
if (VKB_WSI_SELECTION STREQUAL WAYLAND)
set(GLFW_BUILD_WAYLAND ON)
endif()
add_subdirectory(glfw)
if (TARGET update_mappings)
set_target_properties(update_mappings PROPERTIES FOLDER "ThirdParty")
endif()
set_property(TARGET glfw PROPERTY FOLDER "ThirdParty")
endif()
endif()
# fmt
add_subdirectory(fmt)
set_property(TARGET fmt PROPERTY FOLDER "ThirdParty")
# spdlog
set(SPDLOG_FMT_EXTERNAL ON)
add_subdirectory(spdlog)
set_property(TARGET spdlog PROPERTY FOLDER "ThirdParty")
# OpenCL
add_library(opencl INTERFACE)
set(OPENCL_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/opencl)
target_sources(opencl INTERFACE ${OPENCL_INCLUDE_DIR}/CL/opencl.h)
target_include_directories(opencl SYSTEM INTERFACE ${OPENCL_INCLUDE_DIR})
# Tracy
if (VKB_PROFILING)
set(TRACY_ENABLE ${VKB_PROFILING})
set(TRACY_TIMER_FALLBACK ON)
add_subdirectory(tracy)
add_compile_definitions(TRACY_NO_INVARIANT_CHECK=1)
set_property(TARGET TracyClient PROPERTY FOLDER "ThirdParty")
endif()