-
Notifications
You must be signed in to change notification settings - Fork 86
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
These are problematic at the moment and prevent `MaxLimitsTest` from functioning. We'll remove them once subgroups switches to it's new specification. Also added an all features and limits test so there is something that fails now until subgroups is refactored.
- Loading branch information
Showing
2 changed files
with
101 additions
and
1 deletion.
There are no files selected for viewing
95 changes: 95 additions & 0 deletions
95
src/webgpu/api/operation/device/all_limits_and_features.spec.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
export const description = `Test you can request an device with all features and limits`; | ||
|
||
import { TestCaseRecorder, TestParams } from '../../../../common/framework/fixture.js'; | ||
import { makeTestGroup } from '../../../../common/framework/test_group.js'; | ||
import { | ||
DeviceSelectionDescriptor, | ||
GPUTest, | ||
GPUTestSubcaseBatchState, | ||
initUncanonicalizedDeviceDescriptor, | ||
} from '../../../gpu_test.js'; | ||
import { CanonicalDeviceDescriptor, DescriptorModifierFn } from '../../../util/device_pool.js'; | ||
|
||
/** | ||
* Gets the adapter limits as a standard JavaScript object. | ||
*/ | ||
function getAdapterLimitsAsDeviceRequiredLimits(adapter: GPUAdapter) { | ||
const requiredLimits: Record<string, GPUSize64> = {}; | ||
const adapterLimits = adapter.limits as unknown as Record<string, GPUSize64>; | ||
for (const key in adapter.limits) { | ||
requiredLimits[key] = adapterLimits[key]; | ||
} | ||
return requiredLimits; | ||
} | ||
|
||
function setAllLimitsToAdapterLimitsAndAddAllFeatures( | ||
adapter: GPUAdapter, | ||
desc: CanonicalDeviceDescriptor | undefined | ||
) { | ||
const descWithMaxLimits: CanonicalDeviceDescriptor = { | ||
defaultQueue: {}, | ||
...desc, | ||
requiredFeatures: [...adapter.features] as GPUFeatureName[], | ||
requiredLimits: getAdapterLimitsAsDeviceRequiredLimits(adapter), | ||
}; | ||
return descWithMaxLimits; | ||
} | ||
|
||
/** | ||
* Used by MaxLimitsTest to request a device with all the max limits of the adapter. | ||
*/ | ||
export class AllLimitsAndFeaturesGPUTestSubcaseBatchState extends GPUTestSubcaseBatchState { | ||
override selectDeviceOrSkipTestCase( | ||
descriptor: DeviceSelectionDescriptor, | ||
descriptorModifierFn?: DescriptorModifierFn | ||
): void { | ||
const wrapper = (adapter: GPUAdapter, desc: CanonicalDeviceDescriptor | undefined) => { | ||
desc = descriptorModifierFn ? descriptorModifierFn(adapter, desc) : desc; | ||
return setAllLimitsToAdapterLimitsAndAddAllFeatures(adapter, desc); | ||
}; | ||
super.selectDeviceOrSkipTestCase(initUncanonicalizedDeviceDescriptor(descriptor), wrapper); | ||
} | ||
} | ||
|
||
/** | ||
* A Test that requests all the max limits from the adapter on the device. | ||
*/ | ||
export class AllLimitsAndFeaturesLimitsTest extends GPUTest { | ||
public static override MakeSharedState( | ||
recorder: TestCaseRecorder, | ||
params: TestParams | ||
): GPUTestSubcaseBatchState { | ||
return new AllLimitsAndFeaturesGPUTestSubcaseBatchState(recorder, params); | ||
} | ||
} | ||
|
||
export const g = makeTestGroup(AllLimitsAndFeaturesLimitsTest); | ||
|
||
g.test('everything') | ||
.desc( | ||
` | ||
Test we can request all features and limits. | ||
It is expected that, even though this is generally not recommended, because | ||
it is possible, make sure it works and continues to work going forward so that | ||
changes to WebGPU do not break sites requesting everything. | ||
` | ||
) | ||
.fn(t => { | ||
// Test that all the limits on the device match the adapter. | ||
const adapterLimits = t.adapter.limits as unknown as Record<string, GPUSize64>; | ||
const deviceLimits = t.device.limits as unknown as Record<string, GPUSize64>; | ||
for (const key in t.adapter.limits) { | ||
const deviceLimit = deviceLimits[key]; | ||
const adapterLimit = adapterLimits[key]; | ||
t.expect( | ||
deviceLimit === adapterLimit, | ||
`device.limits.${key} (${deviceLimit}) === adapter.limits.${key} (${adapterLimit})` | ||
); | ||
} | ||
|
||
// Test that all the adapter features are on the device. | ||
for (const feature of t.adapter.features) { | ||
t.expect(t.device.features.has(feature), `device has feature: ${feature}`); | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters