Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified src/resources/cache/webgpu/shader/execution/bitcast.bin
Binary file not shown.
54 changes: 53 additions & 1 deletion src/webgpu/api/validation/createPipelineLayout.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ TODO: review existing tests, write descriptions, and make sure tests are complet

import { AllFeaturesMaxLimitsGPUTest } from '../.././gpu_test.js';
import { makeTestGroup } from '../../../common/framework/test_group.js';
import { count, range } from '../../../common/util/util.js';
import { getGPU } from '../../../common/util/navigator_gpu.js';
import { count, range, supportsImmediateData } from '../../../common/util/util.js';
import {
bufferBindingTypeInfo,
getBindingLimitForBindingType,
Expand Down Expand Up @@ -512,3 +513,54 @@ g.test('bind_group_layouts,set_pipeline_with_null_bind_group_layouts')
}
}
});

g.test('immediate_data_size')
.desc(
`
Test that creating a pipeline layout with immediateSize validates:
- immediateSize must be a multiple of 4.
- immediateSize must be <= device.limits.maxImmediateSize.
`
)
.params(u => {
const validImmediateSizes = [0, 4, 'max'] as const;
const invalidAlignmentImmediateSizes = [1, 2, 3, 5] as const;
const invalidRangeImmediateSizes = ['exceedLimit'] as const;
return u.combine('immediateSize', [
...validImmediateSizes,
...invalidAlignmentImmediateSizes,
...invalidRangeImmediateSizes,
] as const);
})
.fn(t => {
t.skipIf(!supportsImmediateData(getGPU(t.rec)), 'Immediate data not supported');

const maxImmediateSize = t.device.limits.maxImmediateSize!;

const { immediateSize: sizeVariant } = t.params;
let size: number;
switch (sizeVariant) {
case 'max':
size = maxImmediateSize;
break;
case 'exceedLimit':
size = maxImmediateSize + 4;
break;
default:
size = sizeVariant;
break;
}

const descriptor = {
bindGroupLayouts: [],
immediateSize: size,
};

const isMultipleOf4 = size % 4 === 0;
const isWithinLimit = size <= maxImmediateSize;
const shouldSucceed = isMultipleOf4 && isWithinLimit;

t.expectValidationError(() => {
t.device.createPipelineLayout(descriptor);
}, !shouldSucceed);
});