380 строки
13 KiB
CMake
380 строки
13 KiB
CMake
cmake_minimum_required(VERSION 3.19)
|
|
project(dxdispatch VERSION 0.18.1 LANGUAGES CXX)
|
|
|
|
# ==============================================================================
|
|
# External Libraries/Helpers
|
|
# ==============================================================================
|
|
|
|
if(POLICY CMP0135)
|
|
cmake_policy(SET CMP0135 NEW)
|
|
endif()
|
|
|
|
include(FetchContent)
|
|
include(cmake/helper_platform.cmake)
|
|
|
|
if(NOT TARGET_XBOX)
|
|
# Statically link runtime library to avoid runtime dependency on Visual C++ redistributable.
|
|
# On Xbox we deploy these dependencies for now.
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$<CONFIG:Debug>:Debug>)
|
|
endif()
|
|
|
|
if(TARGET_WSL)
|
|
set(CMAKE_SKIP_BUILD_RPATH FALSE)
|
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
|
set(CMAKE_INSTALL_RPATH "$\{ORIGIN\}")
|
|
endif()
|
|
|
|
include(cmake/gsl.cmake)
|
|
include(cmake/rapidjson.cmake)
|
|
include(cmake/flatbuffer.cmake)
|
|
include(cmake/fmt.cmake)
|
|
include(cmake/wil.cmake)
|
|
include(cmake/cxxopts.cmake)
|
|
|
|
if(NOT TARGET_XBOX)
|
|
include(cmake/gtest.cmake)
|
|
endif()
|
|
|
|
include(cmake/wil.cmake)
|
|
add_wil_target(wil CACHE_PREFIX DXD)
|
|
|
|
include(cmake/gdk.cmake)
|
|
add_gdk_target(gdk CACHE_PREFIX DXD)
|
|
get_target_property(gdk_dxcompiler_path gdk DX_COMPILER_PATH)
|
|
|
|
include(cmake/pix.cmake)
|
|
add_pix_target(pix CACHE_PREFIX DXD)
|
|
|
|
include(cmake/dxcompiler.cmake)
|
|
add_dxcompiler_target(dxcompiler CACHE_PREFIX DXD GDK_DXCOMPILER_PATH ${gdk_dxcompiler_path})
|
|
get_target_property(dxcompiler_type dxcompiler DX_COMPONENT_CONFIG)
|
|
|
|
include(cmake/d3d12.cmake)
|
|
add_d3d12_target(d3d12 CACHE_PREFIX DXD)
|
|
|
|
include(cmake/directml.cmake)
|
|
add_directml_target(directml CACHE_PREFIX DXD)
|
|
|
|
include(cmake/onnxruntime.cmake)
|
|
add_onnxruntime_target(onnxruntime CACHE_PREFIX DXD)
|
|
get_target_property(onnxruntime_type onnxruntime DX_COMPONENT_CONFIG)
|
|
|
|
include(cmake/onnxruntime_extensions.cmake)
|
|
add_onnxruntime_extensions_target(onnxruntime_extensions CACHE_PREFIX DXD)
|
|
|
|
# ==============================================================================
|
|
# Global Defines for CMAKE
|
|
# ==============================================================================
|
|
if(MSVC)
|
|
add_compile_options(/guard:cf /Qspectre /GS /sdl /W3 )
|
|
if( TARGET_ARCH STREQUAL ARM64 OR
|
|
TARGET_ARCH STREQUAL ARM)
|
|
add_link_options(/GUARD:CF /DYNAMICBASE)
|
|
else()
|
|
add_link_options(/GUARD:CF /DYNAMICBASE /CETCOMPAT)
|
|
endif()
|
|
endif()
|
|
|
|
# ==============================================================================
|
|
# Model Library
|
|
# ==============================================================================
|
|
add_library(
|
|
model STATIC
|
|
src/model/JsonParsers.cpp
|
|
src/model/JsonParsers.h
|
|
src/model/Model.cpp
|
|
src/model/Model.h
|
|
src/model/NpyReaderWriter.cpp
|
|
src/model/NpyReaderWriter.h
|
|
)
|
|
|
|
target_link_libraries(
|
|
model
|
|
PRIVATE
|
|
fmt::fmt-header-only
|
|
PUBLIC
|
|
Microsoft.GSL::GSL
|
|
rapidjson::rapidjson
|
|
wil
|
|
d3d12
|
|
directml
|
|
)
|
|
|
|
if(TARGET_WSL)
|
|
set_target_properties(model PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
|
endif()
|
|
|
|
target_compile_features(model PRIVATE cxx_std_17)
|
|
target_precompile_headers(model PRIVATE src/model/pch.h)
|
|
target_include_directories(model INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/src/model)
|
|
target_include_directories(model PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src/external)
|
|
|
|
# ==============================================================================
|
|
# Dll
|
|
# ==============================================================================
|
|
get_target_property(directml_config directml DX_COMPONENT_CONFIG)
|
|
get_target_property(d3d12_config d3d12 DX_COMPONENT_CONFIG)
|
|
get_target_property(dxcompiler_config dxcompiler DX_COMPONENT_CONFIG)
|
|
get_target_property(pix_config pix DX_COMPONENT_CONFIG)
|
|
get_target_property(gdk_config gdk DX_COMPONENT_CONFIG)
|
|
get_target_property(ort_config onnxruntime DX_COMPONENT_CONFIG)
|
|
get_target_property(ort_extensions_config onnxruntime_extensions DX_COMPONENT_CONFIG)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/dxdispatch/config.h.in config.h)
|
|
|
|
add_library(
|
|
dxdispatchImpl SHARED
|
|
src/dxdispatch/DxDispatchInterface.h
|
|
src/dxdispatch/dllMain.cpp
|
|
src/dxdispatch/dxDispatchWrapper.cpp
|
|
src/dxdispatch/dxDispatchWrapper.h
|
|
src/dxdispatch/Adapter.cpp
|
|
src/dxdispatch/Adapter.h
|
|
src/dxdispatch/Device.cpp
|
|
src/dxdispatch/Device.h
|
|
src/dxdispatch/DmlDispatchable.cpp
|
|
src/dxdispatch/DmlDispatchable.h
|
|
src/dxdispatch/DirectMLHelpers/DmlGraphDeserialization.cpp
|
|
src/dxdispatch/DirectMLHelpers/ApiTraits.cpp
|
|
src/dxdispatch/Executor.cpp
|
|
src/dxdispatch/Executor.h
|
|
src/dxdispatch/CommandLineArgs.cpp
|
|
src/dxdispatch/CommandLineArgs.h
|
|
src/dxdispatch/Logging.cpp
|
|
src/dxdispatch/Logging.h
|
|
src/dxdispatch/PixCaptureHelper.cpp
|
|
src/dxdispatch/PixCaptureHelper.h
|
|
src/dxdispatch/DxModules.cpp
|
|
src/dxdispatch/DxModules.h
|
|
src/dxdispatch/ModuleInfo.cpp
|
|
${CMAKE_CURRENT_BINARY_DIR}/config.h
|
|
)
|
|
target_include_directories(dxdispatchImpl INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/src/dxdispatch)
|
|
|
|
if(NOT dxcompiler_type STREQUAL None)
|
|
target_sources(dxdispatchImpl PRIVATE src/dxdispatch/HlslDispatchable.cpp)
|
|
endif()
|
|
|
|
if(NOT onnxruntime_type STREQUAL None)
|
|
target_sources(dxdispatchImpl PRIVATE src/dxdispatch/OnnxDispatchable.cpp)
|
|
endif()
|
|
|
|
set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT dxdispatch)
|
|
|
|
if(WIN32)
|
|
if(TARGET_WINDOWS)
|
|
target_compile_definitions(dxdispatchImpl PRIVATE INCLUDE_DXGI=1)
|
|
target_link_libraries(dxdispatchImpl PRIVATE dxgi)
|
|
endif()
|
|
target_sources(dxdispatchImpl PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/dxdispatchImpl.rc)
|
|
target_link_libraries(dxdispatchImpl PRIVATE version.lib)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/dxdispatch/dxdispatchImpl.rc.in dxdispatchImpl.rc)
|
|
endif()
|
|
|
|
if(TARGET_WSL)
|
|
target_link_libraries(dxdispatchImpl PRIVATE -ldl)
|
|
endif()
|
|
|
|
target_include_directories(dxdispatchImpl PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
target_link_libraries(
|
|
dxdispatchImpl
|
|
PRIVATE
|
|
Microsoft.GSL::GSL
|
|
fmt::fmt-header-only
|
|
model
|
|
cxxopts
|
|
directml
|
|
d3d12
|
|
dxcompiler
|
|
pix
|
|
gdk
|
|
wil
|
|
onnxruntime
|
|
onnxruntime_extensions
|
|
flatbuffer
|
|
)
|
|
|
|
target_compile_features(dxdispatchImpl PRIVATE cxx_std_17)
|
|
target_precompile_headers(dxdispatchImpl PRIVATE src/dxdispatch/pch.h)
|
|
target_copy_redist_dependencies(dxdispatchImpl)
|
|
|
|
if(MSVC)
|
|
# Include the import definition, add VS debugger visualizations, remove unused functions, and fold identical code segments.
|
|
set_target_properties(dxdispatchImpl PROPERTIES LINK_FLAGS "/DEF:${PROJECT_SOURCE_DIR}/src/dxdispatch/dxdispatch.def ")
|
|
endif()
|
|
|
|
set_target_properties(dxdispatchImpl PROPERTIES PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/src/dxdispatch/DxDispatchInterface.h)
|
|
|
|
install(TARGETS dxdispatchImpl
|
|
RUNTIME DESTINATION bin
|
|
LIBRARY DESTINATION bin
|
|
PUBLIC_HEADER DESTINATION bin)
|
|
install(FILES $<TARGET_LINKER_FILE:dxdispatchImpl>
|
|
DESTINATION bin
|
|
OPTIONAL)
|
|
if(WIN32)
|
|
install(FILES $<TARGET_PDB_FILE:dxdispatchImpl>
|
|
DESTINATION bin
|
|
OPTIONAL)
|
|
endif()
|
|
|
|
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/models DESTINATION bin)
|
|
install(
|
|
FILES
|
|
${CMAKE_CURRENT_SOURCE_DIR}/ThirdPartyNotices.txt
|
|
${CMAKE_CURRENT_SOURCE_DIR}/doc/Guide.md
|
|
DESTINATION bin
|
|
)
|
|
|
|
if(WIN32)
|
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tools/AnalyzePixGpuCapture.ps1 DESTINATION bin/tools)
|
|
endif()
|
|
|
|
if(TARGET_XBOX)
|
|
# Deploy to the console instead of running on local machine.
|
|
set_property(TARGET dxdispatchImpl PROPERTY VS_SOLUTION_DEPLOY ON)
|
|
|
|
# No need for logos/assets; this is a developer-only app.
|
|
target_sources(dxdispatchImpl PRIVATE ${CMAKE_BINARY_DIR}/MicrosoftGame.config )
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/dxdispatch/dxdispatch.config.in MicrosoftGame.config)
|
|
set_source_files_properties(${CMAKE_BINARY_DIR}/MicrosoftGame.config PROPERTIES VS_TOOL_OVERRIDE "MGCCompile")
|
|
|
|
# Copy MSVC/UCRT redist files matching the current toolset to the build output directory. Not all of the DLLs
|
|
# are necessary but this approach is simple and should avoid missing dependencies.
|
|
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
|
|
# set(CMAKE_INSTALL_DEBUG_LIBRARIES TRUE)
|
|
# set(CMAKE_INSTALL_DEBUG_LIBRARIES_ONLY TRUE)
|
|
# set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE)
|
|
include(InstallRequiredSystemLibraries)
|
|
add_custom_command(
|
|
TARGET dxdispatchImpl
|
|
POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} $<TARGET_FILE_DIR:dxdispatchImpl>
|
|
)
|
|
|
|
# For Copy models to the deployment directory even if other targets don't need to be built.
|
|
add_custom_target(
|
|
copy_models ALL
|
|
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/models" "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_VS_PLATFORM_NAME}/Layout/Image/Loose/models"
|
|
)
|
|
endif()
|
|
|
|
# ==============================================================================
|
|
# Main Executable
|
|
# ==============================================================================
|
|
add_executable(
|
|
dxdispatch
|
|
src/exe/main.cpp
|
|
)
|
|
|
|
target_include_directories(
|
|
dxdispatch
|
|
PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
target_link_libraries(
|
|
dxdispatch
|
|
PRIVATE
|
|
wil
|
|
dxdispatchImpl
|
|
d3d12
|
|
directml
|
|
)
|
|
|
|
target_compile_features(dxdispatch PRIVATE cxx_std_17)
|
|
|
|
if(WIN32)
|
|
target_sources(dxdispatch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/dxdispatch.rc)
|
|
target_link_libraries(dxdispatch PRIVATE version.lib)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/exe/dxdispatch.rc.in dxdispatch.rc)
|
|
endif()
|
|
|
|
target_copy_redist_dependencies(dxdispatch)
|
|
install(
|
|
FILES
|
|
$<TARGET_FILE:dxdispatch>
|
|
DESTINATION bin
|
|
)
|
|
if(WIN32)
|
|
install(FILES $<TARGET_PDB_FILE:dxdispatch>
|
|
DESTINATION bin
|
|
OPTIONAL)
|
|
endif()
|
|
|
|
# ==============================================================================
|
|
# Tests
|
|
# ==============================================================================
|
|
if((TARGET_WINDOWS OR TARGET_WSL) AND (TARGET_ARCH MATCHES "^X64|X86$"))
|
|
option(DXD_TESTS "Build DxDispatch tests" ON)
|
|
else()
|
|
option(DXD_TESTS "Build DxDispatch tests" OFF)
|
|
endif()
|
|
|
|
if(DXD_TESTS)
|
|
enable_testing()
|
|
include(GoogleTest)
|
|
|
|
add_executable(
|
|
jsontests
|
|
src/test/JsonParserTests.cpp
|
|
)
|
|
|
|
target_compile_features(jsontests PRIVATE cxx_std_17)
|
|
target_link_libraries(
|
|
jsontests
|
|
PRIVATE
|
|
gtest_main
|
|
fmt::fmt-header-only
|
|
directml
|
|
d3d12
|
|
wil
|
|
model
|
|
)
|
|
target_include_directories(jsontests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/dxdispatch)
|
|
gtest_discover_tests(jsontests DISCOVERY_MODE PRE_TEST)
|
|
|
|
# Hacky. Needed for silly reasons related to defining GUIDs in winadapter. This should
|
|
# ideally be cleaned up at some point.
|
|
if(NOT WIN32)
|
|
add_dependencies(jsontests dxdispatch)
|
|
endif()
|
|
|
|
function(model_test model_name expected_output)
|
|
add_test(NAME test_${model_name} COMMAND dxdispatch models/${model_name}.json WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
|
set_tests_properties(test_${model_name} PROPERTIES PASS_REGULAR_EXPRESSION ${expected_output})
|
|
endfunction()
|
|
|
|
model_test(dml_convolution_2d "Resource 'output': 6, 8, 12, 14")
|
|
model_test(dml_convolution_3d "Resource 'output': 4, 4, 4, 4, 4, 4, 4, 4")
|
|
model_test(dml_cumulative_product "Resource 'Out': 2, 8, 64, 192")
|
|
model_test(dml_element_wise_add "Resource 'Out': 6, 10, -2")
|
|
model_test(dml_element_wise_add_npy "Resource 'Out': 2, 4, 6, 8, 10, 12")
|
|
model_test(dml_element_wise_add1 "Resource 'Out': 6, 10, -0.432332")
|
|
model_test(dml_element_wise_clip "Resource 'A': -2.5, -2.5, -2, -1, 0, 1, 2, 2.5, 2.5")
|
|
model_test(dml_element_wise_identity "Resource 'Out': 12, 14, 16")
|
|
model_test(dml_fill_value_sequence "Resource 'Out': 3.2, 4.7, 6.2, 7.7, 9.2")
|
|
model_test(dml_join "Resource 'Out': 1, 2, 3, 100, 115, 5, 6, 7, 8, 9")
|
|
model_test(dml_reduce "Resource 'output': 6, 15, 24")
|
|
model_test(dml_slice "Resource 'output': 7, 9, 12, 14, 17, 19")
|
|
model_test(dml_split "Resource 'Out1': 1, 2\nResource 'Out2': 3, 4\nResource 'Out3': 5, 6")
|
|
model_test(dml_upsample_2d "Resource 'output': 1, 1.25, 1.75, 2, 1.5, 1.75, 2.25, 2.5, 2.5, 2.75, 3.25, 3.5, 3, 3.25, 3.75, 4")
|
|
model_test(dml_owned_tensors "Resource 'Out': 6, 10, -2")
|
|
model_test(dml_scalar_union_fp16 "Resource 'output': 2, 2, 3, 4, 4")
|
|
if(NOT dxcompiler_type STREQUAL None)
|
|
model_test(hlsl_add_fp32 "Resource 'Out': 2, 7, 6, 11, 2, 7")
|
|
endif()
|
|
if(NOT onnxruntime_type STREQUAL None)
|
|
model_test(onnx_gemm "Resource 'Out': 22, 28, 34, 40, 46, 60, 74, 88, 70, 92, 114, 136")
|
|
model_test(onnx_dynamic_shapes "Resource 'deferredY': 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12")
|
|
endif()
|
|
endif()
|
|
|
|
# Packaging - these commands allow CPack to bundle up the installed files of this project.
|
|
if(PROJECT_IS_TOP_LEVEL)
|
|
set(CPACK_PACKAGE_NAME Microsoft.AI.DirectML.DxDispatch.${TARGET_PLATFORM}.${TARGET_ARCH})
|
|
set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
|
|
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
|
|
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
|
|
set(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${PROJECT_VERSION})
|
|
set(CPACK_PACKAGE_VENDOR DirectML)
|
|
include(CPack)
|
|
endif() |