| <script src="../../../resources/js-test-pre.js"></script> |
| <script> |
| async function run() { |
| let adapter = await navigator.gpu.requestAdapter(); |
| let device = await adapter.requestDevice(); |
| let texture = device.createTexture({ size: { width: 1, }, dimension: '3d', format: 'rg8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT }); |
| let bindGroupLayout = device.createBindGroupLayout({ |
| entries: [ |
| { binding: 0, visibility: GPUShaderStage.VERTEX, externalTexture: {}, buffer: { hasDynamicOffset: true } }, |
| { binding: 1, visibility: GPUShaderStage.VERTEX, buffer: { hasDynamicOffset: true } } |
| ] |
| }); |
| let pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout] }); |
| let shaderModule = device.createShaderModule({ code: ` |
| struct FragmentOutput0 { |
| @location(0) f0: vec3<f32> |
| } |
| @fragment fn fragment0() -> FragmentOutput0 { |
| return FragmentOutput0(); |
| } |
| @vertex fn vertex0() -> @builtin(position) vec4f { |
| return vec4f(); |
| } |
| `}); |
| let buffer = device.createBuffer({ size: 1, usage: GPUBufferUsage.UNIFORM }); |
| let pipeline = await device.createRenderPipelineAsync({ |
| layout: pipelineLayout, |
| fragment: { module: shaderModule, targets: [{ format: 'rg8unorm' }] }, |
| vertex: { module: shaderModule, buffers: [{ arrayStride: 8, attributes: [] }] } |
| }); |
| let textureView = texture.createView(); |
| let commandEncoder = device.createCommandEncoder(); |
| let renderPassEncoder = commandEncoder.beginRenderPass({ |
| colorAttachments: [{ view: textureView, depthSlice: 0, loadOp: 'load', storeOp: 'discard' }], |
| }); |
| let videoFrame = new VideoFrame(new ArrayBuffer(6), { codedWidth: 2, codedHeight: 2, format: 'I420', timestamp: 0 }); |
| let externalTexture = device.importExternalTexture({ source: videoFrame }); |
| renderPassEncoder.setPipeline(pipeline) |
| let bindGroupLayout2 = device.createBindGroupLayout({ |
| entries: [{ binding: 0, visibility: GPUShaderStage.FRAGMENT, buffer: { hasDynamicOffset: true } }] |
| }); |
| buffer.destroy(); |
| let bindGroup = device.createBindGroup({ |
| layout: bindGroupLayout2, |
| entries: [{ binding: 0, resource: { buffer: buffer } }] |
| }); |
| renderPassEncoder.setBindGroup(0, bindGroup, [0]); |
| renderPassEncoder.drawIndexed(0); |
| await device.queue.onSubmittedWorkDone(); |
| debug('Pass') |
| globalThis.testRunner?.notifyDone(); |
| } |
| globalThis.testRunner?.dumpAsText(); |
| globalThis.testRunner?.waitUntilDone(); |
| |
| run(); |
| </script> |
| |