cmake_minimum_required(VERSION 3.20)

project(mxl_multiviewer LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

option(
    MXL_MULTIVIEWER_ENABLE_MXL_SDK
    "Enable real MXL SDK integration"
    OFF
)

find_package(PkgConfig REQUIRED)
find_package(Vulkan REQUIRED)

pkg_check_modules(SDL3 REQUIRED sdl3)

add_executable(mxl_multiviewer
    main.cpp
    imgui/imgui.cpp
    imgui/imgui_draw.cpp
    imgui/imgui_tables.cpp
    imgui/imgui_widgets.cpp
    imgui/backends/imgui_impl_sdl3.cpp
    imgui/backends/imgui_impl_vulkan.cpp
    AppConfig.cpp
    FeedCreate.cpp
    FeedTexture.cpp
    NoSignalFeed.cpp
    MxlFeed.cpp
    MxlInstanceCache.cpp
    MxlSdkFeed.cpp
    SmpteBarsFeed.cpp
    TileLayout.cpp
    VulkanContext.cpp
    VulkanUtils.cpp
    Swapchain.cpp
    RenderPipeline.cpp
    V210ComputeDecoder.cpp
)

target_include_directories(mxl_multiviewer PRIVATE
    ${SDL3_INCLUDE_DIRS}
    ${CMAKE_SOURCE_DIR}/imgui
    ${CMAKE_SOURCE_DIR}/imgui/backends
)

set_source_files_properties(
    imgui/imgui.cpp
    imgui/imgui_draw.cpp
    imgui/imgui_tables.cpp
    imgui/imgui_widgets.cpp
    imgui/backends/imgui_impl_sdl3.cpp
    imgui/backends/imgui_impl_vulkan.cpp
    PROPERTIES COMPILE_OPTIONS "-w"
)

target_link_libraries(mxl_multiviewer PRIVATE
    ${SDL3_LIBRARIES}
)

target_compile_options(mxl_multiviewer PRIVATE
    -Wall
    -Wextra
    -Wpedantic
)

target_compile_definitions(mxl_multiviewer PRIVATE
    MXL_MULTIVIEWER_ENABLE_MXL_SDK=$<BOOL:${MXL_MULTIVIEWER_ENABLE_MXL_SDK}>
)

if(MXL_MULTIVIEWER_ENABLE_MXL_SDK)
    set(MXL_SDK_ROOT "" CACHE PATH "Path to MXL SDK root directory")

    if(NOT MXL_SDK_ROOT)
        message(FATAL_ERROR "MXL_SDK_ROOT must be set when MXL_MULTIVIEWER_ENABLE_MXL_SDK is ON")
    endif()

    target_include_directories(mxl_multiviewer PRIVATE
        ${MXL_SDK_ROOT}/lib/include
        ${MXL_SDK_ROOT}/build/Linux-Clang-Release/lib/include
    )

    target_link_directories(mxl_multiviewer PRIVATE
        ${MXL_SDK_ROOT}/build/Linux-Clang-Release/lib
        ${MXL_SDK_ROOT}/build/Linux-Clang-Release/lib/internal
    )

    target_link_libraries(mxl_multiviewer PRIVATE
        mxl
        mxl-common
    )
endif()

target_link_libraries(mxl_multiviewer PRIVATE
    ${SDL3_LIBRARIES}
    Vulkan::Vulkan
)

# v210 conversion test
add_executable(v210_test v210_test.cpp)
target_include_directories(v210_test PRIVATE ${CMAKE_SOURCE_DIR})

# Compile compute shader
add_custom_command(
    OUTPUT ${CMAKE_SOURCE_DIR}/shaders/bin/v210_decode.comp.spv
    COMMAND glslangValidator -V
        ${CMAKE_SOURCE_DIR}/shaders/v210_decode.comp
        -o ${CMAKE_SOURCE_DIR}/shaders/bin/v210_decode.comp.spv
    DEPENDS ${CMAKE_SOURCE_DIR}/shaders/v210_decode.comp
    COMMENT "Compiling v210_decode.comp to SPIR-V"
)
