cmake_minimum_required (VERSION 3.18)
project (vksc_samples)

message("Current platform: ${CMAKE_SYSTEM_PROCESSOR}")

option(HOST_BUILD "Enable host build(<binary name>_host will be generated)" OFF)

if (NOT HOST_BUILD)
    # Select the build platform is host or target
    if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
        message("Using cross compile")
        set(CROSS_COMPILE "ON")
    elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
        message("Using target build")
        # PDK_ROOT is set in toolchain cmake file when using cross-compile,
        # but if build on target, no toolchain cmake file needs to be specified,
        # so just set the PDK_ROOT here.
        set(PDK_ROOT "${CMAKE_SOURCE_DIR}/../../..")
        set(TARGET_OS "Linux")
    endif()

    if (NOT HOST_BUILD AND NOT PDK_ROOT)
        message(FATAL_ERROR "PDK_ROOT is not specified!")
    endif()

    # Set the pdk source root [pdk/drive-linux or pdk/drive-qnx]
    if (TARGET_OS STREQUAL "Linux")
        set(PDK_SOURCE_ROOT "${PDK_ROOT}/drive-linux")
    elseif (TARGET_OS STREQUAL "QNX")
        set(PDK_SOURCE_ROOT "${PDK_ROOT}/drive-qnx")
        # For QNX, also need to add bsp libs into the searching path
        set(TARGET_LIB_PATH "${PDK_SOURCE_ROOT}/nvidia-bsp/aarch64le/usr/lib")
    else()
        message(FATAL_ERROR "Only Linux and QNX are supported!")
    endif()

    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

    set(VULKAN_HEADER_PATH "${PDK_SOURCE_ROOT}/include")
    set(VULKANSC_HEADER_PATH "${PDK_SOURCE_ROOT}/include/VulkanSC")
    set(NVSCI_HEADER_PATH "${PDK_SOURCE_ROOT}/include")

    list(APPEND TARGET_LIB_PATH "${PDK_SOURCE_ROOT}/lib-target")

    message("Vulkan header DIR: ${VULKAN_HEADER_PATH}")
    message("VulkanSC header DIR: ${VULKANSC_HEADER_PATH}")
    message("NvSci header DIR: ${VULKANSC_HEADER_PATH}")
endif()

set(EXTERNAL_LIBS_PATH "${CMAKE_SOURCE_DIR}/external")
set(EXTERNAL_HEADERS_PATH "${CMAKE_SOURCE_DIR}/external" "${CMAKE_SOURCE_DIR}/external/ktx/include")
set(COMMON_HEADERS_PATH "${CMAKE_SOURCE_DIR}/common")
set(OUTPUT_BINARY_DIR "${CMAKE_BINARY_DIR}/bin")


if (HOST_BUILD)
    # Build target on host, so user can run the binary on host to generate the
    # json file. In this build path, we won't build VulkanSC binary, as cmake
    # doesn't support switching toolchain in one CMakeLists file.
    # run cmake with `-DHOST_BUILD` to enable host build

    find_package(PkgConfig)
    pkg_check_modules(PKG_VULKAN REQUIRED vulkan)

    find_path(VULKAN_HEADER_PATH  NAMES vulkan.h HINTS ${PKG_VULKAN_INCLUDEDIR} ${PKG_VULKAN_INCLUDEDIR}/vulkan REQUIRED)
    find_path(VULKAN_LIB_PATH  NAMES libvulkan.so HINTS ${PKG_VULKAN_LIBRARY_DIRS} REQUIRED)
elseif (CROSS_COMPILE)
    # Build vk_01tri on target platform, so user can run the binary
    # on target to generate the json file.

    set(VULKAN_LIB_PATH "${TARGET_LIB_PATH}")
    message("Vulkan lib DIR: ${VULKAN_LIB_PATH}")

    # vulkansc driver lib should be in the same dir with vulkan lib
    set(VULKANSC_LIB_PATH "${TARGET_LIB_PATH}")
    message("VulkanSC lib DIR: ${VULKAN_LIB_PATH}")
else()
    # For target build, need to override header path and lib path
    # TODO: No vulkan headers packaged to target_rootfs
    set(VULKAN_HEADER_PATH "/usr/include")
    message("Vulkan header DIR: ${VULKAN_HEADER_PATH}")

    set(VULKANSC_HEADER_PATH "/usr/include/VulkanSC")
    message("VulkanSC header DIR: ${VULKANSC_HEADER_PATH}")

    set(TARGET_LIB_PATH "/usr/lib/aarch64-linux-gnu;/usr/lib;/usr/lib/aarch64-linux-gnu/tegra")
    set(VULKAN_LIB_PATH "${TARGET_LIB_PATH}")
    message("Vulkan lib DIR: ${VULKAN_LIB_PATH}")

    # vulkansc driver lib should be in the same dir with vulkan lib
    set(VULKANSC_LIB_PATH "${TARGET_LIB_PATH}")
    message("VulkanSC lib DIR: ${VULKANSC_LIB_PATH}")
endif()

if (NOT TARGET_OS STREQUAL "QNX")
    # Search for vulkan loader library libvulkan.so, but we don't need vulkan loader on QNX
    # as we don't support json generation layer on QNX target
    find_library(VULKAN_LIB NAMES libvulkan.so libvulkan.so.1 HINTS ${VULKAN_LIB_PATH} REQUIRED)
endif()


# We don't build VulkanSC binary for host build.
if (NOT HOST_BUILD)
    find_library(OPENWFD_LIBS NAMES libtegrawfd.so HINTS ${TARGET_LIB_PATH} REQUIRED)
    find_package(VulkanSCLibs)
endif()

file(COPY "data" DESTINATION ${OUTPUT_BINARY_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_BINARY_DIR})

# Vulkan SC driver, NvSci and OpenWFD has lots of dependencies, in cross-compile, gcc nneds to
# resolve those symbols, add this flag to defer the resolution during run-time, so we don't need
# to add all those libraries here in the cmake file.
set (CMAKE_EXE_LINKER_FLAGS "-Wl,-unresolved-symbols=ignore-in-shared-libs")
add_subdirectory(vksc_01tri)
add_subdirectory(vulkanscinfo)
add_subdirectory(computeparticles)
