blob: 65ddfec74a116b7fecb48c94566f441d5e51ab2d [file]
<script src="../../resources/js-test.js"></script>
<script>
globalThis.testRunner?.waitUntilDone();
onload = async () => {
let adapter0 = await navigator.gpu.requestAdapter();
let device = await adapter0.requestDevice();
try {
device.pushErrorScope('validation');
let code = `
@group(0) @binding(0)
var<storage, read_write> fixedSizeArray: array<array<u32, (1<<30)>, 1>;
@compute @workgroup_size(1)
fn compute0() {
fixedSizeArray[0][0x40] = 1234567890;
}
`;
let shaderModule = device.createShaderModule({code});
let bindGroupLayout0 = device.createBindGroupLayout({
entries: [{binding: 0, visibility: GPUShaderStage.COMPUTE, buffer: {type: 'storage'}}],
});
let pipelineLayout = device.createPipelineLayout({
bindGroupLayouts: [bindGroupLayout0],
});
let computePipeline = device.createComputePipeline({
layout: pipelineLayout,
compute: {module: shaderModule, entryPoint: 'compute0'},
});
let compilationInfo = await shaderModule.getCompilationInfo();
for (let message of compilationInfo.messages) {
debug(message);
}
let buffer0 = device.createBuffer({size: 4, usage: GPUBufferUsage.STORAGE});
let bufferToDump = device.createBuffer({size: 4, usage: GPUBufferUsage.MAP_READ});
let bindGroup0 = device.createBindGroup({
layout: bindGroupLayout0,
entries: [{binding: 0, resource: {buffer: buffer0}}],
});
let commandEncoder = device.createCommandEncoder();
let computePassEncoder = commandEncoder.beginComputePass();
computePassEncoder.setBindGroup(0, bindGroup0);
computePassEncoder.setPipeline(computePipeline);
computePassEncoder.dispatchWorkgroups(1);
computePassEncoder.end();
let commandBuffer = commandEncoder.finish();
device.queue.submit([commandBuffer]);
await device.queue.onSubmittedWorkDone();
await bufferToDump.mapAsync(GPUMapMode.READ);
debug(new Uint32Array(bufferToDump.getMappedRange()));
} catch (e) {
debug('error');
debug(e);
} finally {
let validationError = await device.popErrorScope();
if (validationError) {
debug('validation error:');
debug(validationError.message);
} else {
debug('no validation error');
}
}
debug('done');
globalThis.testRunner?.notifyDone();
};
</script>