include_guard(GLOBAL) function(Renderive_render_3D_datoviz_stage_test_resources runtime_dir) file(MAKE_DIRECTORY "${runtime_dir}/build" "${Renderive_render_3D_datoviz_test_spirv_dir}") # The source tree owns every runtime resource. A clean build directory is repopulated here. file(COPY "${Renderive_render_3D_datoviz_root}/spec" DESTINATION "${runtime_dir}") file(COPY "${Renderive_render_3D_datoviz_root}/data/assets/fonts" DESTINATION "${runtime_dir}/data/assets") file(COPY "${Renderive_render_3D_datoviz_external_dir}/cimgui/imgui/misc/fonts" DESTINATION "${runtime_dir}/external/cimgui/imgui/misc") # DRP2 emits LF. Normalize only the generated runtime copies so exact snapshots do not depend # on the checkout's Windows EOL mode; the source fixtures remain untouched. file(GLOB_RECURSE Renderive_render_3D_datoviz_test_json_fixtures LIST_DIRECTORIES false "${runtime_dir}/spec/*.json") foreach(Renderive_render_3D_datoviz_test_json_fixture IN LISTS Renderive_render_3D_datoviz_test_json_fixtures) file(READ "${Renderive_render_3D_datoviz_test_json_fixture}" Renderive_render_3D_datoviz_test_json_content) file(CONFIGURE OUTPUT "${Renderive_render_3D_datoviz_test_json_fixture}" CONTENT "${Renderive_render_3D_datoviz_test_json_content}" @ONLY NEWLINE_STYLE UNIX) endforeach() endfunction() function(Renderive_render_3D_datoviz_add_test_runner target source_var component timeout) set(Renderive_render_3D_datoviz_test_runner_sources ${${source_var}}) if(NOT component STREQUAL "NONE") list(APPEND Renderive_render_3D_datoviz_test_runner_sources "${Renderive_render_3D_datoviz_testing_dir}/components/${component}.c") endif() add_executable(${target} ${Renderive_render_3D_datoviz_test_runner_sources}) target_include_directories(${target} PRIVATE "${Renderive_render_3D_datoviz_include_dir}" "${Renderive_render_3D_datoviz_testing_dir}" "${Renderive_render_3D_datoviz_src_dir}/common" "${Renderive_render_3D_datoviz_src_dir}/scene/tests" "${Renderive_render_3D_datoviz_src_dir}/vk/tests" "${Renderive_render_3D_datoviz_src_dir}/vklite" "${Vulkan_INCLUDE_DIR}/vulkan" "${Renderive_render_3D_datoviz_external_dir}") target_compile_definitions(${target} PRIVATE DVZ_HAS_GLFW=0 "DVZ_TEST_SPIRV_DIR=\"${Renderive_render_3D_datoviz_test_spirv_dir}\"") target_link_libraries(${target} PRIVATE ${ARGN} Renderive_render_3D_datoviz_testing ${Renderive_render_3D_datoviz_thread_target}) if(Renderive_render_3D_datoviz_msvc_system_library_dirs) target_link_directories(${target} PRIVATE ${Renderive_render_3D_datoviz_msvc_system_library_dirs}) endif() if(MSVC) target_link_options(${target} PRIVATE /STACK:8388608) endif() Renderive_render_3D_datoviz_configure_target(${target}) set_target_properties(${target} PROPERTIES LINKER_LANGUAGE CXX FOLDER Renderive_render_3D/datoviz/tests) add_test(NAME ${target} COMMAND ${target}) set_tests_properties(${target} PROPERTIES LABELS datoviz TIMEOUT ${timeout} WORKING_DIRECTORY "${Renderive_render_3D_datoviz_test_runtime_dir}") endfunction() function(Renderive_render_3D_datoviz_add_tests) set(Renderive_render_3D_datoviz_testing_dir "${Renderive_render_3D_datoviz_root}/testing") set(Renderive_render_3D_datoviz_test_runtime_dir "${CMAKE_CURRENT_BINARY_DIR}/testing/runtime") set(Renderive_render_3D_datoviz_test_spirv_dir "${CMAKE_CURRENT_BINARY_DIR}/testing/spirv") Renderive_render_3D_datoviz_stage_test_resources( "${Renderive_render_3D_datoviz_test_runtime_dir}") file(GLOB Renderive_render_3D_datoviz_test_shaders CONFIGURE_DEPENDS "${Renderive_render_3D_datoviz_src_dir}/vklite/tests/shaders/*.vert" "${Renderive_render_3D_datoviz_src_dir}/vklite/tests/shaders/*.frag" "${Renderive_render_3D_datoviz_src_dir}/vklite/tests/shaders/*.comp") if(Vulkan_GLSLC_EXECUTABLE) set(Renderive_render_3D_datoviz_glslc "${Vulkan_GLSLC_EXECUTABLE}") else() find_program(Renderive_render_3D_datoviz_glslc NAMES glslc HINTS "$ENV{VULKAN_SDK}/Bin" "$ENV{VULKAN_SDK}/bin") endif() if(NOT Renderive_render_3D_datoviz_glslc) message(FATAL_ERROR "glslc is required to build the Datoviz vklite tests") endif() set(Renderive_render_3D_datoviz_test_spirv_outputs) foreach(Renderive_render_3D_datoviz_test_shader IN LISTS Renderive_render_3D_datoviz_test_shaders) get_filename_component(Renderive_render_3D_datoviz_test_shader_name "${Renderive_render_3D_datoviz_test_shader}" NAME) get_filename_component(Renderive_render_3D_datoviz_test_shader_extension "${Renderive_render_3D_datoviz_test_shader}" EXT) set(Renderive_render_3D_datoviz_test_spirv "${Renderive_render_3D_datoviz_test_spirv_dir}/${Renderive_render_3D_datoviz_test_shader_name}.spv") set(Renderive_render_3D_datoviz_test_shader_args) if(Renderive_render_3D_datoviz_test_shader_extension STREQUAL ".comp") list(APPEND Renderive_render_3D_datoviz_test_shader_args --target-env=vulkan1.3 --target-spv=spv1.6) endif() add_custom_command( OUTPUT "${Renderive_render_3D_datoviz_test_spirv}" COMMAND "${Renderive_render_3D_datoviz_glslc}" ${Renderive_render_3D_datoviz_test_shader_args} -o "${Renderive_render_3D_datoviz_test_spirv}" "${Renderive_render_3D_datoviz_test_shader}" DEPENDS "${Renderive_render_3D_datoviz_test_shader}" COMMENT "Compiling Datoviz test shader ${Renderive_render_3D_datoviz_test_shader_name}" VERBATIM) list(APPEND Renderive_render_3D_datoviz_test_spirv_outputs "${Renderive_render_3D_datoviz_test_spirv}") endforeach() add_custom_target(Renderive_render_3D_datoviz_test_shaders DEPENDS ${Renderive_render_3D_datoviz_test_spirv_outputs}) set_target_properties(Renderive_render_3D_datoviz_test_shaders PROPERTIES FOLDER Renderive_render_3D/datoviz/tests) add_library(Renderive_render_3D_datoviz_testing STATIC "${Renderive_render_3D_datoviz_testing_dir}/testing.cpp" "${Renderive_render_3D_datoviz_testing_dir}/datoviz_testing.c") target_include_directories(Renderive_render_3D_datoviz_testing PUBLIC "${Renderive_render_3D_datoviz_testing_dir}" PRIVATE "${Renderive_render_3D_datoviz_src_dir}/common") target_link_libraries(Renderive_render_3D_datoviz_testing PRIVATE Renderive_render_3D_datoviz_common) Renderive_render_3D_datoviz_configure_target(Renderive_render_3D_datoviz_testing) set_target_properties(Renderive_render_3D_datoviz_testing PROPERTIES FOLDER Renderive_render_3D/datoviz/tests) set(Renderive_render_3D_datoviz_msvc_system_library_dirs) if(MSVC) if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(Renderive_render_3D_datoviz_msvc_library_arch x64) else() set(Renderive_render_3D_datoviz_msvc_library_arch x86) endif() get_filename_component(Renderive_render_3D_datoviz_windows_sdk_include_dir "${Renderive_render_3D_datoviz_windows_sdk_include_root}" DIRECTORY) get_filename_component(Renderive_render_3D_datoviz_windows_kits_dir "${Renderive_render_3D_datoviz_windows_sdk_include_dir}" DIRECTORY) get_filename_component(Renderive_render_3D_datoviz_windows_sdk_version "${Renderive_render_3D_datoviz_windows_sdk_include_root}" NAME) list(APPEND Renderive_render_3D_datoviz_msvc_system_library_dirs "${Renderive_render_3D_datoviz_msvc_tools_dir}/lib/${Renderive_render_3D_datoviz_msvc_library_arch}" "${Renderive_render_3D_datoviz_windows_kits_dir}/Lib/${Renderive_render_3D_datoviz_windows_sdk_version}/ucrt/${Renderive_render_3D_datoviz_msvc_library_arch}" "${Renderive_render_3D_datoviz_windows_kits_dir}/Lib/${Renderive_render_3D_datoviz_windows_sdk_version}/um/${Renderive_render_3D_datoviz_msvc_library_arch}") endif() foreach(Renderive_render_3D_datoviz_test_module IN ITEMS common fileio geom math thread input controller drp2 scene) file(GLOB_RECURSE Renderive_render_3D_datoviz_${Renderive_render_3D_datoviz_test_module}_test_sources CONFIGURE_DEPENDS "${Renderive_render_3D_datoviz_src_dir}/${Renderive_render_3D_datoviz_test_module}/tests/*.c" "${Renderive_render_3D_datoviz_src_dir}/${Renderive_render_3D_datoviz_test_module}/tests/*.cc" "${Renderive_render_3D_datoviz_src_dir}/${Renderive_render_3D_datoviz_test_module}/tests/*.cpp" "${Renderive_render_3D_datoviz_src_dir}/${Renderive_render_3D_datoviz_test_module}/tests/*.cxx") endforeach() file(GLOB_RECURSE Renderive_render_3D_datoviz_vk_test_sources CONFIGURE_DEPENDS "${Renderive_render_3D_datoviz_src_dir}/vk/tests/*.c*" "${Renderive_render_3D_datoviz_src_dir}/vklite/tests/*.c*") list(FILTER Renderive_render_3D_datoviz_vk_test_sources EXCLUDE REGEX "/src/vk/tests/test_cuda\\.cu$") list(FILTER Renderive_render_3D_datoviz_vk_test_sources EXCLUDE REGEX "/src/vklite/tests/test_(present|vklite)\\.c.*$") list(FILTER Renderive_render_3D_datoviz_scene_test_sources EXCLUDE REGEX "/src/scene/tests/(app|frame_plan_emit|test_scene)\\.c$") set(Renderive_render_3D_datoviz_core_test_sources ${Renderive_render_3D_datoviz_common_test_sources} ${Renderive_render_3D_datoviz_fileio_test_sources} ${Renderive_render_3D_datoviz_geom_test_sources} ${Renderive_render_3D_datoviz_math_test_sources} ${Renderive_render_3D_datoviz_thread_test_sources}) set(Renderive_render_3D_datoviz_scheduler_test_sources "${Renderive_render_3D_datoviz_testing_dir}/dvztest_scheduler.c") Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_scheduler Renderive_render_3D_datoviz_scheduler_test_sources NONE 120 Renderive_render_3D_datoviz_common) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_common Renderive_render_3D_datoviz_common_test_sources dvztest_common 120 Renderive_render_3D_datoviz_common) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_fileio Renderive_render_3D_datoviz_fileio_test_sources dvztest_fileio 120 Renderive_render_3D_datoviz_common Renderive_render_3D_datoviz_fileio) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_geom Renderive_render_3D_datoviz_geom_test_sources dvztest_geom 120 Renderive_render_3D_datoviz_common Renderive_render_3D_datoviz_geom Renderive_render_3D_datoviz_math) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_math Renderive_render_3D_datoviz_math_test_sources dvztest_math 120 Renderive_render_3D_datoviz_common Renderive_render_3D_datoviz_math) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_thread Renderive_render_3D_datoviz_thread_test_sources dvztest_thread 120 Renderive_render_3D_datoviz_common Renderive_render_3D_datoviz_thread) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_input Renderive_render_3D_datoviz_input_test_sources dvztest_input 120 Renderive_render_3D_datoviz_common Renderive_render_3D_datoviz_input) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_core Renderive_render_3D_datoviz_core_test_sources dvztest_core 180 Renderive_render_3D_datoviz_common Renderive_render_3D_datoviz_fileio Renderive_render_3D_datoviz_geom Renderive_render_3D_datoviz_math Renderive_render_3D_datoviz_thread) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_controller Renderive_render_3D_datoviz_controller_test_sources dvztest_controller 120 Renderive_render_3D_datoviz_common Renderive_render_3D_datoviz_math Renderive_render_3D_datoviz_input Renderive_render_3D_datoviz_controller) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_drp2 Renderive_render_3D_datoviz_drp2_test_sources dvztest_drp2 300 Renderive_render_3D_datoviz_common Renderive_render_3D_datoviz_vk Renderive_render_3D_datoviz_vklite Renderive_render_3D_datoviz_drp2) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_scene Renderive_render_3D_datoviz_scene_test_sources dvztest_scene_core 600 Renderive_render_3D_datoviz_common Renderive_render_3D_datoviz_fileio Renderive_render_3D_datoviz_geom Renderive_render_3D_datoviz_math Renderive_render_3D_datoviz_thread Renderive_render_3D_datoviz_input Renderive_render_3D_datoviz_controller Renderive_render_3D_datoviz_vk Renderive_render_3D_datoviz_vklite Renderive_render_3D_datoviz_drp2 Renderive_render_3D_datoviz_scene) Renderive_render_3D_datoviz_add_test_runner( Renderive_render_3D_datoviz_test_vk Renderive_render_3D_datoviz_vk_test_sources dvztest_vk 600 Renderive_render_3D_datoviz_common Renderive_render_3D_datoviz_fileio Renderive_render_3D_datoviz_geom Renderive_render_3D_datoviz_math Renderive_render_3D_datoviz_thread Renderive_render_3D_datoviz_vk Renderive_render_3D_datoviz_vklite) add_dependencies(Renderive_render_3D_datoviz_test_vk Renderive_render_3D_datoviz_test_shaders) set(Renderive_render_3D_datoviz_test_targets Renderive_render_3D_datoviz_test_scheduler Renderive_render_3D_datoviz_test_common Renderive_render_3D_datoviz_test_fileio Renderive_render_3D_datoviz_test_geom Renderive_render_3D_datoviz_test_math Renderive_render_3D_datoviz_test_thread Renderive_render_3D_datoviz_test_input Renderive_render_3D_datoviz_test_core Renderive_render_3D_datoviz_test_controller Renderive_render_3D_datoviz_test_drp2 Renderive_render_3D_datoviz_test_scene Renderive_render_3D_datoviz_test_vk) add_custom_target(Renderive_render_3D_datoviz_tests DEPENDS ${Renderive_render_3D_datoviz_test_targets}) set_target_properties(Renderive_render_3D_datoviz_tests PROPERTIES FOLDER Renderive_render_3D/datoviz/tests) find_program(Renderive_render_3D_datoviz_powershell NAMES pwsh powershell REQUIRED) add_custom_target(Renderive_render_3D_datoviz_run_tests COMMAND "${Renderive_render_3D_datoviz_powershell}" -NoProfile -ExecutionPolicy Bypass -File "${Renderive_render_3D_datoviz_root}/../env.ps1" -DatovizBuildDirectory "${CMAKE_BINARY_DIR}" -CTestExecutable "${CMAKE_CTEST_COMMAND}" DEPENDS Renderive_render_3D_datoviz_tests USES_TERMINAL VERBATIM) set_target_properties(Renderive_render_3D_datoviz_run_tests PROPERTIES FOLDER Renderive_render_3D/datoviz/tests) endfunction()