The setPipeline() method of the GPURenderBundleEncoder interface sets the GPURenderPipeline to use for subsequent render bundle commands. 
 
 
The following criteria must be met when calling setPipeline(), otherwise a GPUValidationError is generated and the GPURenderBundleEncoder becomes invalid:
 
 
function recordRenderPass(
  passEncoder: GPURenderBundleEncoder | GPURenderPassEncoder 
) {
  if (settings.dynamicOffsets) {
    passEncoder.setPipeline(dynamicPipeline);
  } else {
    passEncoder.setPipeline(pipeline);
  }
  passEncoder.setVertexBuffer(0, vertexBuffer);
  passEncoder.setBindGroup(0, timeBindGroup);
  const dynamicOffsets = [0];
  for (let i = 0; i < numTriangles; ++i) {
    if (settings.dynamicOffsets) {
      dynamicOffsets[0] = i * alignedUniformBytes;
      passEncoder.setBindGroup(1, dynamicBindGroup, dynamicOffsets);
    } else {
      passEncoder.setBindGroup(1, bindGroups[i]);
    }
    passEncoder.draw(3, 1, 0, 0);
  }
}
  The above snippet is taken from the WebGPU Samples Animometer example.