|
| 1 | +include(NuGet) |
| 2 | + |
| 3 | +function(setup_agility_sdk version) |
| 4 | + if (NOT WIN32) |
| 5 | + return() |
| 6 | + endif() |
| 7 | + |
| 8 | + if (version STREQUAL "System") |
| 9 | + set_property(GLOBAL PROPERTY OFFLOADTEST_AGILITY_SDK_SYSTEM TRUE) |
| 10 | + return() |
| 11 | + endif() |
| 12 | + |
| 13 | + guess_nuget_arch(nuget_arch) |
| 14 | + if (nuget_arch STREQUAL "x86") |
| 15 | + set(agility_arch "win32") |
| 16 | + elseif (nuget_arch STREQUAL "x64" OR nuget_arch STREQUAL "arm64") |
| 17 | + set(agility_arch "${nuget_arch}") |
| 18 | + else() |
| 19 | + message(FATAL_ERROR |
| 20 | + "The DirectX 12 Agility SDK does not support ${nuget_arch}.") |
| 21 | + endif() |
| 22 | + |
| 23 | + if (version STREQUAL "LKG") |
| 24 | + set(version "1.619.5") |
| 25 | + set(version_description "Latest Known Good (${version})") |
| 26 | + elseif (version STREQUAL "Latest") |
| 27 | + set(version_description "Latest stable") |
| 28 | + else() |
| 29 | + set(version_description "Custom (${version})") |
| 30 | + endif() |
| 31 | + |
| 32 | + message(STATUS "Fetching DirectX 12 Agility SDK ${version_description}...") |
| 33 | + download_nuget_package("Microsoft.Direct3D.D3D12" "${version}" |
| 34 | + agility_archive) |
| 35 | + |
| 36 | + set(extract_dir "${CMAKE_CURRENT_BINARY_DIR}/agility-sdk") |
| 37 | + file(REMOVE_RECURSE "${extract_dir}") |
| 38 | + file(ARCHIVE_EXTRACT |
| 39 | + INPUT "${agility_archive}" |
| 40 | + DESTINATION "${extract_dir}" |
| 41 | + PATTERNS |
| 42 | + "*.nuspec" |
| 43 | + "build/native/bin/${agility_arch}/D3D12Core.dll" |
| 44 | + "build/native/bin/${agility_arch}/d3d12SDKLayers.dll") |
| 45 | + |
| 46 | + file(GLOB nuspec_files "${extract_dir}/*.nuspec") |
| 47 | + list(LENGTH nuspec_files nuspec_count) |
| 48 | + if (NOT nuspec_count EQUAL 1) |
| 49 | + message(FATAL_ERROR |
| 50 | + "Expected one NuGet specification in the Agility SDK package, " |
| 51 | + "found ${nuspec_count}.") |
| 52 | + endif() |
| 53 | + |
| 54 | + list(GET nuspec_files 0 nuspec_file) |
| 55 | + file(READ "${nuspec_file}" nuspec) |
| 56 | + string(REGEX MATCH "<version>([^<]+)</version>" unused "${nuspec}") |
| 57 | + set(package_version "${CMAKE_MATCH_1}") |
| 58 | + if (NOT package_version MATCHES "^1\\.([0-9]+)(\\.|$)") |
| 59 | + message(FATAL_ERROR |
| 60 | + "Cannot derive D3D12SDKVersion from Agility SDK package version " |
| 61 | + "'${package_version}'.") |
| 62 | + endif() |
| 63 | + set(AGILITY_SDK_VERSION_NUMBER "${CMAKE_MATCH_1}") |
| 64 | + |
| 65 | + set(package_bin "${extract_dir}/build/native/bin/${agility_arch}") |
| 66 | + foreach(runtime_file D3D12Core.dll d3d12SDKLayers.dll) |
| 67 | + if (NOT EXISTS "${package_bin}/${runtime_file}") |
| 68 | + message(FATAL_ERROR |
| 69 | + "Agility SDK package ${package_version} does not contain " |
| 70 | + "${agility_arch}/${runtime_file}.") |
| 71 | + endif() |
| 72 | + endforeach() |
| 73 | + |
| 74 | + install(FILES |
| 75 | + "${package_bin}/D3D12Core.dll" |
| 76 | + "${package_bin}/d3d12SDKLayers.dll" |
| 77 | + DESTINATION "${LLVM_TOOLS_INSTALL_DIR}/D3D12" |
| 78 | + COMPONENT offload-tools) |
| 79 | + |
| 80 | + configure_file( |
| 81 | + "${CMAKE_CURRENT_LIST_DIR}/AgilitySDK.cpp.in" |
| 82 | + "${CMAKE_CURRENT_BINARY_DIR}/AgilitySDK.cpp" |
| 83 | + @ONLY) |
| 84 | + set_property(GLOBAL PROPERTY OFFLOADTEST_AGILITY_SDK_SOURCE |
| 85 | + "${CMAKE_CURRENT_BINARY_DIR}/AgilitySDK.cpp") |
| 86 | + set_property(GLOBAL PROPERTY OFFLOADTEST_AGILITY_SDK_BIN_DIR |
| 87 | + "${package_bin}") |
| 88 | + |
| 89 | + message(STATUS |
| 90 | + "Using DirectX 12 Agility SDK ${package_version} " |
| 91 | + "(D3D12SDKVersion ${AGILITY_SDK_VERSION_NUMBER})") |
| 92 | +endfunction() |
| 93 | + |
| 94 | +function(target_enable_agility_sdk target) |
| 95 | + get_property(agility_source GLOBAL PROPERTY OFFLOADTEST_AGILITY_SDK_SOURCE) |
| 96 | + if (agility_source) |
| 97 | + target_sources(${target} PRIVATE "${agility_source}") |
| 98 | + get_property(agility_bin_dir GLOBAL |
| 99 | + PROPERTY OFFLOADTEST_AGILITY_SDK_BIN_DIR) |
| 100 | + add_custom_command(TARGET ${target} POST_BUILD |
| 101 | + COMMAND "${CMAKE_COMMAND}" -E make_directory |
| 102 | + "$<TARGET_FILE_DIR:${target}>/D3D12" |
| 103 | + COMMAND "${CMAKE_COMMAND}" -E copy_if_different |
| 104 | + "${agility_bin_dir}/D3D12Core.dll" |
| 105 | + "$<TARGET_FILE_DIR:${target}>/D3D12/D3D12Core.dll" |
| 106 | + COMMAND "${CMAKE_COMMAND}" -E copy_if_different |
| 107 | + "${agility_bin_dir}/d3d12SDKLayers.dll" |
| 108 | + "$<TARGET_FILE_DIR:${target}>/D3D12/d3d12SDKLayers.dll" |
| 109 | + VERBATIM) |
| 110 | + else() |
| 111 | + get_property(use_system_sdk GLOBAL |
| 112 | + PROPERTY OFFLOADTEST_AGILITY_SDK_SYSTEM) |
| 113 | + if (use_system_sdk) |
| 114 | + add_custom_command(TARGET ${target} POST_BUILD |
| 115 | + COMMAND "${CMAKE_COMMAND}" -E remove_directory |
| 116 | + "$<TARGET_FILE_DIR:${target}>/D3D12" |
| 117 | + VERBATIM) |
| 118 | + endif() |
| 119 | + endif() |
| 120 | +endfunction() |
| 121 | + |
| 122 | +set(AGILITY_SDK_VERSION "LKG" CACHE STRING |
| 123 | + "DirectX 12 Agility SDK version (LKG, System, Latest, or a NuGet version)") |
| 124 | +set_property(CACHE AGILITY_SDK_VERSION PROPERTY STRINGS LKG System Latest) |
| 125 | +setup_agility_sdk("${AGILITY_SDK_VERSION}") |
0 commit comments