From 297bc470d46fa563a84f04354a2dc30d1ebf738d Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Fri, 30 Oct 2026 17:33:44 +0100 Subject: [PATCH] feat: Stabilize command encoders --- .../src/content/docs/apis/buffers.mdx | 2 +- .../src/content/docs/apis/pipelines.mdx | 14 ++-- .../ecosystem/typegpu-radiance-cascades.mdx | 2 +- .../examples/advanced/appjs-venue/index.ts | 2 +- .../algorithms/genetic-racing/index.ts | 4 +- .../src/examples/algorithms/sort/index.ts | 8 +- .../monocular-light-injection/renderer.ts | 2 +- .../examples/rendering/area-light/index.ts | 2 +- .../rendering/global-illumination/index.ts | 2 +- .../radiance-cascades-drawing/index.ts | 2 +- .../rendering/render-bundles-with/index.ts | 2 +- .../rendering/render-bundles/index.ts | 4 +- .../examples/rendering/simple-shadow/index.ts | 2 +- .../rendering/triplanar-mapping/index.ts | 2 +- packages/typegpu-algorithm/README.md | 2 +- .../src/holographic/index.ts | 2 +- .../typegpu-radiance-cascades/src/runner.ts | 2 +- .../src/core/commandEncoder/commandEncoder.ts | 2 +- .../typegpu/src/core/pipeline/drawState.ts | 2 +- packages/typegpu/src/core/root/rootTypes.ts | 78 ++++++++++--------- .../typegpu/tests/computePipeline.test.ts | 18 ++--- .../tests/guardedComputePipeline.test.ts | 2 +- packages/typegpu/tests/immediates.test.ts | 4 +- packages/typegpu/tests/renderPipeline.test.ts | 2 +- 24 files changed, 83 insertions(+), 81 deletions(-) diff --git a/apps/typegpu-docs/src/content/docs/apis/buffers.mdx b/apps/typegpu-docs/src/content/docs/apis/buffers.mdx index 37c26f5bc8..bdd40b1675 100644 --- a/apps/typegpu-docs/src/content/docs/apis/buffers.mdx +++ b/apps/typegpu-docs/src/content/docs/apis/buffers.mdx @@ -549,7 +549,7 @@ const Particle = d.struct({ const particleBuffer = root.createBuffer(Particle); const backupParticleBuffer = root.createBuffer(Particle); -const encoder = root['~unstable'].createCommandEncoder(); +const encoder = root.createCommandEncoder(); // ---cut--- particleBuffer.clear(encoder); backupParticleBuffer.copyFrom(particleBuffer, encoder); diff --git a/apps/typegpu-docs/src/content/docs/apis/pipelines.mdx b/apps/typegpu-docs/src/content/docs/apis/pipelines.mdx index 6da89e18ec..11956f1492 100644 --- a/apps/typegpu-docs/src/content/docs/apis/pipelines.mdx +++ b/apps/typegpu-docs/src/content/docs/apis/pipelines.mdx @@ -619,10 +619,6 @@ The caller remains responsible for ending the pass or finishing the bundle. ## Command encoders and passes -:::caution[Experimental] -`createCommandEncoder` and typed passes are *unstable* features. The API may be subject to change in the near future. -::: - When a pipeline is executed directly via `draw` or `dispatchWorkgroups`, it records its own pass and submits it to the GPU queue immediately. For scenarios that require more control, such as executing multiple pipelines in a single render pass or batching multiple passes into a single submission, TypeGPU provides a typed equivalent of the WebGPU command encoder. It can be created with the `createCommandEncoder` method on the root object and mirrors `GPUCommandEncoder`, while accepting TypeGPU resources directly. @@ -650,7 +646,7 @@ const skyPipeline = createPipeline(); const mesh = { vertexCount: 36 }; const lightCount = 4; // ---cut--- -const encoder = root['~unstable'].createCommandEncoder(); +const encoder = root.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [{ @@ -694,7 +690,7 @@ const bindGroupLayout = tgpu.bindGroupLayout({ size: { uniform: d.vec2u } }); const bindGroup = root.createBindGroup(bindGroupLayout, { size: root.createBuffer(d.vec2u).$usage('uniform'), }); -const encoder = root['~unstable'].createCommandEncoder(); +const encoder = root.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [] }); // ---cut--- pass.setPipeline(renderPipeline); @@ -722,7 +718,7 @@ const computePipeline = root.createComputePipeline({ compute: tgpu.computeFn({ workgroupSize: [1] })(() => {}), }); // ---cut--- -const encoder = root['~unstable'].createCommandEncoder(); +const encoder = root.createCommandEncoder(); const pass = encoder.beginComputePass(); computePipeline.with(pass).dispatchWorkgroups(16); pass.end(); @@ -798,7 +794,7 @@ pipeline .draw(3); // on the pass -const encoder = root['~unstable'].createCommandEncoder(); +const encoder = root.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [{ view: context }] }); pass.setImmediates(tint, d.vec4f(1, 0, 0, 1)); pipeline.with(pass).draw(3); @@ -823,7 +819,7 @@ const root = await tgpu.init(); const mainVertex = tgpu.vertexFn({ out: { pos: d.builtin.position } })(() => ({ pos: d.vec4f() })); const mainFragment = tgpu.fragmentFn({ out: d.vec4f })(() => d.vec4f()); const viewProjMatrix = d.mat4x4f(); -const encoder = root['~unstable'].createCommandEncoder(); +const encoder = root.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [] }); // ---cut--- const viewProj = tgpu.accessor(d.mat4x4f); diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-radiance-cascades.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-radiance-cascades.mdx index eb8d66c278..7d101b0085 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-radiance-cascades.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-radiance-cascades.mdx @@ -573,7 +573,7 @@ const runner = hrc.create({ }); declare const producer: TgpuComputePipeline; // ---cut--- -const encoder = root['~unstable'].createCommandEncoder(); +const encoder = root.createCommandEncoder(); const pass = encoder.beginComputePass(); producer.with(pass).dispatchWorkgroups(64, 64); runner.run({ pass }); diff --git a/apps/typegpu-docs/src/examples/advanced/appjs-venue/index.ts b/apps/typegpu-docs/src/examples/advanced/appjs-venue/index.ts index 0b71f0a029..5b64ddae16 100644 --- a/apps/typegpu-docs/src/examples/advanced/appjs-venue/index.ts +++ b/apps/typegpu-docs/src/examples/advanced/appjs-venue/index.ts @@ -469,7 +469,7 @@ function frame(timestamp: number) { outsideOpacityUniform.write(std.saturate(outsideOpacity.value)); fadeInUniform.write(std.saturate(controls.in3dTransition * 2 - 1)); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: targets.colorAttachments, depthStencilAttachment: { view: targets.zBuffer, depthStoreOp: 'discard' }, diff --git a/apps/typegpu-docs/src/examples/algorithms/genetic-racing/index.ts b/apps/typegpu-docs/src/examples/algorithms/genetic-racing/index.ts index c4c1857180..4971af5c30 100644 --- a/apps/typegpu-docs/src/examples/algorithms/genetic-racing/index.ts +++ b/apps/typegpu-docs/src/examples/algorithms/genetic-racing/index.ts @@ -449,7 +449,7 @@ function frame() { params.patch({ stepsPerDispatch: innerSteps }); const dispatchCount = Math.ceil(stepsToRun / innerSteps); - const simEncoder = root['~unstable'].createCommandEncoder(); + const simEncoder = root.createCommandEncoder(); const simPass = simEncoder.beginComputePass(); const boundPipeline = simulatePipeline.with(simBindGroups[ga.current]).with(simPass); for (let dispatch = 0; dispatch < dispatchCount; dispatch++) { @@ -466,7 +466,7 @@ function frame() { ga.precomputeFitness(population); const bg = reductionBindGroups[ga.current]; - const reductionEncoder = root['~unstable'].createCommandEncoder(); + const reductionEncoder = root.createCommandEncoder(); reductionPackedBuffer.clear(reductionEncoder); const reductionPass = reductionEncoder.beginComputePass(); reductionPipeline.with(bg).with(reductionPass).dispatchWorkgroups(workgroupCount(population)); diff --git a/apps/typegpu-docs/src/examples/algorithms/sort/index.ts b/apps/typegpu-docs/src/examples/algorithms/sort/index.ts index 2b5b3a5257..8ab59946de 100644 --- a/apps/typegpu-docs/src/examples/algorithms/sort/index.ts +++ b/apps/typegpu-docs/src/examples/algorithms/sort/index.ts @@ -183,7 +183,7 @@ function render(encoder: TgpuCommandEncoder) { function generateRandomArray() { const workgroupsTotal = Math.ceil(state.arraySize / WORKGROUP_SIZE); const [workgroupsX, workgroupsY, workgroupsZ] = decomposeWorkgroups(workgroupsTotal); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); initSeed.write(Math.random()); initPipeline @@ -256,7 +256,7 @@ async function sort() { } showOverlay('Sorting...'); const timestamps = querySet?.available ? querySet : null; - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); if (timestamps) { recordTimed(encoder, sorter, timestamps); @@ -284,7 +284,7 @@ async function benchmarkSorter( ): Promise { await plan.initAsync(); for (let i = 0; i < BENCH_WARMUP; i++) { - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); work.copyFrom(input, encoder); plan.run({ encoder }); encoder.submit(); @@ -293,7 +293,7 @@ async function benchmarkSorter( const times: number[] = []; for (let i = 0; i < BENCH_RUNS; i++) { - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); work.copyFrom(input, encoder); recordTimed(encoder, plan, timestamps); encoder.submit(); diff --git a/apps/typegpu-docs/src/examples/image-processing/monocular-light-injection/renderer.ts b/apps/typegpu-docs/src/examples/image-processing/monocular-light-injection/renderer.ts index 2d041ac095..4bb4c1c470 100644 --- a/apps/typegpu-docs/src/examples/image-processing/monocular-light-injection/renderer.ts +++ b/apps/typegpu-docs/src/examples/image-processing/monocular-light-injection/renderer.ts @@ -232,7 +232,7 @@ export class DepthRelightingRenderer { this.#depthParams.patch({ reset: this.#firstFrame ? 1 : 0 }); } - const encoder = this.#root['~unstable'].createCommandEncoder(); + const encoder = this.#root.createCommandEncoder(); const externalFrame = this.#root.device.importExternalTexture({ source: frame.source }); if (updateDepth) { const pass = encoder.beginComputePass(); diff --git a/apps/typegpu-docs/src/examples/rendering/area-light/index.ts b/apps/typegpu-docs/src/examples/rendering/area-light/index.ts index 9c0b4aeb7e..88ada8e84e 100644 --- a/apps/typegpu-docs/src/examples/rendering/area-light/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/area-light/index.ts @@ -218,7 +218,7 @@ function render(time: number) { previousFrameTime = time; paramsUniform.patch({ time: time * 0.001 }); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [ { diff --git a/apps/typegpu-docs/src/examples/rendering/global-illumination/index.ts b/apps/typegpu-docs/src/examples/rendering/global-illumination/index.ts index 182255797f..67554d811f 100644 --- a/apps/typegpu-docs/src/examples/rendering/global-illumination/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/global-illumination/index.ts @@ -160,7 +160,7 @@ function updateLighting(encoder: TgpuCommandEncoder) { let frameId = requestAnimationFrame(frame); function frame() { - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); if (lightingDirty) { updateLighting(encoder); diff --git a/apps/typegpu-docs/src/examples/rendering/radiance-cascades-drawing/index.ts b/apps/typegpu-docs/src/examples/rendering/radiance-cascades-drawing/index.ts index 03aedf25b0..467a752a68 100644 --- a/apps/typegpu-docs/src/examples/rendering/radiance-cascades-drawing/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/radiance-cascades-drawing/index.ts @@ -119,7 +119,7 @@ let frameId = requestAnimationFrame(frame); function frame(timestamp: number) { interaction.update(timestamp); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); if (sceneDirty) { stamp(encoder); lighting.run({ encoder }); diff --git a/apps/typegpu-docs/src/examples/rendering/render-bundles-with/index.ts b/apps/typegpu-docs/src/examples/rendering/render-bundles-with/index.ts index baae4dfcc4..cd66b4c032 100644 --- a/apps/typegpu-docs/src/examples/rendering/render-bundles-with/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/render-bundles-with/index.ts @@ -161,7 +161,7 @@ function frame() { }); } - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [ diff --git a/apps/typegpu-docs/src/examples/rendering/render-bundles/index.ts b/apps/typegpu-docs/src/examples/rendering/render-bundles/index.ts index 538ec576ea..5dc4289d1f 100644 --- a/apps/typegpu-docs/src/examples/rendering/render-bundles/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/render-bundles/index.ts @@ -109,7 +109,7 @@ function generateCubes(count: number) { } function buildBundle(): GPURenderBundle { - const bundleEncoder = root['~unstable'].createRenderBundleEncoder({ + const bundleEncoder = root.createRenderBundleEncoder({ colorFormats: [presentationFormat], depthStencilFormat: 'depth24plus', }); @@ -158,7 +158,7 @@ function frame() { }); } - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [ { diff --git a/apps/typegpu-docs/src/examples/rendering/simple-shadow/index.ts b/apps/typegpu-docs/src/examples/rendering/simple-shadow/index.ts index 837c20896f..7e468c6a9a 100644 --- a/apps/typegpu-docs/src/examples/rendering/simple-shadow/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/simple-shadow/index.ts @@ -285,7 +285,7 @@ let frameId: number | null = null; function render() { frameId = requestAnimationFrame(render); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); const shadowPass = encoder.beginRenderPass({ depthStencilAttachment: { view: shadowTextures.shadowMap }, diff --git a/apps/typegpu-docs/src/examples/rendering/triplanar-mapping/index.ts b/apps/typegpu-docs/src/examples/rendering/triplanar-mapping/index.ts index 3e13b626ec..18d7180b6a 100644 --- a/apps/typegpu-docs/src/examples/rendering/triplanar-mapping/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/triplanar-mapping/index.ts @@ -290,7 +290,7 @@ const splitComparison = createSplitComparison(canvas, 'Triplanar Mapping', 'Mesh let frameId: number; function frame() { const splitX = Math.round(canvas.width * splitRatio); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); const pass = encoder.beginRenderPass({ colorAttachments: [{ view: context }], depthStencilAttachment: { view: depthTexture }, diff --git a/packages/typegpu-algorithm/README.md b/packages/typegpu-algorithm/README.md index fdfb2333ad..672f6a865a 100644 --- a/packages/typegpu-algorithm/README.md +++ b/packages/typegpu-algorithm/README.md @@ -147,7 +147,7 @@ to record the work into instead of submitting on its own. Both raw WebGPU and TypeGPU encoders and passes are accepted: ```ts -const encoder = root['~unstable'].createCommandEncoder(); +const encoder = root.createCommandEncoder(); sorter.run({ encoder }); // records, does not submit // ... encode more work ... diff --git a/packages/typegpu-radiance-cascades/src/holographic/index.ts b/packages/typegpu-radiance-cascades/src/holographic/index.ts index eabaeb80c8..48685e6d64 100644 --- a/packages/typegpu-radiance-cascades/src/holographic/index.ts +++ b/packages/typegpu-radiance-cascades/src/holographic/index.ts @@ -421,7 +421,7 @@ export function create(options: Options): Executor { sectors, byteSize, run({ encoder, pass, iterations = 1 } = {}) { - const commands = encoder ?? (pass ? undefined : root['~unstable'].createCommandEncoder()); + const commands = encoder ?? (pass ? undefined : root.createCommandEncoder()); const computePass = (pass ?? commands!.beginComputePass()) as TgpuComputePass; for (let iteration = 0; iteration < iterations; iteration++) { diff --git a/packages/typegpu-radiance-cascades/src/runner.ts b/packages/typegpu-radiance-cascades/src/runner.ts index f022f599fb..adb247bf6a 100644 --- a/packages/typegpu-radiance-cascades/src/runner.ts +++ b/packages/typegpu-radiance-cascades/src/runner.ts @@ -273,7 +273,7 @@ export function create(options: CascadesOptions): RadianceCascadesExecutor >; - /** - * Creates a {@link TgpuCommandEncoder} for batching multiple render/compute - * passes (and draws within them) into a single submission. - * - * @example - * ```ts - * const encoder = root['~unstable'].createCommandEncoder(); - * const pass = encoder.beginRenderPass({ - * colorAttachments: [{ view: msaaTexture, resolveTarget: context }], - * }); - * scenePipeline.with(pass).draw(vertexCount); - * skyPipeline.with(pass).draw(3); - * pass.end(); - * encoder.submit(); - * ``` - */ + /** @deprecated This feature is now stable, use `root.createCommandEncoder`. */ createCommandEncoder(descriptor?: GPUCommandEncoderDescriptor): TgpuCommandEncoder; - /** - * Creates a {@link TgpuRenderBundleEncoder} for recording draw commands into - * a {@link GPURenderBundle}. Call `finish()` on the encoder to obtain the - * bundle, replayable in a render pass via `pass.executeBundles`. - * - * The caller is responsible for ensuring that the `descriptor` (e.g. - * `colorFormats`, `depthStencilFormat`) is compatible with the render pass - * in which the bundle will be executed. - * - * @param descriptor - Describes the formats the bundle must be compatible with. - * - * @example - * ```ts - * const bundleEncoder = root['~unstable'].createRenderBundleEncoder({ - * colorFormats: ['rgba8unorm'], - * }); - * scenePipeline.with(bundleEncoder).draw(vertexCount); - * const bundle = bundleEncoder.finish(); - * ``` - */ + /** @deprecated This feature is now stable, use `root.createRenderBundleEncoder`. */ createRenderBundleEncoder(descriptor: GPURenderBundleEncoderDescriptor): TgpuRenderBundleEncoder; /** @deprecated Use `root.createSampler` instead. */ diff --git a/packages/typegpu/tests/computePipeline.test.ts b/packages/typegpu/tests/computePipeline.test.ts index 3d68551d45..638c3f8446 100644 --- a/packages/typegpu/tests/computePipeline.test.ts +++ b/packages/typegpu/tests/computePipeline.test.ts @@ -115,7 +115,7 @@ describe('TgpuComputePipeline', () => { }); const pipeline = root.createComputePipeline({ compute: entryFn }); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); const pass = encoder.beginComputePass(); pipeline.with(pass).dispatchWorkgroups(1); pass.end(); @@ -168,7 +168,7 @@ describe('TgpuComputePipeline', () => { const entryFn = tgpu.computeFn({ workgroupSize: [1] })(() => {}); const querySet = root.createQuerySet('timestamp', 2); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); root .createComputePipeline({ compute: entryFn }) .withTimestampWrites({ querySet }) @@ -191,7 +191,7 @@ describe('TgpuComputePipeline', () => { const callback1 = vi.fn(); const callback2 = vi.fn(); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); root .createComputePipeline({ compute: entryFn }) @@ -223,7 +223,7 @@ describe('TgpuComputePipeline', () => { const onUnhandled = vi.fn(); process.on('unhandledRejection', onUnhandled); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); root .createComputePipeline({ compute: entryFn }) .withTimestampWrites({ querySet }) @@ -245,7 +245,7 @@ describe('TgpuComputePipeline', () => { const querySet = root.createQuerySet('timestamp', 2); const error = new Error('Oops'); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); root .createComputePipeline({ compute: entryFn }) .withTimestampWrites({ querySet }) @@ -270,7 +270,7 @@ describe('TgpuComputePipeline', () => { const querySet = root.createQuerySet('timestamp', 2); const error = new Error('Oops'); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); root .createComputePipeline({ compute: entryFn }) .withTimestampWrites({ querySet }) @@ -296,7 +296,7 @@ describe('TgpuComputePipeline', () => { const querySet = root.createQuerySet('timestamp', 2); const callback = vi.fn(); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); const pipeline = root .createComputePipeline({ compute: entryFn }) .withTimestampWrites({ querySet }) @@ -334,7 +334,7 @@ describe('TgpuComputePipeline', () => { expect(consoleWarnSpy).toHaveBeenCalledWith( '⚠️ [suspicious] ', - "The performance callback is ignored when recording into a raw GPUCommandEncoder, since there is no submission to report after. Use root['~unstable'].createCommandEncoder() instead.", + 'The performance callback is ignored when recording into a raw GPUCommandEncoder, since there is no submission to report after. Use root.createCommandEncoder() instead.', ); }); @@ -346,7 +346,7 @@ describe('TgpuComputePipeline', () => { const pipeline = root.createComputePipeline({ compute: entryFn }); for (let i = 0; i < 2; i++) { - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); pipeline.with(encoder).dispatchWorkgroups(1); encoder.finish(); } diff --git a/packages/typegpu/tests/guardedComputePipeline.test.ts b/packages/typegpu/tests/guardedComputePipeline.test.ts index c172155b11..47fe73a435 100644 --- a/packages/typegpu/tests/guardedComputePipeline.test.ts +++ b/packages/typegpu/tests/guardedComputePipeline.test.ts @@ -46,7 +46,7 @@ describe('TgpuGuardedComputePipeline', () => { 'use gpu'; }); - const encoder = root['~unstable'].createCommandEncoder(); + const encoder = root.createCommandEncoder(); const pass = encoder.beginComputePass(); // @ts-expect-error guarded pipelines only accept bind groups diff --git a/packages/typegpu/tests/immediates.test.ts b/packages/typegpu/tests/immediates.test.ts index ab122b5568..82072aeeba 100644 --- a/packages/typegpu/tests/immediates.test.ts +++ b/packages/typegpu/tests/immediates.test.ts @@ -692,7 +692,7 @@ describe('tgpu.immediateVar', () => { .createRenderPipeline({ vertex: mainVertex, fragment: mainFragment }) .with(tint, 0.5); - const pass = root['~unstable'].createRenderBundleEncoder({ colorFormats: [] }); + const pass = root.createRenderBundleEncoder({ colorFormats: [] }); pass.setPipeline(pipeline); pass.draw(3); pass.draw(3); @@ -705,7 +705,7 @@ describe('tgpu.immediateVar', () => { const writes = trackWrites(renderBundleEncoder.mock.setImmediates); const pipeline = root.createRenderPipeline({ vertex: mainVertex, fragment: mainFragment }); - const pass = root['~unstable'].createRenderBundleEncoder({ colorFormats: [] }); + const pass = root.createRenderBundleEncoder({ colorFormats: [] }); pass.setImmediates(tint, 0.25); pass.setPipeline(pipeline); pass.draw(3); diff --git a/packages/typegpu/tests/renderPipeline.test.ts b/packages/typegpu/tests/renderPipeline.test.ts index b9876c0009..91d40cc748 100644 --- a/packages/typegpu/tests/renderPipeline.test.ts +++ b/packages/typegpu/tests/renderPipeline.test.ts @@ -2162,7 +2162,7 @@ describe('Render Bundles', () => { it('binds to a typed bundle pass', ({ root, renderBundleEncoder }) => { const pipeline = createPipeline(root); - const bundleEncoder = root['~unstable'].createRenderBundleEncoder({ + const bundleEncoder = root.createRenderBundleEncoder({ colorFormats: ['rgba8unorm'], }); const withPass = pipeline.with(bundleEncoder);