| <!-- webkit-test-runner [ enableMetalShaderValidation=true ] --> |
| <script src="../../../resources/js-test-pre.js"></script> |
| <script> |
| async function run() { |
| let adapter = await navigator.gpu.requestAdapter() |
| let device = await adapter.requestDevice(); |
| let bindGroupLayout1 = device.createBindGroupLayout({ |
| entries: [ |
| { binding: 1, visibility: GPUShaderStage.COMPUTE, buffer: { type: 'storage' } }, |
| { binding: 2, visibility: GPUShaderStage.COMPUTE, externalTexture: {} }, |
| ] |
| }) |
| let pipelineLayout1 = device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout1] }); |
| let shaderModule = device.createShaderModule({ code: ` |
| @group(0) @binding(1) var<storage, read_write> buffer: array<f32>; |
| @compute @workgroup_size(1) fn compute_main() { |
| _ = buffer[0]; |
| } |
| `}); |
| let pipeline = await device.createComputePipelineAsync({ layout: pipelineLayout1, compute: { module: shaderModule } }); |
| let videoFrame = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBX', timestamp: 0 }); |
| let externalTexture = device.importExternalTexture({ source: videoFrame }); |
| let buffer = device.createBuffer({ size: 4, usage: GPUBufferUsage.STORAGE }); |
| let commandEncoder = device.createCommandEncoder(); |
| let computePassEncoder = commandEncoder.beginComputePass(); |
| computePassEncoder.setPipeline(pipeline); |
| let bindGroup = device.createBindGroup({ |
| layout: bindGroupLayout1, |
| entries: [ |
| { binding: 1, resource: { buffer: buffer, size: 4 } }, |
| { binding: 2, resource: externalTexture }, |
| ], |
| }); |
| computePassEncoder.setBindGroup(0, bindGroup); |
| computePassEncoder.dispatchWorkgroups(1); |
| computePassEncoder.end(); |
| let commandBuffer = commandEncoder.finish(); |
| device.queue.submit([commandBuffer]); |
| await device.queue.onSubmittedWorkDone(); |
| debug('Pass') |
| globalThis.testRunner?.notifyDone(); |
| } |
| |
| globalThis.testRunner?.dumpAsText(); |
| globalThis.testRunner?.waitUntilDone(); |
| |
| run(); |
| </script> |
| |