| export const description = |
| 'Test out-of-memory conditions creating large mappable/mappedAtCreation buffers.'; |
| |
| import { kUnitCaseParamsBuilder } from '../../../../common/framework/params_builder.js'; |
| import { makeTestGroup } from '../../../../common/framework/test_group.js'; |
| import { kBufferUsages } from '../../../capability_info.js'; |
| import { AllFeaturesMaxLimitsGPUTest } from '../../../gpu_test.js'; |
| import { kMaxSafeMultipleOf8 } from '../../../util/math.js'; |
| |
| const oomAndSizeParams = kUnitCaseParamsBuilder |
| .combine('oom', [false, true]) |
| .expand('size', ({ oom }) => { |
| return oom ? [kMaxSafeMultipleOf8] : [16]; |
| }); |
| |
| export const g = makeTestGroup(AllFeaturesMaxLimitsGPUTest); |
| |
| g.test('mappedAtCreation') |
| .desc( |
| `Test creating a very large buffer mappedAtCreation buffer should throw a RangeError only |
| because such a large allocation cannot be created when we initialize an active buffer mapping. |
| ` |
| ) |
| .params( |
| oomAndSizeParams // |
| .beginSubcases() |
| .combine('usage', kBufferUsages) |
| ) |
| .fn(t => { |
| const { oom, usage, size } = t.params; |
| |
| const f = () => t.createBufferTracked({ mappedAtCreation: true, size, usage }); |
| |
| if (oom) { |
| // getMappedRange is normally valid on OOM buffers, but this one fails because the |
| // (default) range is too large to create the returned ArrayBuffer. |
| t.shouldThrow('RangeError', f); |
| } else { |
| const buffer = f(); |
| const mapping = buffer.getMappedRange(); |
| t.expect(mapping.byteLength === size, 'Mapping should be successful'); |
| buffer.unmap(); |
| t.expect(mapping.byteLength === 0, 'Mapping should be detached'); |
| } |
| }); |