blob: e4c0e1f0941df0cbd51132d57107255c41fceb3e [file] [log] [blame]
import { assert, hasFeature } from '../util/util.js';
export type TestConfig = {
/**
* Enable debug-level logs (normally logged via `Fixture.debug()`).
*/
enableDebugLogs: boolean;
/**
* Maximum number of subcases in flight at once, within a case. Once this many
* are in flight, wait for a subcase to finish before starting the next one.
*/
maxSubcasesInFlight: number;
/**
* After this many subcases run on the page, run `attemptGarbageCollection()`.
* Setting to `Infinity` disables this. Setting to 1 attempts GC every time (slow!).
*/
subcasesBetweenAttemptingGC: number;
/**
* After this many cases use a device, destroy and replace it to free GPU resources.
* Setting to `Infinity` disables this. Setting to 1 gets a new device every time (slow!).
*/
casesBetweenReplacingDevice: number;
testHeartbeatCallback: () => void;
noRaceWithRejectOnTimeout: boolean;
/**
* Logger for debug messages from the test framework
* (that can't be captured in the logs of a test).
*/
frameworkDebugLog?: (msg: string) => void;
/**
* Controls the emission of loops in constant-evaluation shaders under
* 'webgpu:shader,execution,expression,*'
* FXC is extremely slow to compile shaders with loops unrolled, where as the
* MSL compiler is extremely slow to compile with loops rolled.
*/
unrollConstEvalLoops: boolean;
/**
* Whether or not we're running in compatibility mode.
*/
compatibility: boolean;
/**
* Whether or not to request a fallback adapter.
*/
forceFallbackAdapter: boolean;
/**
* Enforce the default limits on the adapter
*/
enforceDefaultLimits: boolean;
/**
* Block all features on the adapter
*/
blockAllFeatures: boolean;
/**
* Whether to enable the `logToWebSocket` function used for out-of-band test logging.
*/
logToWebSocket: boolean;
};
/** Test configuration options. Globally modifiable global state. */
export const globalTestConfig: TestConfig = {
enableDebugLogs: false,
maxSubcasesInFlight: 100,
subcasesBetweenAttemptingGC: 5000,
casesBetweenReplacingDevice: Infinity,
testHeartbeatCallback: () => {},
noRaceWithRejectOnTimeout: false,
unrollConstEvalLoops: false,
compatibility: false,
forceFallbackAdapter: false,
enforceDefaultLimits: false,
blockAllFeatures: false,
logToWebSocket: false,
};
// Check if features has 'core-features-and-limits'.
// Note: The CTS generally, requires that if globalTestConfig.compatibility
// is true then the device MUST be a compatibility device since the CTS
// is trying to test that compatibility devices have the correct validation.
export function isCompatibilityMode(features: GPUSupportedFeatures) {
if (globalTestConfig.compatibility) {
assert(!hasFeature(features, 'core-features-and-limits'));
}
return globalTestConfig.compatibility;
}
// Check if a device is a compatibility device.
// Note: The CTS generally, requires that if globalTestConfig.compatibility
// is true then the device MUST be a compatibility device since the CTS
// is trying to test that compatibility devices have the correct validation.
export function isCompatibilityDevice(device: GPUDevice) {
return isCompatibilityMode(device.features);
}