UNPKG

typegpu

Version:

A thin layer between JS and WebGPU/WGSL that improves development experience and allows for faster iteration.

54 lines (53 loc) 2.61 kB
import { $internal } from '../../shared/symbols.ts'; import type { ExperimentalTgpuRoot } from '../root/rootTypes.ts'; import { type TgpuComputePass, type TgpuComputePassDescriptor } from './computePass.ts'; import { type TgpuRenderPass, type TgpuRenderPassDescriptor } from './renderPass.ts'; export interface CommandEncoderInternals { readonly rawEncoder: GPUCommandEncoder; readonly root: ExperimentalTgpuRoot; /** A caller-owned raw encoder, so submission is out of our hands and no work can be deferred */ readonly adopted: boolean; /** Commands recorded just before the encoder is finished, keyed for deduplication */ readonly beforeFinish: Map<object, (rawEncoder: GPUCommandEncoder) => void>; /** Callbacks run once the recorded commands have been submitted, keyed for deduplication */ readonly afterSubmit: Map<object, () => void>; } /** * The TypeGPU equivalent of {@link GPUCommandEncoder}, for batching multiple * 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(); * ``` * * For anything not covered by the typed surface (e.g. texture copies), grab * the raw encoder via `root.unwrap(encoder)`. */ export interface TgpuCommandEncoder { readonly [$internal]: CommandEncoderInternals; readonly resourceType: 'command-encoder'; /** * Begins recording a render pass. Attachment views accept TypeGPU textures, * texture views and canvas contexts, next to raw {@link GPUTextureView}s. */ beginRenderPass(descriptor: TgpuRenderPassDescriptor): TgpuRenderPass; /** Begins recording a compute pass */ beginComputePass(descriptor?: TgpuComputePassDescriptor): TgpuComputePass; /** Finishes the recording and submits the resulting command buffer to the device queue */ submit(): void; /** * Escape hatch: finishes the recording without submitting, for manual * multi-encoder batching via `device.queue.submit([...])`. */ finish(descriptor?: GPUCommandBufferDescriptor): GPUCommandBuffer; } export declare function INTERNAL_createCommandEncoder(root: ExperimentalTgpuRoot, descriptor?: GPUCommandEncoderDescriptor): TgpuCommandEncoder; export declare function INTERNAL_adoptCommandEncoder(root: ExperimentalTgpuRoot, rawEncoder: GPUCommandEncoder): TgpuCommandEncoder;