find_package(Python3 REQUIRED COMPONENTS Interpreter)

set(KAT_SLANG_SHADERS_DIR "" CACHE PATH
    "Path to a local libretro slang-shaders checkout")
if(NOT KAT_SLANG_SHADERS_DIR AND EXISTS "/home/brian/projects/slang-shaders")
    set(KAT_SLANG_SHADERS_DIR "/home/brian/projects/slang-shaders" CACHE PATH
        "Path to a local libretro slang-shaders checkout" FORCE)
endif()

set(KAT_CRT_GUEST_ADVANCED_DIR "" CACHE PATH
    "Optional path to a pinned CRT-Guest-Advanced release tree")

find_program(KAT_GLSL_TO_SPIRV NAMES glslc glslangValidator)
find_program(KAT_SHADERCROSS_CLI NAMES shadercross SDL_shadercross)
find_program(KAT_SPIRV_CROSS_CLI NAMES spirv-cross)

if(NOT EXISTS "${KAT_SLANG_SHADERS_DIR}")
    message(FATAL_ERROR
        "KAT_REBUILD_SHADER_BUNDLES requires KAT_SLANG_SHADERS_DIR to point "
        "at a slang-shaders checkout")
endif()

if(NOT KAT_GLSL_TO_SPIRV)
    message(FATAL_ERROR
        "KAT_REBUILD_SHADER_BUNDLES requires glslc or glslangValidator")
endif()

if(NOT KAT_SHADERCROSS_CLI)
    message(FATAL_ERROR
        "KAT_REBUILD_SHADER_BUNDLES requires the SDL_shadercross CLI")
endif()

if(NOT KAT_SPIRV_CROSS_CLI)
    message(FATAL_ERROR
        "KAT_REBUILD_SHADER_BUNDLES requires spirv-cross for reflected "
        "uniform and push-constant offsets")
endif()

set(KAT_SHADER_BUNDLE_REBUILD_ARGS
    --slang-shaders-dir ${KAT_SLANG_SHADERS_DIR}
    --output-dir ${CMAKE_SOURCE_DIR}/resources/shaders/bundles
    --fixture-output-dir ${CMAKE_SOURCE_DIR}/tests/shader_bundles
    --work-dir ${CMAKE_BINARY_DIR}/shader_bundle_work
    --repo-root ${CMAKE_SOURCE_DIR}
    --glsl-to-spirv ${KAT_GLSL_TO_SPIRV}
    --shadercross ${KAT_SHADERCROSS_CLI}
    --spirv-cross ${KAT_SPIRV_CROSS_CLI})

if(KAT_CRT_GUEST_ADVANCED_DIR)
    list(APPEND KAT_SHADER_BUNDLE_REBUILD_ARGS
        --crt-guest-advanced-dir ${KAT_CRT_GUEST_ADVANCED_DIR})
endif()

add_custom_target(kat_rebuild_shader_bundles
    COMMAND ${Python3_EXECUTABLE}
            ${CMAKE_CURRENT_SOURCE_DIR}/rebuild_shader_bundles.py
            ${KAT_SHADER_BUNDLE_REBUILD_ARGS}
    VERBATIM
    COMMENT "Rebuilding committed SDL GPU shader bundles")
