summaryrefslogtreecommitdiffstats
path: root/tools/render-test/render-test-main.cpp
diff options
context:
space:
mode:
authorGangzheng Tong <tonggangzheng@gmail.com>2025-09-22 15:46:42 -0700
committerGitHub <noreply@github.com>2025-09-22 22:46:42 +0000
commitba8132345cbae5b749b4a01deda732ad6f8251a0 (patch)
treef00ad0dd2d26f49112e430615106c9f6d22de032 /tools/render-test/render-test-main.cpp
parentbd24cc271c5d151dbaa7e4da674cbc219aef8153 (diff)
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 <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 <ellieh+slangbot@nvidia.com> Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
Diffstat (limited to 'tools/render-test/render-test-main.cpp')
-rw-r--r--tools/render-test/render-test-main.cpp45
1 files changed, 35 insertions, 10 deletions
diff --git a/tools/render-test/render-test-main.cpp b/tools/render-test/render-test-main.cpp
index 991d60683..5b3974fc9 100644
--- a/tools/render-test/render-test-main.cpp
+++ b/tools/render-test/render-test-main.cpp
@@ -12,6 +12,7 @@
#include "shader-input-layout.h"
#include "shader-renderer-util.h"
#include "slang-support.h"
+#include "slang-test-device-cache.h"
#include "window.h"
#if defined(_WIN32)
@@ -1440,7 +1441,7 @@ static SlangResult _innerMain(
}
}
- renderer_test::CoreToRHIDebugBridge debugCallback;
+ static renderer_test::CoreToRHIDebugBridge debugCallback;
debugCallback.setCoreCallback(stdWriters->getDebugCallback());
// Use the profile name set on options if set
@@ -1495,7 +1496,7 @@ static SlangResult _innerMain(
return SLANG_E_NOT_AVAILABLE;
}
- Slang::ComPtr<IDevice> device;
+ CachedDeviceWrapper deviceWrapper;
{
DeviceDesc desc = {};
desc.deviceType = options.deviceType;
@@ -1558,8 +1559,27 @@ static SlangResult _innerMain(
{
getRHI()->enableDebugLayers();
}
- SlangResult res = getRHI()->createDevice(desc, device.writeRef());
- if (SLANG_FAILED(res))
+ Slang::ComPtr<rhi::IDevice> rhiDevice;
+ SlangResult res;
+ if (options.cacheRhiDevice)
+ {
+ res = DeviceCache::acquireDevice(desc, rhiDevice.writeRef());
+ if (SLANG_FAILED(res))
+ {
+ rhiDevice = nullptr;
+ }
+ }
+ else
+ {
+ res = rhi::getRHI()->createDevice(desc, rhiDevice.writeRef());
+ if (SLANG_FAILED(res))
+ {
+ rhiDevice = nullptr;
+ }
+ }
+
+ // Check result for both cached and non-cached paths
+ if (SLANG_FAILED(res) || !rhiDevice)
{
// We need to be careful here about SLANG_E_NOT_AVAILABLE. This return value means
// that the renderer couldn't be created because it required *features* that were
@@ -1575,21 +1595,20 @@ static SlangResult _innerMain(
{
return res;
}
-
if (!options.onlyStartup)
{
fprintf(stderr, "Unable to create renderer %s\n", rendererName.getBuffer());
}
-
return res;
}
- SLANG_ASSERT(device);
+ SLANG_ASSERT(rhiDevice);
+ deviceWrapper = CachedDeviceWrapper(rhiDevice);
}
for (const auto& feature : requiredFeatureList)
{
// If doesn't have required feature... we have to give up
- if (!device->hasFeature(feature))
+ if (!deviceWrapper->hasFeature(feature))
{
return SLANG_E_NOT_AVAILABLE;
}
@@ -1599,7 +1618,7 @@ static SlangResult _innerMain(
// Print adapter info after device creation but before any other operations
if (options.showAdapterInfo)
{
- auto info = device->getInfo();
+ auto info = deviceWrapper->getInfo();
auto out = stdWriters->getOut();
out.print("Using graphics adapter: %s\n", info.adapterName);
}
@@ -1613,14 +1632,20 @@ static SlangResult _innerMain(
{
RenderTestApp app;
renderDocBeginFrame();
- SLANG_RETURN_ON_FAIL(app.initialize(session, device, options, input));
+ SLANG_RETURN_ON_FAIL(app.initialize(session, deviceWrapper.get(), options, input));
app.update();
renderDocEndFrame();
app.finalize();
}
+
return SLANG_OK;
}
+SLANG_TEST_TOOL_API void cleanDeviceCache()
+{
+ DeviceCache::cleanCache();
+}
+
SLANG_TEST_TOOL_API SlangResult innerMain(
Slang::StdWriters* stdWriters,
SlangSession* sharedSession,