| @echo off |
| setlocal ENABLEDELAYEDEXPANSION |
| |
| if "%BUILD_CONFIG%"=="" ( |
| set BUILD_CONFIG=Debug |
| ) |
| |
| rem Whether we built the project using ninja as the generator. |
| set GENERATOR_NINJA=0 |
| |
| set TEST_ALL=1 |
| set TEST_CLANG=0 |
| set TEST_CMD=0 |
| set TEST_EXEC=0 |
| set TEST_DXILCONV=0 |
| set TEST_DXILCONV_FILTER= |
| set TEST_EXEC_FUTURE=0 |
| set TEST_EXTRAS=0 |
| set TEST_EXEC_REQUIRED=0 |
| set TEST_CLANG_FILTER= /select: "@Priority<1" |
| set TEST_EXEC_FILTER=ExecutionTest::* |
| set LOG_FILTER=/logOutput:LowWithConsoleBuffering |
| set TEST_COMPAT_SUITE=0 |
| set MANUAL_FILE_CHECK_PATH= |
| set TEST_MANUAL_FILE_CHECK=0 |
| set SINGLE_FILE_CHECK_NAME=0 |
| set CUSTOM_BIN_SET= |
| |
| rem Begin SPIRV change |
| set TEST_SPIRV=0 |
| set TEST_SPIRV_ONLY=0 |
| rem End SPIRV change |
| |
| set HCT_DIR=%~dp0 |
| |
| if "%NUMBER_OF_PROCESSORS%"=="" ( |
| set PARALLEL_OPTION= |
| ) else if %NUMBER_OF_PROCESSORS% LEQ 1 ( |
| set PARALLEL_OPTION= |
| ) else if %NUMBER_OF_PROCESSORS% LEQ 4 ( |
| set PARALLEL_OPTION=/parallel:%NUMBER_OF_PROCESSORS% |
| ) else ( |
| rem Sweet spot for /parallel seems to be NUMBER_OF_PROCESSORS - 1 |
| set /a PARALLEL_COUNT=%NUMBER_OF_PROCESSORS%-1 |
| set PARALLEL_OPTION=/parallel:!PARALLEL_COUNT! |
| ) |
| |
| :opt_loop |
| if "%1"=="" (goto :done_opt) |
| |
| if "%1"=="/?" goto :showhelp |
| if "%1"=="-?" goto :showhelp |
| if "%1"=="-help" goto :showhelp |
| if "%1"=="--help" goto :showhelp |
| |
| rem Begin SPIRV change |
| if "%1"=="spirv" ( |
| set TEST_SPIRV=1 |
| shift /1 |
| ) |
| |
| if "%1"=="spirv_only" ( |
| set TEST_SPIRV=1 |
| set TEST_SPIRV_ONLY=1 |
| shift /1 |
| ) |
| rem End SPIRV change |
| |
| if "%1"=="-clean" ( |
| set TEST_CLEAN=1 |
| ) else if "%1"=="clean" ( |
| set TEST_CLEAN=1 |
| set TEST_CLEAN_ONLY=1 |
| ) else if "%1"=="none" ( |
| set TEST_ALL=0 |
| ) else if "%1"=="clang" ( |
| set TEST_ALL=0 |
| set TEST_CLANG=1 |
| ) else if "%1"=="clang-filter" ( |
| set TEST_ALL=0 |
| set TEST_CLANG=1 |
| set TEST_CLANG_FILTER= /name:%2 |
| shift /1 |
| ) else if "%1"=="file-check" ( |
| set TEST_ALL=0 |
| set TEST_MANUAL_FILE_CHECK=1 |
| set MANUAL_FILE_CHECK_PATH=%~2 |
| shift /1 |
| ) else if "%1"=="v" ( |
| set TEST_ALL=0 |
| set TEST_CLANG=1 |
| set TEST_CLANG_FILTER= /name:VerifierTest::* |
| ) else if "%1"=="cmd" ( |
| set TEST_ALL=0 |
| set TEST_CMD=1 |
| ) else if "%1" == "dxilconv" ( |
| set TEST_ALL=0 |
| set TEST_DXILCONV=1 |
| ) else if "%1" == "dxilconv-filter" ( |
| set TEST_ALL=0 |
| set TEST_DXILCONV=1 |
| set TEST_DXILCONV_FILTER= /name:%2 |
| shift /1 |
| ) else if "%1"=="noexec" ( |
| set TEST_ALL=0 |
| set TEST_CLANG=1 |
| set TEST_CMD=1 |
| set TEST_DXILCONV=1 |
| ) else if "%1"=="exec" ( |
| rem If exec is explicitly supplied, hcttest will fail if machine is not configured |
| rem to run execution tests, otherwise, execution tests would be skipped. |
| set TEST_ALL=0 |
| set TEST_EXEC=1 |
| set TEST_EXEC_REQUIRED=1 |
| ) else if "%1"=="exec-filter" ( |
| set TEST_ALL=0 |
| set TEST_EXEC=1 |
| set TEST_EXEC_FILTER=ExecutionTest::%2 |
| set TEST_EXEC_REQUIRED=1 |
| shift /1 |
| ) else if "%1"=="exec-future" ( |
| set TEST_ALL=0 |
| set TEST_EXEC=1 |
| set TEST_EXEC_FUTURE=1 |
| set TEST_EXEC_REQUIRED=1 |
| ) else if "%1"=="exec-future-filter" ( |
| set TEST_ALL=0 |
| set TEST_EXEC=1 |
| set TEST_EXEC_FUTURE=1 |
| set TEST_EXEC_FILTER=ExecutionTest::%2 |
| set TEST_EXEC_REQUIRED=1 |
| shift /1 |
| ) else if "%1"=="extras" ( |
| set TEST_ALL=0 |
| set TEST_EXTRAS=1 |
| ) else if "%1"=="-ninja" ( |
| set GENERATOR_NINJA=1 |
| ) else if "%1"=="-rel" ( |
| set BUILD_CONFIG=Release |
| ) else if "%1"=="-x86" ( |
| rem Allow BUILD_ARCH override. This may be used by HCT_EXTRAS scripts. |
| set BUILD_ARCH=Win32 |
| ) else if "%1"=="-x64" ( |
| set BUILD_ARCH=x64 |
| ) else if "%1"=="-arm" ( |
| set BUILD_ARCH=ARM |
| ) else if "%1"=="-adapter" ( |
| set TEST_ADAPTER= /p:"Adapter=%~2" |
| shift /1 |
| ) else if "%1"=="-verbose" ( |
| set LOG_FILTER= |
| set PARALLEL_OPTION= |
| ) else if "%1"=="-dxilconv-loc" ( |
| set DXILCONV_LOC=%~2 |
| shift /1 |
| ) else if "%1"=="-custom-bin-set" ( |
| set CUSTOM_BIN_SET=%~2 |
| shift /1 |
| ) else if "%1"=="--" ( |
| shift /1 |
| goto :done_opt |
| ) else ( |
| goto :done_opt |
| ) |
| shift /1 |
| goto :opt_loop |
| :done_opt |
| |
| rem Collect additional arguments for tests |
| :collect_args |
| if "%1"=="" goto :done_args |
| set ADDITIONAL_OPTS=%ADDITIONAL_OPTS% %1 |
| shift /1 |
| goto :collect_args |
| :done_args |
| |
| rem By default, run all clang tests and execution tests and dxilconv tests |
| if "%TEST_ALL%"=="1" ( |
| set TEST_CLANG=1 |
| set TEST_CMD=1 |
| set TEST_EXEC=1 |
| set TEST_EXTRAS=1 |
| set TEST_DXILCONV=1 |
| ) |
| |
| where te.exe 1>nul 2>nul |
| if errorlevel 1 ( |
| echo Unable to find te.exe on path. |
| exit /b 1 |
| ) |
| |
| Rem For the Ninja generator, artifacts are not generated into a directory |
| Rem matching the current build configuration; instead, they are generated |
| Rem directly into bin/ under the build root directory. |
| if "%GENERATOR_NINJA%"=="1" ( |
| set BIN_DIR=%HLSL_BLD_DIR%\bin |
| set TEST_DIR=%HLSL_BLD_DIR%\test |
| ) else ( |
| set BIN_DIR=%HLSL_BLD_DIR%\%BUILD_CONFIG%\bin |
| set TEST_DIR=%HLSL_BLD_DIR%\%BUILD_CONFIG%\test |
| ) |
| |
| if "%TEST_DXILCONV%"=="1" ( |
| if "%DXILCONV_LOC%"=="" ( set DXILCONV_LOC=%BIN_DIR%\dxilconv.dll ) |
| if not exist "%DXILCONV_LOC%" ( |
| echo Skipping dxilconv tests, dxilconv.dll not found. |
| set TEST_DXILCONV=0 |
| ) |
| ) |
| |
| if "%TEST_CLEAN%"=="1" ( |
| echo Cleaning %TEST_DIR% ... |
| if exist %TEST_DIR%\. ( |
| rmdir /q /s %TEST_DIR% |
| ) |
| if "%TEST_CLEAN_ONLY%"=="1" ( |
| echo exiting after deleting test directory. if clean and test is desired, use -clean option. |
| exit /b 0 |
| ) |
| ) |
| |
| if not exist %TEST_DIR% (mkdir %TEST_DIR%) |
| |
| echo Copying binaries to test to %TEST_DIR%: |
| if "%CUSTOM_BIN_SET%"=="" ( |
| call %HCT_DIR%\hctcopy.cmd %BIN_DIR% %TEST_DIR% dxa.exe dxc.exe dxexp.exe dxopt.exe dxr.exe dxv.exe clang-hlsl-tests.dll dxcompiler.dll d3dcompiler_dxc_bridge.dll dxl.exe dxc_batch.exe dxlib_sample.dll |
| if errorlevel 1 exit /b 1 |
| if "%TEST_DXILCONV%"=="1" ( |
| call %HCT_DIR%\hctcopy.cmd %BIN_DIR% %TEST_DIR% dxbc2dxil.exe dxilconv-tests.dll opt.exe |
| call %HCT_DIR%\hctcopy.cmd %DXILCONV_LOC% %TEST_DIR% dxilconv.dll |
| ) |
| ) else ( |
| call %HCT_DIR%\hctcopy.cmd %BIN_DIR% %TEST_DIR% %CUSTOM_BIN_SET% |
| if errorlevel 1 exit /b 1 |
| if "%TEST_DXILCONV%"=="1" ( |
| call %HCT_DIR%\hctcopy.cmd %DXILCONV_LOC% %TEST_DIR% dxilconv.dll |
| ) |
| ) |
| if errorlevel 1 exit /b 1 |
| |
| rem Begin SPIRV change |
| if "%TEST_SPIRV%"=="1" ( |
| if not exist %BIN_DIR%\clang-spirv-tests.exe ( |
| echo clang-spirv-tests.exe has not been built. Make sure you run "hctbuild -spirvtest" first. |
| exit /b 1 |
| ) |
| echo Running SPIRV tests ... |
| %BIN_DIR%\clang-spirv-tests.exe --spirv-test-root %HLSL_SRC_DIR%\tools\clang\test\CodeGenSPIRV |
| if errorlevel 1 ( |
| echo Failure occured in SPIRV unit tests |
| exit /b 1 |
| ) |
| if "%TEST_SPIRV_ONLY%"=="1" ( |
| exit /b 0 |
| ) |
| ) |
| rem End SPIRV change |
| |
| echo Running HLSL tests ... |
| |
| if exist "%HCT_EXTRAS%\hcttest-before.cmd" ( |
| call "%HCT_EXTRAS%\hcttest-before.cmd" %TEST_DIR% |
| if errorlevel 1 ( |
| echo Fatal error, Failed command: "%HCT_EXTRAS%\hcttest-before.cmd" %TEST_DIR% |
| exit /b 1 |
| ) |
| ) |
| |
| if "%TEST_CLANG%"=="1" ( |
| echo Running Clang unit tests ... |
| call :runte clang-hlsl-tests.dll /p:"HlslDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL"%TEST_CLANG_FILTER%%ADDITIONAL_OPTS% |
| set RES_CLANG=!ERRORLEVEL! |
| ) |
| |
| if "%TEST_CMD%"=="1" ( |
| copy /y %HLSL_SRC_DIR%\utils\hct\cmdtestfiles\smoke.hlsl %TEST_DIR%\smoke.hlsl |
| call %HLSL_SRC_DIR%\utils\hct\hcttestcmds.cmd %TEST_DIR% %HLSL_SRC_DIR%\tools\clang\test\HLSL |
| set RES_CMD=!ERRORLEVEL! |
| ) |
| |
| if "%TEST_EXEC%"=="1" ( |
| echo Sniffing for D3D12 configuration ... |
| call :runte clang-hlsl-tests.dll /p:"HlslDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL" /name:ExecutionTest::BasicTriangleTest /runIgnoredTests /p:"ExperimentalShaders=*" %TEST_ADAPTER% |
| rem /p:"ExperimentalShaders=*" |
| set RES_EXEC=!ERRORLEVEL! |
| if errorlevel 1 ( |
| if not "%TEST_EXEC_REQUIRED%"=="1" ( |
| echo Basic triangle test failed. |
| echo Assuming this is an environmental limitation not a regression |
| set TEST_EXEC=0 |
| ) else ( |
| echo Basic triangle test succeeded. Proceeding with execution tests. |
| ) |
| ) |
| ) |
| |
| if "%TEST_EXEC%"=="1" ( |
| if "%TEST_EXEC_FUTURE%"=="1" ( |
| call :runte clang-hlsl-tests.dll /p:"HlslDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL" /select:"@Name='%TEST_EXEC_FILTER%' AND @Priority=2" /runIgnoredTests /p:"ExperimentalShaders=*" %TEST_ADAPTER% %ADDITIONAL_OPTS% |
| ) else ( |
| call :runte clang-hlsl-tests.dll /p:"HlslDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL" /select:"@Name='%TEST_EXEC_FILTER%' AND @Priority<2" /runIgnoredTests /p:"ExperimentalShaders=*" %TEST_ADAPTER% %ADDITIONAL_OPTS% |
| ) |
| set RES_EXEC=!ERRORLEVEL! |
| ) |
| |
| if exist "%HCT_EXTRAS%\hcttest-extras.cmd" ( |
| if "%TEST_EXTRAS%"=="1" ( |
| echo Running extra tests ... |
| call "%HCT_EXTRAS%\hcttest-extras.cmd" %TEST_DIR% |
| set RES_EXTRAS=!ERRORLEVEL! |
| ) |
| ) |
| |
| if "%TEST_DXILCONV%"=="1" ( |
| call :runte dxilconv-tests.dll /p:"DxilConvDataDir=%HLSL_SRC_DIR%\projects\dxilconv\test" %TEST_DXILCONV_FILTER% |
| set RES_DXILCONV=!ERRORLEVEL! |
| ) |
| |
| |
| if exist "%HCT_EXTRAS%\hcttest-after.cmd" ( |
| call "%HCT_EXTRAS%\hcttest-after.cmd" %TEST_DIR% |
| set RES_HCTTEST_AFTER=!ERRORLEVEL! |
| ) |
| |
| if "%TEST_MANUAL_FILE_CHECK%"=="1" ( |
| call :runte clang-hlsl-tests.dll /p:"HlslDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL" /name:CompilerTest::ManualFileCheckTest /runIgnoredTests /p:"InputPath=%MANUAL_FILE_CHECK_PATH%" |
| set RES_EXEC=!ERRORLEVEL! |
| ) |
| |
| echo. |
| echo ================================== |
| echo Unit test results: |
| set TESTS_PASSED=0 |
| set TESTS_FAILED=0 |
| call :check_result "clang tests" %RES_CLANG% |
| call :check_result "command line tests" %RES_CMD% |
| if "%TEST_EXEC%"=="1" ( |
| call :check_result "execution tests" %RES_EXEC% |
| ) |
| call :check_result "hcttest-extras tests" %RES_EXTRAS% |
| call :check_result "hcttest-after script" %RES_HCTTEST_AFTER% |
| call :check_result "dxilconv tests" %RES_DXILCONV% |
| |
| if not "%TESTS_PASSED%"=="0" ( |
| echo %TESTS_PASSED% succeeded. |
| ) else if "%TESTS_FAILED%"=="0" ( |
| echo No Unit tests run. |
| ) |
| if not "%TESTS_FAILED%"=="0" ( |
| echo %TESTS_FAILED% failed. |
| ) |
| echo ================================== |
| exit /b %TESTS_FAILED% |
| |
| :showhelp |
| |
| echo Usage: |
| echo hcttest [options] [target(s)] [-- additonal test arguments] |
| echo. |
| echo target can be empty or a specific subset. |
| echo. |
| echo If target if not specified, all tests will be run, but clang tests |
| echo will be limited by /select: "@Priority<1" by default. |
| echo You may specify 'clang-filter *' to run all clang tests. |
| echo Multiple targets may be specified to choose which stages to run. |
| echo. |
| echo options: |
| echo -clean - deletes test directory before copying binaries and testing |
| echo -ninja - artifacts were built using the Ninja generator |
| echo -rel - tests release rather than debug |
| echo -adapter "adapter name" - overrides Adapter for execution tests |
| echo -verbose - for TAEF: turns off /parallel and removes logging filter |
| echo -custom-bin-set "file [file]..." - custom set of binaries to copy into test directory |
| echo -dxilconv-loc "dxilconv.dll location" - fetch dxilconv.dll from custom location |
| echo. |
| echo current BUILD_ARCH=%BUILD_ARCH%. Override with: |
| echo -x86 targets an x86 build (aka. Win32) |
| echo -x64 targets an x64 build (aka. Win64) |
| echo -arm targets an ARM build |
| echo. |
| echo target(s): |
| echo clang - run clang tests. |
| echo file-check - run file-check test on single file. |
| echo - hcttest file-check "..\CodeGenHLSL\shader-compat-suite\lib_arg_flatten\lib_arg_flatten.hlsl" |
| echo compat-suite - run compat-suite test. |
| echo - hcttest compat-suite "..\CodeGenHLSL\shader-compat-suite\lib_arg_flatten" |
| echo cmd - run command line tool tests. |
| echo dxilconv - run dxilconv tests |
| echo v - run the subset of clang tests that are verified-based. |
| echo exec - run execution tests. |
| echo exec-future - run execution tests for future releases. |
| echo extras - run hcttest-extras tests. |
| echo noexec - all except exec and extras tests. |
| echo. |
| echo Select clang or exec targets with filter by test name: |
| echo clang-filter Name |
| echo exec-filter Name |
| echo exec-exp-filter Name |
| echo dxilconv-filter Name |
| echo. |
| echo Use the HCT_EXTRAS environment variable to add hcttest-before and hcttest-after hooks. |
| echo. |
| echo Delete test directory and do not copy binaries or run tests: |
| echo hcttest clean |
| echo. |
| call :showtesample clang-hlsl-tests.dll /p:"DxilConvDataDir=%HLSL_SRC_DIR%\tools\clang\test\HLSL" |
| |
| goto :eof |
| |
| :runte |
| rem Runs a unit test. |
| rem %1 - the name of the binary to run |
| rem %2 - first argument to te |
| rem %3 - second argument to te |
| rem %4 - third argument to te |
| |
| echo te /labMode /miniDumpOnCrash %LOG_FILTER% %PARALLEL_OPTION% %TEST_DIR%\%* |
| call te /labMode /miniDumpOnCrash %LOG_FILTER% %PARALLEL_OPTION% %TEST_DIR%\%* |
| |
| if errorlevel 1 ( |
| call :showtesample %* |
| exit /b 1 |
| ) |
| goto :eof |
| |
| :showtesample |
| rem %1 - name of binary to demo |
| rem %2 - first argument to te |
| |
| if "%TEST_DIR%"=="" ( |
| set TEST_DIR=%HLSL_BLD_DIR%\%BUILD_CONFIG%\test |
| ) |
| |
| echo You can debug the test with the following command line. |
| echo start devenv /debugexe TE.exe /inproc %TEST_DIR%\%* |
| echo. |
| echo Use this te.exe for out-of-proc, or pick the correct one for the target arch, currently %BUILD_ARCH%. |
| where te.exe |
| echo. |
| echo Use /name:TestClass* or /name:TestClass::MethodName to filter and /breakOnError to catch the failure. |
| goto :eof |
| |
| :check_result |
| if not "%2"=="" ( |
| if "%2"=="0" ( |
| echo [PASSED] %~1 |
| set /a TESTS_PASSED=%TESTS_PASSED%+1 |
| ) else ( |
| echo [FAILED] %~1 |
| set /a TESTS_FAILED=%TESTS_FAILED%+1 |
| ) |
| ) |
| goto :eof |