( renderer: WebGPURenderer, data: Uint8ClampedArray, width: number, height: number, yStride: number, fullRange = false, )
| 407 | } |
| 408 | |
| 409 | export function renderNv12FrameWebGPU( |
| 410 | renderer: WebGPURenderer, |
| 411 | data: Uint8ClampedArray, |
| 412 | width: number, |
| 413 | height: number, |
| 414 | yStride: number, |
| 415 | fullRange = false, |
| 416 | ): WebGPURenderTiming { |
| 417 | const totalStart = performance.now(); |
| 418 | let resizeMs = 0; |
| 419 | let textureSetupMs = 0; |
| 420 | let uploadMs = 0; |
| 421 | let drawMs = 0; |
| 422 | const { |
| 423 | device, |
| 424 | context, |
| 425 | nv12Pipeline, |
| 426 | nv12FullPipeline, |
| 427 | sampler, |
| 428 | nv12BindGroupLayout, |
| 429 | canvas, |
| 430 | } = renderer; |
| 431 | |
| 432 | if (canvas.width !== width || canvas.height !== height) { |
| 433 | const start = performance.now(); |
| 434 | canvas.width = width; |
| 435 | canvas.height = height; |
| 436 | const format = navigator.gpu.getPreferredCanvasFormat(); |
| 437 | context.configure({ |
| 438 | device, |
| 439 | format, |
| 440 | alphaMode: "opaque", |
| 441 | }); |
| 442 | resizeMs = performance.now() - start; |
| 443 | } |
| 444 | |
| 445 | if ( |
| 446 | renderer.cachedNv12Width !== width || |
| 447 | renderer.cachedNv12Height !== height |
| 448 | ) { |
| 449 | const start = performance.now(); |
| 450 | renderer.yTexture?.destroy(); |
| 451 | renderer.uvTexture?.destroy(); |
| 452 | |
| 453 | renderer.yTexture = device.createTexture({ |
| 454 | size: { width, height }, |
| 455 | format: "r8unorm", |
| 456 | usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST, |
| 457 | }); |
| 458 | |
| 459 | renderer.uvTexture = device.createTexture({ |
| 460 | size: { width: width / 2, height: height / 2 }, |
| 461 | format: "rg8unorm", |
| 462 | usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST, |
| 463 | }); |
| 464 | |
| 465 | renderer.nv12BindGroup = device.createBindGroup({ |
| 466 | layout: nv12BindGroupLayout, |
no test coverage detected