From ba8132345cbae5b749b4a01deda732ad6f8251a0 Mon Sep 17 00:00:00 2001 From: Gangzheng Tong Date: Mon, 22 Sep 2025 15:46:42 -0700 Subject: Add RHI Device Caching and Test Prefix Exclusion (#8448) # Add RHI Device Caching and Test Prefix Exclusion ## Summary This PR introduces two key improvements to the Slang test infrastructure: 1. **RHI Device Caching**: Implements device caching to significantly speed up test execution by reusing graphics devices across tests, **RHI Device Caching reduces slang-test execution time from ~15 minutes to ~5 minutes in Windows release builds** 2. **Test Prefix Exclusion**: Adds `-exclude-prefix` option to skip tests matching specified path prefixes ## Changes ### RHI Device Caching - **New `DeviceCache` class** (`slang-test-device-cache.h/cpp`): Thread-safe device cache with LRU eviction (max 10 devices) - **Cache control option**: `-cache-rhi-device` flag in both `slang-test` and `render-test` - Default: **enabled** in slang-test, **disabled** in render-test when run standalone - Automatically skips caching for CUDA devices (due to driver issues) - **Performance benefit**: Eliminates expensive device creation/destruction cycles, especially beneficial for Vulkan on Tegra platforms ### Test Prefix Exclusion - **New `-exclude-prefix ` option** in slang-test - Allows excluding entire test directories or patterns from execution - Complements existing `-category` and individual test filtering options ### Usage Examples ```bash # Enable device caching (default) slang-test # Disable device caching slang-test -cache-rhi-device false # Exclude tests from specific directories slang-test -exclude-prefix tests/problematic/ slang-test -exclude-prefix tests/slow/ -exclude-prefix tests/experimental/ ``` This change should significantly improve test execution performance, particularly in CI environments with frequent device operations. This is needed for running the GPU test in aarch64, where repeated device creation/destroy is causing driver issues. Needed by: https://github.com/shader-slang/slang/issues/8346 --------- Co-authored-by: slangbot Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com> --- tools/slang-test/options.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'tools/slang-test/options.cpp') diff --git a/tools/slang-test/options.cpp b/tools/slang-test/options.cpp index ec30262fc..7a98caec6 100644 --- a/tools/slang-test/options.cpp +++ b/tools/slang-test/options.cpp @@ -76,6 +76,7 @@ static bool _isSubCommand(const char* arg) " -verbose-paths Use verbose paths in output\n" " -category Only run tests in specified category\n" " -exclude Exclude tests in specified category\n" + " -exclude-prefix Exclude tests with specified path prefix\n" " -api Enable specific APIs (e.g., 'vk+dx12' or '+dx11')\n" " -synthesizedTestApi Set APIs for synthesized tests\n" " -skip-api-detection Skip API availability detection\n" @@ -91,6 +92,7 @@ static bool _isSubCommand(const char* arg) " -capability Compile with the given capability\n" " -enable-debug-layers [true|false] Enable or disable Validation Layer for Vulkan\n" " and Debug Device for DX\n" + " -cache-rhi-device [true|false] Enable or disable RHI device caching (default: true)\n" #if _DEBUG " -disable-debug-layers Disable the debug layers (default enabled in debug " "build)\n" @@ -357,6 +359,18 @@ static bool _isSubCommand(const char* arg) optionsOut->excludeCategories.add(category, category); } } + else if (strcmp(arg, "-exclude-prefix") == 0) + { + if (argCursor == argEnd) + { + stdError.print("error: expected operand for '%s'\n", arg); + showHelp(stdError); + return SLANG_FAIL; + } + Slang::StringBuilder sb; + Slang::Path::simplify(*argCursor++, Slang::Path::SimplifyStyle::NoRoot, sb); + optionsOut->excludePrefixes.add(sb); + } else if (strcmp(arg, "-api") == 0) { if (argCursor == argEnd) @@ -488,6 +502,26 @@ static bool _isSubCommand(const char* arg) optionsOut->enableDebugLayers = false; } } + else if (strcmp(arg, "-cache-rhi-device") == 0) + { + optionsOut->cacheRhiDevice = true; + + if (argCursor == argEnd) + { + stdError.print("error: expected operand for '%s'\n", arg); + showHelp(stdError); + return SLANG_FAIL; + } + + // Check for false variants + const char* value = *argCursor++; + if (value[0] == 'f' || value[0] == 'F' || value[0] == 'n' || value[0] == 'N' || + value[0] == '0' || + ((value[0] == 'o' || value[0] == 'O') && (value[1] == 'f' || value[1] == 'F'))) + { + optionsOut->cacheRhiDevice = false; + } + } #if _DEBUG else if (strcmp(arg, "-disable-debug-layers") == 0) { -- cgit v1.2.3