demo · v136

Intermediate buffer pipeline

The chromestatus motivation: video effects pipelines pass frames through several intermediate steps. Stage 1 (video frame) used to need a GPUExternalTexture binding; stages 2..N (post-process textures) need GPUTextureView. Two bind-group layouts, two shaders. v136 lets you bind a regular GPUTextureView at the externalTexture slot — one bind-group layout, one shader, every stage.

Probing WebGPU pipeline support…

pre-136 (two shaders)

@binding(0) var src: texture_external;
@binding(1) var dst: texture_storage_2d<...>;

@compute fn pass0(...) {
  // stage 0: read from texture_external (video frame)
}

// separate WGSL for stage 1+...
@binding(0) var src: texture_2d<f32>;
@binding(1) var dst: texture_storage_2d<...>;

136+ (one shader)

@binding(0) var src: texture_external;
@binding(1) var dst: texture_storage_2d<...>;

@compute fn pass(...) {
  // works for stage 0 (video frame) and
  // stages 1+ (regular GPUTextureView)
  // because both fit the "externalTexture" slot now.
}
bind group creation
layout reuse

why this angle

The sibling concept describes the new permitted binding. This concept frames the use case: a multi-stage video effects pipeline. Stage 0 takes a real video frame (external texture); stages 1+ recycle the same WGSL because the binding accepts a plain texture view too. One less compile, half the bind-group layouts.

see also