| 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); |
| } |