cmake_minimum_required(VERSION 3.28)
project(LoStreamlineFgContracts LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
enable_testing()
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../optiscaler" optiscaler-loader)
if(MSVC)
    add_compile_options(/utf-8)
endif()
add_executable(LoStreamlineFgSessionContractTest session_contract_test.cpp)
add_executable(LoStreamlineFgSrInputsRegression ../temporal_frame_inputs_test.cpp)
target_include_directories(LoStreamlineFgSrInputsRegression PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../../LostOdysseyRecomp")
target_include_directories(LoStreamlineFgSessionContractTest PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../../LostOdysseyRecomp")
set_target_properties(LoStreamlineFgSessionContractTest LoStreamlineFgSrInputsRegression PROPERTIES CXX_SCAN_FOR_MODULES OFF)
add_test(NAME streamline_game_session_contract COMMAND LoStreamlineFgSessionContractTest)
add_test(NAME streamline_sr_inputs_regression COMMAND LoStreamlineFgSrInputsRegression)
# Affected P0/P4 policies plus the existing P1 ownership/plan baseline.
function(lo_fg_cpu_contract target source test_name)
    add_executable(${target} ${source} ${ARGN})
    target_include_directories(${target} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../../LostOdysseyRecomp")
    set_target_properties(${target} PROPERTIES CXX_SCAN_FOR_MODULES OFF)
    add_test(NAME ${test_name} COMMAND ${target})
endfunction()
lo_fg_cpu_contract(LoFgRuntimePolicyTest runtime_policy_test.cpp streamline_runtime_recovery)
lo_fg_cpu_contract(LoVulkanFgSelectionTest vulkan_selection_test.cpp vulkan_fg_selection)
target_compile_definitions(LoVulkanFgSelectionTest PRIVATE LO_ENABLE_STREAMLINE_FG=1)
lo_fg_cpu_contract(LoVulkanFsrSelectionTest vulkan_selection_test.cpp vulkan_fsr_selection)
target_compile_definitions(LoVulkanFsrSelectionTest PRIVATE LO_ENABLE_VULKAN_FSR_FG=1)
lo_fg_cpu_contract(LoVulkanAllFgSelectionTest vulkan_selection_test.cpp vulkan_all_fg_selection)
target_compile_definitions(LoVulkanAllFgSelectionTest PRIVATE LO_ENABLE_VULKAN_FSR_FG=1 LO_ENABLE_STREAMLINE_FG=1)
lo_fg_cpu_contract(LoMetalFxFgPolicyTest metalfx_policy_test.cpp metalfx_fg_policy)
target_compile_definitions(LoMetalFxFgPolicyTest PRIVATE LO_ENABLE_METALFX_FG=1)
lo_fg_cpu_contract(LoFsrQueuePlanTest fsr_queue_plan_test.cpp fsr_vulkan_queue_reservation)
lo_fg_cpu_contract(LoVulkanFgUncompiledTest vulkan_selection_test.cpp vulkan_fg_uncompiled)
lo_fg_cpu_contract(LoDrawAttachmentPolicyTest draw_attachment_policy_test.cpp draw_attachment_policy)
add_executable(LoVulkanObjectTraceTest vulkan_object_trace_test.cpp)
target_include_directories(LoVulkanObjectTraceTest PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../../LostOdysseyRecomp")
set_target_properties(LoVulkanObjectTraceTest PROPERTIES CXX_SCAN_FOR_MODULES OFF)
foreach(mode IN ITEMS disabled enabled)
    add_test(NAME vulkan_object_trace_${mode} COMMAND LoVulkanObjectTraceTest ${mode})
endforeach()
set_tests_properties(vulkan_object_trace_disabled PROPERTIES ENVIRONMENT "LO_VK_OBJECT_TRACE=0")
set_tests_properties(vulkan_object_trace_enabled PROPERTIES ENVIRONMENT "LO_VK_OBJECT_TRACE=1")
lo_fg_cpu_contract(LoFgHostUseTest host_use_test.cpp streamline_host_input_use)
lo_fg_cpu_contract(LoFgStatusPhaseTest frame_generation_status_test.cpp fg_status_phase)
lo_fg_cpu_contract(LoFgContinuityPolicyTest continuity_policy_test.cpp streamline_continuity_policy)
lo_fg_cpu_contract(LoFgP1OwnershipRegression ../temporal_upscaler_contract_test.cpp streamline_p1_ownership)
lo_fg_cpu_contract(LoFgP1PlanRegression ../frame_plan_test.cpp streamline_p1_plan
    "${CMAKE_CURRENT_SOURCE_DIR}/../../../LostOdysseyRecomp/gpu/upscaling_plan.cpp")
lo_fg_cpu_contract(LoFgSrLifetimeRegression ../native_dlss_submission_lifetime_test.cpp streamline_sr_lifetime)
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../settings_menu" menu-contracts)

# Desktop IPC contracts use a fake Discord server; no game data or client.
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../discord_rpc" discord-contracts)
