in src/webgpu/shader/execution/expression/expression.ts [458:529]
async function submitBatch(
t: GPUTest,
shaderBuilder: ShaderBuilder,
shaderBuilderParams: ShaderBuilderParams,
pipelineCache: PipelineCache
): Promise<() => void> {
const { resultType, cases } = shaderBuilderParams;
// Construct a buffer to hold the results of the expression tests
const outputStride = structStride([resultType], 'storage_rw');
const outputBufferSize = align(cases.length * outputStride, 4);
const outputBuffer = t.createBufferTracked({
size: outputBufferSize,
usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST | GPUBufferUsage.STORAGE,
});
const [pipeline, group] = await buildPipeline(
t,
shaderBuilder,
shaderBuilderParams,
outputBuffer,
pipelineCache
);
const encoder = t.device.createCommandEncoder();
const pass = encoder.beginComputePass();
pass.setPipeline(pipeline);
pass.setBindGroup(0, group);
pass.dispatchWorkgroups(1);
pass.end();
// Heartbeat to ensure CTS runners know we're alive.
globalTestConfig.testHeartbeatCallback();
t.queue.submit([encoder.finish()]);
// Return a function that can check the results of the shader
return () => {
const checkExpectation = (outputData: Uint8Array) => {
// Read the outputs from the output buffer
const outputs = new Array<Value>(cases.length);
for (let i = 0; i < cases.length; i++) {
outputs[i] = resultType.read(outputData, i * outputStride);
}
// The list of expectation failures
const errs: string[] = [];
// For each case...
for (let caseIdx = 0; caseIdx < cases.length; caseIdx++) {
const c = cases[caseIdx];
const got = outputs[caseIdx];
const cmp = toComparator(c.expected).compare(got);
if (!cmp.matched) {
errs.push(`(${c.input instanceof Array ? c.input.join(', ') : c.input})
returned: ${cmp.got}
expected: ${cmp.expected}`);
}
}
return errs.length > 0 ? new Error(errs.join('\n\n')) : undefined;
};
// Heartbeat to ensure CTS runners know we're alive.
globalTestConfig.testHeartbeatCallback();
t.expectGPUBufferValuesPassCheck(outputBuffer, checkExpectation, {
type: Uint8Array,
typedLength: outputBufferSize,
});
};
}