oria-webgpu 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.ko.md +175 -0
- package/README.md +179 -0
- package/dist/binding/bind-group-layout.d.ts +6 -0
- package/dist/binding/bind-group-layout.d.ts.map +1 -0
- package/dist/binding/bind-group.d.ts +26 -0
- package/dist/binding/bind-group.d.ts.map +1 -0
- package/dist/commands/command-encoder.d.ts +3 -0
- package/dist/commands/command-encoder.d.ts.map +1 -0
- package/dist/core/context.d.ts +8 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/device.d.ts +7 -0
- package/dist/core/device.d.ts.map +1 -0
- package/dist/core/gpu.d.ts +3 -0
- package/dist/core/gpu.d.ts.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +623 -0
- package/dist/index.js.map +1 -0
- package/dist/pass/compute-pass.d.ts +3 -0
- package/dist/pass/compute-pass.d.ts.map +1 -0
- package/dist/pass/render-pass.d.ts +3 -0
- package/dist/pass/render-pass.d.ts.map +1 -0
- package/dist/pipeline/compute-pipeline.d.ts +3 -0
- package/dist/pipeline/compute-pipeline.d.ts.map +1 -0
- package/dist/pipeline/pipeline-cache.d.ts +18 -0
- package/dist/pipeline/pipeline-cache.d.ts.map +1 -0
- package/dist/pipeline/render-pipeline.d.ts +3 -0
- package/dist/pipeline/render-pipeline.d.ts.map +1 -0
- package/dist/resources/buffer.d.ts +5 -0
- package/dist/resources/buffer.d.ts.map +1 -0
- package/dist/resources/readback.d.ts +10 -0
- package/dist/resources/readback.d.ts.map +1 -0
- package/dist/resources/sampler.d.ts +3 -0
- package/dist/resources/sampler.d.ts.map +1 -0
- package/dist/resources/texture.d.ts +4 -0
- package/dist/resources/texture.d.ts.map +1 -0
- package/dist/shader/reflection.d.ts +26 -0
- package/dist/shader/reflection.d.ts.map +1 -0
- package/dist/shader/shader.d.ts +10 -0
- package/dist/shader/shader.d.ts.map +1 -0
- package/dist/types/public.d.ts +211 -0
- package/dist/types/public.d.ts.map +1 -0
- package/dist/utils/alignment.d.ts +6 -0
- package/dist/utils/alignment.d.ts.map +1 -0
- package/dist/utils/hash.d.ts +11 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/validation.d.ts +6 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils/validation.ts","../src/core/device.ts","../src/core/context.ts","../src/utils/alignment.ts","../src/resources/buffer.ts","../src/resources/texture.ts","../src/resources/sampler.ts","../src/resources/readback.ts","../src/shader/shader.ts","../src/shader/reflection.ts","../src/binding/bind-group-layout.ts","../src/binding/bind-group.ts","../src/pipeline/render-pipeline.ts","../src/pipeline/compute-pipeline.ts","../src/utils/hash.ts","../src/pipeline/pipeline-cache.ts","../src/pass/render-pass.ts","../src/pass/compute-pass.ts","../src/commands/command-encoder.ts","../src/core/gpu.ts"],"sourcesContent":["/** Base error type for all library-raised errors. Prefixed for easy log filtering. */\nexport class OriaError extends Error {\n constructor(message: string) {\n super(`[oria] ${message}`)\n this.name = \"OriaError\"\n }\n}\n\nexport function assert(condition: unknown, message: string): asserts condition {\n if (!condition) throw new OriaError(message)\n}\n","import { OriaError } from \"../utils/validation\"\nimport type { CreateGPUOptions } from \"../types/public\"\n\nexport interface RequestedDevice {\n adapter: GPUAdapter\n device: GPUDevice\n}\n\nexport async function requestDevice(options: CreateGPUOptions): Promise<RequestedDevice> {\n if (!(\"gpu\" in navigator) || !navigator.gpu) {\n throw new OriaError(\n \"WebGPU is not supported in this browser. `navigator.gpu` is undefined. \" +\n \"oria-webgpu requires a WebGPU-capable browser (Chrome/Edge 113+, or another browser with WebGPU enabled).\",\n )\n }\n\n const adapter = await navigator.gpu.requestAdapter({\n powerPreference: options.powerPreference,\n forceFallbackAdapter: options.forceFallbackAdapter,\n })\n\n if (!adapter) {\n throw new OriaError(\n \"No suitable GPUAdapter was found. navigator.gpu.requestAdapter() returned null \" +\n \"(no compatible GPU, or the browser denied access).\",\n )\n }\n\n let device: GPUDevice\n try {\n device = await adapter.requestDevice({\n label: options.deviceLabel,\n requiredFeatures: options.requiredFeatures,\n requiredLimits: options.requiredLimits,\n })\n } catch (cause) {\n throw new OriaError(\n `adapter.requestDevice() failed: ${cause instanceof Error ? cause.message : String(cause)}. ` +\n \"Check that requiredFeatures/requiredLimits are actually supported by this adapter \" +\n \"(see adapter.features/adapter.limits).\",\n )\n }\n\n return { adapter, device }\n}\n","import { OriaError } from \"../utils/validation\"\nimport type { CreateGPUOptions } from \"../types/public\"\n\nexport interface ConfiguredContext {\n context: GPUCanvasContext\n format: GPUTextureFormat\n}\n\nexport function configureCanvasContext(\n canvas: HTMLCanvasElement,\n device: GPUDevice,\n options: CreateGPUOptions,\n): ConfiguredContext {\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null\n if (!context) {\n throw new OriaError(\n \"canvas.getContext('webgpu') returned null. Ensure the canvas hasn't already \" +\n \"acquired a different context type (e.g. '2d' or 'webgl').\",\n )\n }\n\n const format = options.format ?? navigator.gpu.getPreferredCanvasFormat()\n\n context.configure({\n device,\n format,\n alphaMode: options.alphaMode ?? \"opaque\",\n })\n\n return { context, format }\n}\n\nexport function resizeCanvas(\n canvas: HTMLCanvasElement,\n width?: number,\n height?: number,\n pixelRatio = typeof devicePixelRatio === \"number\" ? devicePixelRatio : 1,\n): void {\n const cssWidth = width ?? canvas.clientWidth\n const cssHeight = height ?? canvas.clientHeight\n canvas.width = Math.max(1, Math.floor(cssWidth * pixelRatio))\n canvas.height = Math.max(1, Math.floor(cssHeight * pixelRatio))\n}\n","/** Rounds `value` up to the nearest multiple of `alignment`. */\nexport function alignTo(value: number, alignment: number): number {\n return Math.ceil(value / alignment) * alignment\n}\n\n/** WebGPU requires GPUBuffer sizes to be a multiple of 4 bytes. */\nexport const GPU_BUFFER_SIZE_ALIGNMENT = 4\n\nexport function alignBufferSize(size: number): number {\n return alignTo(size, GPU_BUFFER_SIZE_ALIGNMENT)\n}\n","import { alignBufferSize } from \"../utils/alignment\"\nimport { assert } from \"../utils/validation\"\nimport type { Buffer, BufferDescriptor, StorageBufferDescriptor } from \"../types/public\"\n\nfunction byteLengthOf(data: ArrayBufferView | ArrayBuffer): number {\n return data instanceof ArrayBuffer ? data.byteLength : data.byteLength\n}\n\nexport function createBuffer(device: GPUDevice, descriptor: BufferDescriptor): Buffer {\n const { data, usage, label } = descriptor\n\n assert(\n data !== undefined || descriptor.size !== undefined,\n \"buffer descriptor must provide either `data` or `size`.\",\n )\n assert(\n descriptor.size === undefined || descriptor.size > 0,\n `invalid buffer size ${descriptor.size} — must be greater than 0.`,\n )\n\n const rawSize = descriptor.size ?? byteLengthOf(data as ArrayBufferView | ArrayBuffer)\n const size = alignBufferSize(rawSize)\n\n const mappedAtCreation = descriptor.mappedAtCreation ?? data !== undefined\n\n const raw = device.createBuffer({ label, size, usage, mappedAtCreation })\n\n if (data !== undefined && mappedAtCreation) {\n const dst = new Uint8Array(raw.getMappedRange())\n const src = data instanceof ArrayBuffer ? new Uint8Array(data) : new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n dst.set(src)\n raw.unmap()\n }\n\n const wrapper: Buffer = {\n raw,\n size,\n usage,\n label,\n write(writeData, offset = 0) {\n device.queue.writeBuffer(raw, offset, writeData instanceof ArrayBuffer ? writeData : writeData.buffer, writeData instanceof ArrayBuffer ? 0 : writeData.byteOffset, writeData instanceof ArrayBuffer ? writeData.byteLength : writeData.byteLength)\n },\n destroy() {\n raw.destroy()\n },\n }\n\n if (data !== undefined && !mappedAtCreation) {\n wrapper.write(data)\n }\n\n return wrapper\n}\n\nconst DEFAULT_STORAGE_USAGE =\n GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC\n\n/** Sugar over `createBuffer` defaulting usage to STORAGE | COPY_DST | COPY_SRC. */\nexport function createStorageBuffer(device: GPUDevice, descriptor: StorageBufferDescriptor): Buffer {\n return createBuffer(device, {\n label: descriptor.label,\n data: descriptor.data,\n size: descriptor.size,\n mappedAtCreation: descriptor.mappedAtCreation,\n usage: descriptor.usage ?? DEFAULT_STORAGE_USAGE,\n })\n}\n","import type { Texture, TextureDescriptor, TextureFromSourceDescriptor, TextureSource } from \"../types/public\"\n\nfunction wrapTexture(raw: GPUTexture, width: number, height: number, format: GPUTextureFormat): Texture {\n return {\n raw,\n width,\n height,\n format,\n createView(descriptor) {\n return raw.createView(descriptor)\n },\n destroy() {\n raw.destroy()\n },\n }\n}\n\nexport function createTexture(device: GPUDevice, descriptor: TextureDescriptor): Texture {\n const raw = device.createTexture({\n label: descriptor.label,\n size: {\n width: descriptor.width,\n height: descriptor.height,\n depthOrArrayLayers: descriptor.depthOrArrayLayers ?? 1,\n },\n format: descriptor.format,\n usage: descriptor.usage,\n mipLevelCount: descriptor.mipLevelCount,\n sampleCount: descriptor.sampleCount,\n dimension: descriptor.dimension,\n })\n\n return wrapTexture(raw, descriptor.width, descriptor.height, descriptor.format)\n}\n\nfunction sourceDimensions(source: TextureSource): { width: number; height: number } {\n if (typeof HTMLCanvasElement !== \"undefined\" && source instanceof HTMLCanvasElement) {\n return { width: source.width, height: source.height }\n }\n if (typeof OffscreenCanvas !== \"undefined\" && source instanceof OffscreenCanvas) {\n return { width: source.width, height: source.height }\n }\n // ImageBitmap and VideoFrame both expose width/height directly.\n const sized = source as { width: number; height: number }\n return { width: sized.width, height: sized.height }\n}\n\nexport function createTextureFromSource(\n device: GPUDevice,\n descriptor: TextureFromSourceDescriptor,\n): Texture {\n const { width, height } = sourceDimensions(descriptor.source)\n const format = descriptor.format ?? \"rgba8unorm\"\n const usage =\n descriptor.usage ??\n (GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT)\n\n const raw = device.createTexture({\n label: descriptor.label,\n size: { width, height },\n format,\n usage,\n })\n\n device.queue.copyExternalImageToTexture(\n { source: descriptor.source, flipY: descriptor.flipY },\n { texture: raw, premultipliedAlpha: descriptor.premultipliedAlpha },\n { width, height },\n )\n\n return wrapTexture(raw, width, height, format)\n}\n","/** Extremely thin — just forwards to device.createSampler and returns the native GPUSampler. */\nexport function createSampler(device: GPUDevice, descriptor: GPUSamplerDescriptor = {}): GPUSampler {\n return device.createSampler(descriptor)\n}\n","import type { Buffer, TypedArrayConstructor } from \"../types/public\"\n\n/**\n * Reads a GPUBuffer back to the CPU: creates a MAP_READ staging buffer, copies\n * into it, submits, maps, copies the mapped range out (so it survives unmap),\n * then cleans the staging buffer up. `buffer` must have been created with\n * COPY_SRC usage (storageBuffer() includes it by default).\n */\nexport async function readBuffer(device: GPUDevice, buffer: Buffer): Promise<ArrayBuffer>\nexport async function readBuffer<T extends TypedArrayConstructor>(\n device: GPUDevice,\n buffer: Buffer,\n ctor: T,\n): Promise<InstanceType<T>>\nexport async function readBuffer(\n device: GPUDevice,\n buffer: Buffer,\n ctor?: TypedArrayConstructor,\n): Promise<ArrayBuffer | InstanceType<TypedArrayConstructor>> {\n const staging = device.createBuffer({\n label: buffer.label ? `${buffer.label}:readback-staging` : \"readback-staging\",\n size: buffer.size,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n })\n\n const encoder = device.createCommandEncoder()\n encoder.copyBufferToBuffer(buffer.raw, 0, staging, 0, buffer.size)\n device.queue.submit([encoder.finish()])\n\n await staging.mapAsync(GPUMapMode.READ)\n const copy = staging.getMappedRange().slice(0)\n staging.unmap()\n staging.destroy()\n\n return ctor ? new ctor(copy) : copy\n}\n","import { OriaError } from \"../utils/validation\"\n\n/**\n * Creates a WGSL shader module. Compilation itself is synchronous from the\n * caller's point of view (matches native `device.createShaderModule`); any\n * compile errors are reported asynchronously via `getCompilationInfo` so\n * pipeline creation never has to block on shader validation.\n *\n * WGSL is the only supported shader language — there is no GLSL transpilation.\n */\nexport function createShaderModule(device: GPUDevice, code: string, label?: string): GPUShaderModule {\n const module = device.createShaderModule({ code, label })\n void reportShaderErrors(module, label)\n return module\n}\n\nasync function reportShaderErrors(module: GPUShaderModule, label?: string): Promise<void> {\n if (!module.getCompilationInfo) return\n const info = await module.getCompilationInfo()\n const errors = info.messages.filter((m) => m.type === \"error\")\n if (errors.length === 0) return\n\n const details = errors.map((m) => ` line ${m.lineNum}:${m.linePos} — ${m.message}`).join(\"\\n\")\n const error = new OriaError(`WGSL compilation failed${label ? ` in \"${label}\"` : \"\"}:\\n${details}`)\n console.error(error.message)\n}\n","/**\n * Small, predictable WGSL binding reflection.\n *\n * This is NOT a full WGSL parser — it recognizes the common module-scope\n * resource declaration shape:\n *\n * @group(N) @binding(M) var<storage, read_write> particles: array<Particle>;\n * @group(N) @binding(M) var tex: texture_2d<f32>;\n *\n * Attributes may appear in either order and across lines. Declarations that\n * don't match this shape (or that lack both @group and @binding) are simply\n * skipped rather than guessed at. If your shader needs something this parser\n * can't see, declare bind groups manually via the native `GPUDevice` — see\n * the README's \"escape hatches\" section.\n */\n\nexport type ResourceCategory =\n | \"uniform-buffer\"\n | \"storage-buffer\"\n | \"read-only-storage-buffer\"\n | \"sampler\"\n | \"comparison-sampler\"\n | \"texture\"\n | \"storage-texture\"\n | \"external-texture\"\n\nexport interface BindingReflection {\n name: string\n group: number\n binding: number\n resourceType: ResourceCategory\n /** The raw WGSL type token, e.g. \"texture_2d<f32>\" or \"Camera\". Useful in error messages. */\n wgslType: string\n}\n\nconst DECLARATION_RE = /((?:@\\w+\\([^)]*\\)\\s*)+)var(<[^>]*>)?\\s+(\\w+)\\s*:\\s*([^;=]+)[;=]/g\nconst ATTR_RE = /@(\\w+)\\(([^)]*)\\)/g\n\nfunction stripComments(code: string): string {\n return code.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \" \").replace(/\\/\\/.*$/gm, \"\")\n}\n\nfunction classifyResource(storageHint: string | undefined, wgslType: string): ResourceCategory {\n if (storageHint) {\n const [storageClass, access] = storageHint\n .slice(1, -1)\n .split(\",\")\n .map((s) => s.trim())\n if (storageClass === \"uniform\") return \"uniform-buffer\"\n if (storageClass === \"storage\") {\n return access === \"read_write\" ? \"storage-buffer\" : \"read-only-storage-buffer\"\n }\n }\n\n const t = wgslType.trim()\n if (t === \"sampler\") return \"sampler\"\n if (t === \"sampler_comparison\") return \"comparison-sampler\"\n if (t.startsWith(\"texture_storage_\")) return \"storage-texture\"\n if (t === \"texture_external\") return \"external-texture\"\n if (t.startsWith(\"texture_\")) return \"texture\"\n // Anything else at module scope with @group/@binding is treated as a uniform buffer\n // (the common case for a plain struct type with no explicit address space token).\n return \"uniform-buffer\"\n}\n\nexport function reflectWGSLBindings(code: string): BindingReflection[] {\n const source = stripComments(code)\n const bindings: BindingReflection[] = []\n\n for (const match of source.matchAll(DECLARATION_RE)) {\n const [, attrCluster, storageHint, name, wgslType] = match\n let group: number | undefined\n let binding: number | undefined\n\n for (const attrMatch of attrCluster!.matchAll(ATTR_RE)) {\n const [, attrName, attrValue] = attrMatch\n if (attrName === \"group\") group = Number(attrValue)\n if (attrName === \"binding\") binding = Number(attrValue)\n }\n\n if (group === undefined || binding === undefined) continue\n\n bindings.push({\n name: name!,\n group,\n binding,\n resourceType: classifyResource(storageHint, wgslType!),\n wgslType: wgslType!.trim(),\n })\n }\n\n return bindings\n}\n","import type { BindingReflection } from \"../shader/reflection\"\n\n/** Groups flat reflection results by their @group index. */\nexport function groupByGroupIndex(reflection: BindingReflection[]): Map<number, BindingReflection[]> {\n const grouped = new Map<number, BindingReflection[]>()\n for (const decl of reflection) {\n const list = grouped.get(decl.group)\n if (list) list.push(decl)\n else grouped.set(decl.group, [decl])\n }\n return grouped\n}\n\n/** Merges reflection from multiple shader stages (e.g. vertex + fragment) by name. */\nexport function mergeReflection(...stages: BindingReflection[][]): BindingReflection[] {\n const byName = new Map<string, BindingReflection>()\n for (const stage of stages) {\n for (const decl of stage) {\n byName.set(decl.name, decl)\n }\n }\n return [...byName.values()]\n}\n","import { OriaError } from \"../utils/validation\"\nimport { groupByGroupIndex } from \"./bind-group-layout\"\nimport type { BindingReflection, ResourceCategory } from \"../shader/reflection\"\nimport type { BindingResource, Buffer as WrappedBuffer, Texture as WrappedTexture } from \"../types/public\"\n\n/**\n * Resource-shape checks are structural rather than `instanceof GPUBuffer` etc.\n * WebGPU's own classes only exist in a real browser context, so `instanceof`\n * checks against them can't be unit tested without a live GPUDevice. Our own\n * wrapper types are distinguished by the `raw` property native objects lack.\n */\n\nfunction isWrappedBuffer(value: unknown): value is WrappedBuffer {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"raw\" in value &&\n typeof (value as { write?: unknown }).write === \"function\"\n )\n}\n\nfunction isRawGPUBuffer(value: unknown): value is GPUBuffer {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !(\"raw\" in value) &&\n typeof (value as { destroy?: unknown }).destroy === \"function\" &&\n typeof (value as { size?: unknown }).size === \"number\"\n )\n}\n\nfunction unwrapBuffer(value: WrappedBuffer | GPUBuffer): GPUBuffer {\n return isWrappedBuffer(value) ? value.raw : (value as GPUBuffer)\n}\n\nfunction isWrappedTexture(value: unknown): value is WrappedTexture {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"raw\" in value &&\n typeof (value as { createView?: unknown }).createView === \"function\"\n )\n}\n\nfunction isRawGPUTexture(value: unknown): value is GPUTexture {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !(\"raw\" in value) &&\n typeof (value as { createView?: unknown }).createView === \"function\" &&\n typeof (value as { destroy?: unknown }).destroy === \"function\"\n )\n}\n\nfunction unknownBindingError(name: string, known: BindingReflection[]): OriaError {\n const names = known.map((d) => `\"${d.name}\"`).join(\", \")\n return new OriaError(\n `Unknown shader binding \"${name}\" — no @group/@binding declaration for this name was found ` +\n `in the pipeline's WGSL.\\n\\nDeclared bindings: ${names || \"(none)\"}`,\n )\n}\n\nfunction typeMismatchError(decl: BindingReflection, expected: string): OriaError {\n return new OriaError(\n `Binding \"${decl.name}\" expected ${expected}, based on its WGSL declaration:\\n` +\n ` @group(${decl.group}) @binding(${decl.binding}) var ... ${decl.name}: ${decl.wgslType};`,\n )\n}\n\nfunction toBindGroupEntryResource(decl: BindingReflection, resource: BindingResource): GPUBindingResource {\n const category: ResourceCategory = decl.resourceType\n\n switch (category) {\n case \"uniform-buffer\":\n case \"storage-buffer\":\n case \"read-only-storage-buffer\": {\n if (isWrappedBuffer(resource) || isRawGPUBuffer(resource)) {\n return { buffer: unwrapBuffer(resource) }\n }\n if (typeof resource === \"object\" && resource !== null && \"buffer\" in resource) {\n const { buffer, offset, size } = resource as {\n buffer: WrappedBuffer | GPUBuffer\n offset?: number\n size?: number\n }\n return { buffer: unwrapBuffer(buffer), offset, size }\n }\n throw typeMismatchError(decl, \"a GPUBuffer (or Oria Buffer)\")\n }\n\n case \"sampler\":\n case \"comparison-sampler\":\n // GPUSampler is an opaque native object with no distinguishing shape to check.\n return resource as GPUSampler\n\n case \"texture\":\n case \"storage-texture\": {\n if (isWrappedTexture(resource)) return resource.createView()\n if (isRawGPUTexture(resource)) return resource.createView()\n // Otherwise assume an already-created GPUTextureView was passed directly.\n return resource as GPUTextureView\n }\n\n case \"external-texture\":\n return resource as GPUExternalTexture\n }\n}\n\n/**\n * Resolves named resources to GPUBindGroups for one pipeline, using its WGSL\n * reflection and the pipeline's own auto-generated bind group layouts.\n *\n * State accumulates across calls: setting `camera` now and `texSampler`/`tex`\n * later keeps `camera` in that @group's bind group. A group is only (re)built\n * once every binding it declares has been supplied at least once; until then\n * `apply()` just caches what it was given and waits. A group that never gets\n * completed produces no entry in `boundGroups` — WebGPU's own validation will\n * report a missing bind group if you draw/dispatch with the pipeline anyway.\n */\nexport class BindGroupResolver {\n private readonly byName: Map<string, BindingReflection>\n private readonly byGroup: Map<number, BindingReflection[]>\n private readonly resourceCache = new Map<string, BindingResource>()\n private readonly groupCache = new Map<number, GPUBindGroup>()\n\n constructor(\n private readonly device: GPUDevice,\n private readonly getBindGroupLayout: (group: number) => GPUBindGroupLayout,\n reflection: BindingReflection[],\n ) {\n this.byName = new Map(reflection.map((decl) => [decl.name, decl]))\n this.byGroup = groupByGroupIndex(reflection)\n }\n\n get boundGroups(): ReadonlyMap<number, GPUBindGroup> {\n return this.groupCache\n }\n\n apply(namedResources: Record<string, BindingResource>): void {\n const touchedGroups = new Set<number>()\n\n for (const [name, resource] of Object.entries(namedResources)) {\n const decl = this.byName.get(name)\n if (!decl) throw unknownBindingError(name, [...this.byName.values()])\n this.resourceCache.set(name, resource)\n touchedGroups.add(decl.group)\n }\n\n for (const group of touchedGroups) {\n const built = this.buildGroup(group)\n if (built) this.groupCache.set(group, built)\n }\n }\n\n private buildGroup(group: number): GPUBindGroup | undefined {\n const decls = this.byGroup.get(group) ?? []\n if (decls.some((decl) => !this.resourceCache.has(decl.name))) return undefined\n\n const entries: GPUBindGroupEntry[] = decls.map((decl) => ({\n binding: decl.binding,\n resource: toBindGroupEntryResource(decl, this.resourceCache.get(decl.name)!),\n }))\n\n return this.device.createBindGroup({\n layout: this.getBindGroupLayout(group),\n entries,\n })\n }\n}\n","import { createShaderModule } from \"../shader/shader\"\nimport { reflectWGSLBindings } from \"../shader/reflection\"\nimport { mergeReflection } from \"../binding/bind-group-layout\"\nimport { BindGroupResolver } from \"../binding/bind-group\"\nimport type { BindingResource, RenderPipelineDescriptor, RenderPipeline } from \"../types/public\"\n\nfunction resolveTarget(\n target: GPUColorTargetState | GPUTextureFormat | null,\n): GPUColorTargetState | null {\n if (target === null) return null\n if (typeof target === \"string\") return { format: target }\n return target\n}\n\nexport function createRenderPipeline(\n device: GPUDevice,\n descriptor: RenderPipelineDescriptor,\n): RenderPipeline {\n const vertexModule = createShaderModule(\n device,\n descriptor.vertex.code,\n descriptor.label ? `${descriptor.label}:vertex` : undefined,\n )\n\n const fragmentModule = descriptor.fragment\n ? createShaderModule(\n device,\n descriptor.fragment.code,\n descriptor.label ? `${descriptor.label}:fragment` : undefined,\n )\n : undefined\n\n const raw = device.createRenderPipeline({\n label: descriptor.label,\n layout: descriptor.layout ?? \"auto\",\n vertex: {\n module: vertexModule,\n entryPoint: descriptor.vertex.entryPoint,\n buffers: descriptor.vertex.buffers,\n constants: descriptor.vertex.constants,\n },\n fragment: descriptor.fragment\n ? {\n module: fragmentModule as GPUShaderModule,\n entryPoint: descriptor.fragment.entryPoint,\n targets: descriptor.fragment.targets.map(resolveTarget),\n constants: descriptor.fragment.constants,\n }\n : undefined,\n primitive: descriptor.primitive,\n depthStencil: descriptor.depthStencil,\n multisample: descriptor.multisample,\n })\n\n const reflection = mergeReflection(\n reflectWGSLBindings(descriptor.vertex.code),\n descriptor.fragment ? reflectWGSLBindings(descriptor.fragment.code) : [],\n )\n const resolver = new BindGroupResolver(device, (group) => raw.getBindGroupLayout(group), reflection)\n\n const pipeline: RenderPipeline = {\n raw,\n label: descriptor.label,\n bindings(namedResources: Record<string, BindingResource>) {\n resolver.apply(namedResources)\n return pipeline\n },\n get boundGroups() {\n return resolver.boundGroups\n },\n }\n\n return pipeline\n}\n","import { createShaderModule } from \"../shader/shader\"\nimport { reflectWGSLBindings } from \"../shader/reflection\"\nimport { BindGroupResolver } from \"../binding/bind-group\"\nimport type { BindingResource, ComputePipeline, ComputePipelineDescriptor } from \"../types/public\"\n\nexport function createComputePipeline(\n device: GPUDevice,\n descriptor: ComputePipelineDescriptor,\n): ComputePipeline {\n const module = createShaderModule(device, descriptor.code, descriptor.label)\n\n const raw = device.createComputePipeline({\n label: descriptor.label,\n layout: descriptor.layout ?? \"auto\",\n compute: {\n module,\n entryPoint: descriptor.entryPoint,\n constants: descriptor.constants,\n },\n })\n\n const reflection = reflectWGSLBindings(descriptor.code)\n const resolver = new BindGroupResolver(device, (group) => raw.getBindGroupLayout(group), reflection)\n\n const pipeline: ComputePipeline = {\n raw,\n label: descriptor.label,\n bindings(namedResources: Record<string, BindingResource>) {\n resolver.apply(namedResources)\n return pipeline\n },\n get boundGroups() {\n return resolver.boundGroups\n },\n }\n\n return pipeline\n}\n","/**\n * Deterministic, order-independent serialization for building stable cache\n * keys from plain descriptor objects (shader source, layouts, formats, ...).\n * Not suitable for values containing functions, symbols, or cyclic references.\n */\nexport function stableStringify(value: unknown): string {\n if (value === undefined) return \"undefined\"\n if (value === null || typeof value !== \"object\") return JSON.stringify(value)\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`\n }\n\n const record = value as Record<string, unknown>\n const keys = Object.keys(record).sort()\n const body = keys.map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`).join(\",\")\n return `{${body}}`\n}\n\n/** FNV-1a 32-bit — fast and stable for an in-memory cache key. Not cryptographic. */\nexport function hashString(input: string): string {\n let hash = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return (hash >>> 0).toString(16)\n}\n\nconst identityTokens = new WeakMap<object, string>()\nlet nextIdentityToken = 0\n\n/** A stable per-process token for an object reference, for use inside cache keys. */\nexport function identityToken(obj: object): string {\n let token = identityTokens.get(obj)\n if (token === undefined) {\n token = `id${nextIdentityToken++}`\n identityTokens.set(obj, token)\n }\n return token\n}\n","import { hashString, identityToken, stableStringify } from \"../utils/hash\"\nimport type { ComputePipelineDescriptor, RenderPipelineDescriptor } from \"../types/public\"\n\nfunction keyOfLayout(layout: GPUPipelineLayout | \"auto\" | undefined): string {\n if (layout === undefined || layout === \"auto\") return \"auto\"\n return identityToken(layout)\n}\n\n/**\n * Cache keys deliberately exclude `bindings` — resolving named resources to\n * bind groups is a separate, always-reapplied step (see gpu.ts), not part of\n * what makes two pipeline descriptors \"the same pipeline\".\n */\nexport function renderPipelineCacheKey(descriptor: RenderPipelineDescriptor): string {\n const relevant = {\n vertex: {\n code: descriptor.vertex.code,\n entryPoint: descriptor.vertex.entryPoint,\n buffers: descriptor.vertex.buffers,\n constants: descriptor.vertex.constants,\n },\n fragment: descriptor.fragment\n ? {\n code: descriptor.fragment.code,\n entryPoint: descriptor.fragment.entryPoint,\n targets: descriptor.fragment.targets,\n constants: descriptor.fragment.constants,\n }\n : undefined,\n primitive: descriptor.primitive,\n depthStencil: descriptor.depthStencil,\n multisample: descriptor.multisample,\n layout: keyOfLayout(descriptor.layout),\n }\n return hashString(stableStringify(relevant))\n}\n\nexport function computePipelineCacheKey(descriptor: ComputePipelineDescriptor): string {\n const relevant = {\n code: descriptor.code,\n entryPoint: descriptor.entryPoint,\n constants: descriptor.constants,\n layout: keyOfLayout(descriptor.layout),\n }\n return hashString(stableStringify(relevant))\n}\n\n/** A minimal keyed cache: builds once per distinct key, reuses thereafter. */\nexport class PipelineCache<TDescriptor, TPipeline> {\n private readonly cache = new Map<string, TPipeline>()\n\n constructor(\n private readonly keyOf: (descriptor: TDescriptor) => string,\n private readonly create: (descriptor: TDescriptor) => TPipeline,\n ) {}\n\n get(descriptor: TDescriptor): TPipeline {\n const key = this.keyOf(descriptor)\n let pipeline = this.cache.get(key)\n if (!pipeline) {\n pipeline = this.create(descriptor)\n this.cache.set(key, pipeline)\n }\n return pipeline\n }\n\n clear(): void {\n this.cache.clear()\n }\n}\n","import { assert } from \"../utils/validation\"\nimport type { BindingResource, RenderPassBuilder, RenderPipeline, Buffer } from \"../types/public\"\n\nfunction applyBoundGroups(raw: GPURenderPassEncoder, pipeline: RenderPipeline): void {\n for (const [group, bindGroup] of pipeline.boundGroups) {\n raw.setBindGroup(group, bindGroup)\n }\n}\n\nexport function createRenderPassBuilder(raw: GPURenderPassEncoder): RenderPassBuilder {\n let currentPipeline: RenderPipeline | undefined\n\n const builder: RenderPassBuilder = {\n raw,\n pipeline(pipeline: RenderPipeline) {\n raw.setPipeline(pipeline.raw)\n currentPipeline = pipeline\n applyBoundGroups(raw, pipeline)\n return builder\n },\n bindings(namedResources: Record<string, BindingResource>) {\n assert(currentPipeline !== undefined, \"pass.bindings() requires pass.pipeline(...) to be called first.\")\n currentPipeline.bindings(namedResources)\n applyBoundGroups(raw, currentPipeline)\n return builder\n },\n vertexBuffer(slot: number, buffer: Buffer, offset?: number, size?: number) {\n raw.setVertexBuffer(slot, buffer.raw, offset, size)\n return builder\n },\n indexBuffer(buffer: Buffer, format: GPUIndexFormat, offset?: number, size?: number) {\n raw.setIndexBuffer(buffer.raw, format, offset, size)\n return builder\n },\n draw(vertexCount: number, instanceCount?: number, firstVertex?: number, firstInstance?: number) {\n raw.draw(vertexCount, instanceCount, firstVertex, firstInstance)\n return builder\n },\n drawIndexed(\n indexCount: number,\n instanceCount?: number,\n firstIndex?: number,\n baseVertex?: number,\n firstInstance?: number,\n ) {\n raw.drawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance)\n return builder\n },\n }\n return builder\n}\n","import { assert } from \"../utils/validation\"\nimport type { BindingResource, ComputePassBuilder, ComputePipeline } from \"../types/public\"\n\nfunction applyBoundGroups(raw: GPUComputePassEncoder, pipeline: ComputePipeline): void {\n for (const [group, bindGroup] of pipeline.boundGroups) {\n raw.setBindGroup(group, bindGroup)\n }\n}\n\nexport function createComputePassBuilder(raw: GPUComputePassEncoder): ComputePassBuilder {\n let currentPipeline: ComputePipeline | undefined\n\n const builder: ComputePassBuilder = {\n raw,\n pipeline(pipeline: ComputePipeline) {\n raw.setPipeline(pipeline.raw)\n currentPipeline = pipeline\n applyBoundGroups(raw, pipeline)\n return builder\n },\n bindings(namedResources: Record<string, BindingResource>) {\n assert(currentPipeline !== undefined, \"pass.bindings() requires pass.pipeline(...) to be called first.\")\n currentPipeline.bindings(namedResources)\n applyBoundGroups(raw, currentPipeline)\n return builder\n },\n dispatch(x: number, y?: number, z?: number) {\n raw.dispatchWorkgroups(x, y, z)\n return builder\n },\n }\n return builder\n}\n","/** Creates a command encoder, runs `fn` against it, and submits the result. */\nexport function withCommandEncoder(\n device: GPUDevice,\n label: string | undefined,\n fn: (encoder: GPUCommandEncoder) => void,\n): void {\n const encoder = device.createCommandEncoder({ label })\n fn(encoder)\n device.queue.submit([encoder.finish()])\n}\n","import { requestDevice } from \"./device\"\nimport { configureCanvasContext, resizeCanvas } from \"./context\"\nimport { createBuffer, createStorageBuffer } from \"../resources/buffer\"\nimport { createTexture, createTextureFromSource } from \"../resources/texture\"\nimport { createSampler } from \"../resources/sampler\"\nimport { readBuffer } from \"../resources/readback\"\nimport { createRenderPipeline } from \"../pipeline/render-pipeline\"\nimport { createComputePipeline } from \"../pipeline/compute-pipeline\"\nimport { PipelineCache, computePipelineCacheKey, renderPipelineCacheKey } from \"../pipeline/pipeline-cache\"\nimport { createRenderPassBuilder } from \"../pass/render-pass\"\nimport { createComputePassBuilder } from \"../pass/compute-pass\"\nimport { withCommandEncoder } from \"../commands/command-encoder\"\nimport { assert } from \"../utils/validation\"\nimport type {\n BufferDescriptor,\n Buffer,\n ComputePassBuilder,\n ComputePipeline,\n ComputePipelineDescriptor,\n CreateGPUOptions,\n DepthTextureDescriptor,\n GPUContext,\n RenderPassBuilder,\n RenderPipeline,\n RenderPipelineDescriptor,\n RenderTargetOptions,\n ResizeOptions,\n StorageBufferDescriptor,\n Texture,\n TextureDescriptor,\n TextureFromSourceDescriptor,\n TypedArrayConstructor,\n} from \"../types/public\"\n\nclass GPUContextImpl implements GPUContext {\n readonly adapter: GPUAdapter\n readonly device: GPUDevice\n readonly context: GPUCanvasContext\n readonly format: GPUTextureFormat\n readonly canvas: HTMLCanvasElement\n\n private readonly options: CreateGPUOptions\n private readonly ownedBuffers = new Set<Buffer>()\n private readonly ownedTextures = new Set<Texture>()\n private deviceLostCallback: ((info: GPUDeviceLostInfo) => void) | undefined\n\n private readonly renderPipelineCache: PipelineCache<RenderPipelineDescriptor, RenderPipeline>\n private readonly computePipelineCache: PipelineCache<ComputePipelineDescriptor, ComputePipeline>\n\n constructor(\n canvas: HTMLCanvasElement,\n adapter: GPUAdapter,\n device: GPUDevice,\n context: GPUCanvasContext,\n format: GPUTextureFormat,\n options: CreateGPUOptions,\n ) {\n this.canvas = canvas\n this.adapter = adapter\n this.device = device\n this.context = context\n this.format = format\n this.options = options\n\n this.renderPipelineCache = new PipelineCache(renderPipelineCacheKey, (d) =>\n createRenderPipeline(this.device, d),\n )\n this.computePipelineCache = new PipelineCache(computePipelineCacheKey, (d) =>\n createComputePipeline(this.device, d),\n )\n\n void device.lost.then((info) => {\n this.deviceLostCallback?.(info)\n })\n }\n\n buffer(descriptor: BufferDescriptor): Buffer {\n const buf = createBuffer(this.device, descriptor)\n this.ownedBuffers.add(buf)\n return buf\n }\n\n storageBuffer(descriptor: StorageBufferDescriptor): Buffer {\n const buf = createStorageBuffer(this.device, descriptor)\n this.ownedBuffers.add(buf)\n return buf\n }\n\n texture(descriptor: TextureDescriptor): Texture {\n const tex = createTexture(this.device, descriptor)\n this.ownedTextures.add(tex)\n return tex\n }\n\n textureFromSource(descriptor: TextureFromSourceDescriptor): Texture {\n const tex = createTextureFromSource(this.device, descriptor)\n this.ownedTextures.add(tex)\n return tex\n }\n\n depthTexture(descriptor: DepthTextureDescriptor = {}): Texture {\n const tex = createTexture(this.device, {\n label: descriptor.label,\n width: descriptor.width ?? this.canvas.width,\n height: descriptor.height ?? this.canvas.height,\n format: descriptor.format ?? \"depth24plus\",\n sampleCount: descriptor.sampleCount,\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n })\n this.ownedTextures.add(tex)\n return tex\n }\n\n sampler(descriptor?: GPUSamplerDescriptor): GPUSampler {\n return createSampler(this.device, descriptor)\n }\n\n readBuffer(buffer: Buffer): Promise<ArrayBuffer>\n readBuffer<T extends TypedArrayConstructor>(buffer: Buffer, ctor: T): Promise<InstanceType<T>>\n readBuffer(buffer: Buffer, ctor?: TypedArrayConstructor) {\n return ctor ? readBuffer(this.device, buffer, ctor) : readBuffer(this.device, buffer)\n }\n\n renderPipeline(descriptor: RenderPipelineDescriptor): RenderPipeline {\n const pipeline = this.renderPipelineCache.get(descriptor)\n if (descriptor.bindings) pipeline.bindings(descriptor.bindings)\n return pipeline\n }\n\n computePipeline(descriptor: ComputePipelineDescriptor): ComputePipeline {\n const pipeline = this.computePipelineCache.get(descriptor)\n if (descriptor.bindings) pipeline.bindings(descriptor.bindings)\n return pipeline\n }\n\n clearPipelineCache(): void {\n this.renderPipelineCache.clear()\n this.computePipelineCache.clear()\n }\n\n render(callback: (pass: RenderPassBuilder) => void): void\n render(options: RenderTargetOptions, callback: (pass: RenderPassBuilder) => void): void\n render(\n optionsOrCallback: RenderTargetOptions | ((pass: RenderPassBuilder) => void),\n maybeCallback?: (pass: RenderPassBuilder) => void,\n ): void {\n const options: RenderTargetOptions = typeof optionsOrCallback === \"function\" ? {} : optionsOrCallback\n const callback = typeof optionsOrCallback === \"function\" ? optionsOrCallback : maybeCallback\n assert(callback !== undefined, \"render() requires a callback.\")\n\n const colorTexture = options.target ?? this.context.getCurrentTexture()\n\n withCommandEncoder(this.device, undefined, (encoder) => {\n const raw = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: colorTexture.createView(),\n clearValue: options.clearColor ?? { r: 0, g: 0, b: 0, a: 1 },\n loadOp: options.loadOp ?? \"clear\",\n storeOp: options.storeOp ?? \"store\",\n },\n ],\n })\n\n callback(createRenderPassBuilder(raw))\n raw.end()\n })\n }\n\n compute(callback: (pass: ComputePassBuilder) => void): void {\n withCommandEncoder(this.device, undefined, (encoder) => {\n const raw = encoder.beginComputePass()\n callback(createComputePassBuilder(raw))\n raw.end()\n })\n }\n\n command(callback: (encoder: GPUCommandEncoder) => void): void {\n withCommandEncoder(this.device, undefined, callback)\n }\n\n resize(options: ResizeOptions = {}): void {\n resizeCanvas(\n this.canvas,\n options.width,\n options.height,\n options.pixelRatio ?? this.options.pixelRatio,\n )\n }\n\n onDeviceLost(callback: (info: GPUDeviceLostInfo) => void): void {\n this.deviceLostCallback = callback\n }\n\n dispose(): void {\n for (const buf of this.ownedBuffers) buf.destroy()\n this.ownedBuffers.clear()\n for (const tex of this.ownedTextures) tex.destroy()\n this.ownedTextures.clear()\n this.device.destroy()\n }\n}\n\nexport async function createGPU(\n canvas: HTMLCanvasElement,\n options: CreateGPUOptions = {},\n): Promise<GPUContext> {\n const { adapter, device } = await requestDevice(options)\n const { context, format } = configureCanvasContext(canvas, device, options)\n\n resizeCanvas(canvas, undefined, undefined, options.pixelRatio)\n\n return new GPUContextImpl(canvas, adapter, device, context, format, options)\n}\n"],"names":["OriaError","message","assert","condition","requestDevice","options","adapter","device","cause","configureCanvasContext","canvas","context","format","resizeCanvas","width","height","pixelRatio","cssWidth","cssHeight","alignTo","value","alignment","GPU_BUFFER_SIZE_ALIGNMENT","alignBufferSize","size","byteLengthOf","data","createBuffer","descriptor","usage","label","rawSize","mappedAtCreation","raw","dst","src","wrapper","writeData","offset","DEFAULT_STORAGE_USAGE","createStorageBuffer","wrapTexture","createTexture","sourceDimensions","source","sized","createTextureFromSource","createSampler","readBuffer","buffer","ctor","staging","encoder","copy","createShaderModule","code","module","reportShaderErrors","errors","m","details","error","DECLARATION_RE","ATTR_RE","stripComments","classifyResource","storageHint","wgslType","storageClass","access","s","t","reflectWGSLBindings","bindings","match","attrCluster","name","group","binding","attrMatch","attrName","attrValue","groupByGroupIndex","reflection","grouped","decl","list","mergeReflection","stages","byName","stage","isWrappedBuffer","isRawGPUBuffer","unwrapBuffer","isWrappedTexture","isRawGPUTexture","unknownBindingError","known","names","d","typeMismatchError","expected","toBindGroupEntryResource","resource","BindGroupResolver","getBindGroupLayout","namedResources","touchedGroups","built","decls","entries","resolveTarget","target","createRenderPipeline","vertexModule","fragmentModule","resolver","pipeline","createComputePipeline","stableStringify","record","key","hashString","input","hash","i","identityTokens","nextIdentityToken","identityToken","obj","token","keyOfLayout","layout","renderPipelineCacheKey","relevant","computePipelineCacheKey","PipelineCache","keyOf","create","applyBoundGroups","bindGroup","createRenderPassBuilder","currentPipeline","builder","slot","vertexCount","instanceCount","firstVertex","firstInstance","indexCount","firstIndex","baseVertex","createComputePassBuilder","x","y","z","withCommandEncoder","fn","GPUContextImpl","info","buf","tex","optionsOrCallback","maybeCallback","callback","colorTexture","createGPU"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-pass.d.ts","sourceRoot":"","sources":["../../src/pass/compute-pass.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,kBAAkB,EAAmB,MAAM,iBAAiB,CAAA;AAQ3F,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,qBAAqB,GAAG,kBAAkB,CAuBvF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-pass.d.ts","sourceRoot":"","sources":["../../src/pass/render-pass.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,iBAAiB,EAA0B,MAAM,iBAAiB,CAAA;AAQjG,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,oBAAoB,GAAG,iBAAiB,CAyCpF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-pipeline.d.ts","sourceRoot":"","sources":["../../src/pipeline/compute-pipeline.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmB,eAAe,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAElG,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,yBAAyB,GACpC,eAAe,CA6BjB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ComputePipelineDescriptor, RenderPipelineDescriptor } from "../types/public";
|
|
2
|
+
/**
|
|
3
|
+
* Cache keys deliberately exclude `bindings` — resolving named resources to
|
|
4
|
+
* bind groups is a separate, always-reapplied step (see gpu.ts), not part of
|
|
5
|
+
* what makes two pipeline descriptors "the same pipeline".
|
|
6
|
+
*/
|
|
7
|
+
export declare function renderPipelineCacheKey(descriptor: RenderPipelineDescriptor): string;
|
|
8
|
+
export declare function computePipelineCacheKey(descriptor: ComputePipelineDescriptor): string;
|
|
9
|
+
/** A minimal keyed cache: builds once per distinct key, reuses thereafter. */
|
|
10
|
+
export declare class PipelineCache<TDescriptor, TPipeline> {
|
|
11
|
+
private readonly keyOf;
|
|
12
|
+
private readonly create;
|
|
13
|
+
private readonly cache;
|
|
14
|
+
constructor(keyOf: (descriptor: TDescriptor) => string, create: (descriptor: TDescriptor) => TPipeline);
|
|
15
|
+
get(descriptor: TDescriptor): TPipeline;
|
|
16
|
+
clear(): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=pipeline-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-cache.d.ts","sourceRoot":"","sources":["../../src/pipeline/pipeline-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAO1F;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,wBAAwB,GAAG,MAAM,CAsBnF;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,yBAAyB,GAAG,MAAM,CAQrF;AAED,8EAA8E;AAC9E,qBAAa,aAAa,CAAC,WAAW,EAAE,SAAS;IAI7C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAGlC,KAAK,EAAE,CAAC,UAAU,EAAE,WAAW,KAAK,MAAM,EAC1C,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,KAAK,SAAS;IAGjE,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,SAAS;IAUvC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-pipeline.d.ts","sourceRoot":"","sources":["../../src/pipeline/render-pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAmB,wBAAwB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAUhG,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,wBAAwB,GACnC,cAAc,CAwDhB"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Buffer, BufferDescriptor, StorageBufferDescriptor } from "../types/public";
|
|
2
|
+
export declare function createBuffer(device: GPUDevice, descriptor: BufferDescriptor): Buffer;
|
|
3
|
+
/** Sugar over `createBuffer` defaulting usage to STORAGE | COPY_DST | COPY_SRC. */
|
|
4
|
+
export declare function createStorageBuffer(device: GPUDevice, descriptor: StorageBufferDescriptor): Buffer;
|
|
5
|
+
//# sourceMappingURL=buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer.d.ts","sourceRoot":"","sources":["../../src/resources/buffer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAMxF,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,GAAG,MAAM,CA4CpF;AAKD,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,uBAAuB,GAAG,MAAM,CAQlG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Buffer, TypedArrayConstructor } from "../types/public";
|
|
2
|
+
/**
|
|
3
|
+
* Reads a GPUBuffer back to the CPU: creates a MAP_READ staging buffer, copies
|
|
4
|
+
* into it, submits, maps, copies the mapped range out (so it survives unmap),
|
|
5
|
+
* then cleans the staging buffer up. `buffer` must have been created with
|
|
6
|
+
* COPY_SRC usage (storageBuffer() includes it by default).
|
|
7
|
+
*/
|
|
8
|
+
export declare function readBuffer(device: GPUDevice, buffer: Buffer): Promise<ArrayBuffer>;
|
|
9
|
+
export declare function readBuffer<T extends TypedArrayConstructor>(device: GPUDevice, buffer: Buffer, ctor: T): Promise<InstanceType<T>>;
|
|
10
|
+
//# sourceMappingURL=readback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readback.d.ts","sourceRoot":"","sources":["../../src/resources/readback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAEpE;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AACzF,wBAAsB,UAAU,CAAC,CAAC,SAAS,qBAAqB,EAC9D,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampler.d.ts","sourceRoot":"","sources":["../../src/resources/sampler.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,GAAE,oBAAyB,GAAG,UAAU,CAElG"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Texture, TextureDescriptor, TextureFromSourceDescriptor } from "../types/public";
|
|
2
|
+
export declare function createTexture(device: GPUDevice, descriptor: TextureDescriptor): Texture;
|
|
3
|
+
export declare function createTextureFromSource(device: GPUDevice, descriptor: TextureFromSourceDescriptor): Texture;
|
|
4
|
+
//# sourceMappingURL=texture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"texture.d.ts","sourceRoot":"","sources":["../../src/resources/texture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAiB,MAAM,iBAAiB,CAAA;AAiB7G,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAgBvF;AAcD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,2BAA2B,GACtC,OAAO,CAqBT"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small, predictable WGSL binding reflection.
|
|
3
|
+
*
|
|
4
|
+
* This is NOT a full WGSL parser — it recognizes the common module-scope
|
|
5
|
+
* resource declaration shape:
|
|
6
|
+
*
|
|
7
|
+
* @group(N) @binding(M) var<storage, read_write> particles: array<Particle>;
|
|
8
|
+
* @group(N) @binding(M) var tex: texture_2d<f32>;
|
|
9
|
+
*
|
|
10
|
+
* Attributes may appear in either order and across lines. Declarations that
|
|
11
|
+
* don't match this shape (or that lack both @group and @binding) are simply
|
|
12
|
+
* skipped rather than guessed at. If your shader needs something this parser
|
|
13
|
+
* can't see, declare bind groups manually via the native `GPUDevice` — see
|
|
14
|
+
* the README's "escape hatches" section.
|
|
15
|
+
*/
|
|
16
|
+
export type ResourceCategory = "uniform-buffer" | "storage-buffer" | "read-only-storage-buffer" | "sampler" | "comparison-sampler" | "texture" | "storage-texture" | "external-texture";
|
|
17
|
+
export interface BindingReflection {
|
|
18
|
+
name: string;
|
|
19
|
+
group: number;
|
|
20
|
+
binding: number;
|
|
21
|
+
resourceType: ResourceCategory;
|
|
22
|
+
/** The raw WGSL type token, e.g. "texture_2d<f32>" or "Camera". Useful in error messages. */
|
|
23
|
+
wgslType: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function reflectWGSLBindings(code: string): BindingReflection[];
|
|
26
|
+
//# sourceMappingURL=reflection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflection.d.ts","sourceRoot":"","sources":["../../src/shader/reflection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,gBAAgB,GACxB,gBAAgB,GAChB,gBAAgB,GAChB,0BAA0B,GAC1B,SAAS,GACT,oBAAoB,GACpB,SAAS,GACT,iBAAiB,GACjB,kBAAkB,CAAA;AAEtB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,gBAAgB,CAAA;IAC9B,6FAA6F;IAC7F,QAAQ,EAAE,MAAM,CAAA;CACjB;AAgCD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA2BrE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a WGSL shader module. Compilation itself is synchronous from the
|
|
3
|
+
* caller's point of view (matches native `device.createShaderModule`); any
|
|
4
|
+
* compile errors are reported asynchronously via `getCompilationInfo` so
|
|
5
|
+
* pipeline creation never has to block on shader validation.
|
|
6
|
+
*
|
|
7
|
+
* WGSL is the only supported shader language — there is no GLSL transpilation.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createShaderModule(device: GPUDevice, code: string, label?: string): GPUShaderModule;
|
|
10
|
+
//# sourceMappingURL=shader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader.d.ts","sourceRoot":"","sources":["../../src/shader/shader.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,CAInG"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public types for oria-webgpu.
|
|
3
|
+
*
|
|
4
|
+
* oria-webgpu is a thin, typed wrapper over WebGPU — not a rendering engine.
|
|
5
|
+
* Native WebGPU types (GPUDevice, GPUBuffer, GPUTexture, ...) are exposed
|
|
6
|
+
* directly wherever possible so users keep the native mental model.
|
|
7
|
+
*/
|
|
8
|
+
export interface CreateGPUOptions {
|
|
9
|
+
powerPreference?: GPUPowerPreference;
|
|
10
|
+
forceFallbackAdapter?: boolean;
|
|
11
|
+
requiredFeatures?: Iterable<GPUFeatureName>;
|
|
12
|
+
requiredLimits?: Record<string, number>;
|
|
13
|
+
deviceLabel?: string;
|
|
14
|
+
/** Preferred canvas format. Defaults to navigator.gpu.getPreferredCanvasFormat(). */
|
|
15
|
+
format?: GPUTextureFormat;
|
|
16
|
+
alphaMode?: GPUCanvasAlphaMode;
|
|
17
|
+
/** Initial resize behavior. Defaults to matching canvas.clientWidth/clientHeight. */
|
|
18
|
+
pixelRatio?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface ResizeOptions {
|
|
21
|
+
width?: number;
|
|
22
|
+
height?: number;
|
|
23
|
+
pixelRatio?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface BufferDescriptor {
|
|
26
|
+
label?: string;
|
|
27
|
+
/** Initial contents. Size is derived from this when `size` is omitted. */
|
|
28
|
+
data?: ArrayBufferView | ArrayBuffer;
|
|
29
|
+
/** Buffer size in bytes. Required when `data` is omitted. */
|
|
30
|
+
size?: number;
|
|
31
|
+
usage: GPUBufferUsageFlags;
|
|
32
|
+
/** Defaults to true when `data` is provided and usage doesn't require mapping later. */
|
|
33
|
+
mappedAtCreation?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface Buffer {
|
|
36
|
+
readonly raw: GPUBuffer;
|
|
37
|
+
readonly size: number;
|
|
38
|
+
readonly usage: GPUBufferUsageFlags;
|
|
39
|
+
readonly label: string | undefined;
|
|
40
|
+
/** Writes data into the buffer via device.queue.writeBuffer. */
|
|
41
|
+
write(data: ArrayBufferView | ArrayBuffer, offset?: number): void;
|
|
42
|
+
destroy(): void;
|
|
43
|
+
}
|
|
44
|
+
export interface StorageBufferDescriptor {
|
|
45
|
+
label?: string;
|
|
46
|
+
data?: ArrayBufferView | ArrayBuffer;
|
|
47
|
+
size?: number;
|
|
48
|
+
/** Defaults to STORAGE | COPY_DST | COPY_SRC. */
|
|
49
|
+
usage?: GPUBufferUsageFlags;
|
|
50
|
+
mappedAtCreation?: boolean;
|
|
51
|
+
}
|
|
52
|
+
export type TypedArrayConstructor = Float32ArrayConstructor | Float64ArrayConstructor | Int8ArrayConstructor | Uint8ArrayConstructor | Uint8ClampedArrayConstructor | Int16ArrayConstructor | Uint16ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor;
|
|
53
|
+
export interface DepthTextureDescriptor {
|
|
54
|
+
label?: string;
|
|
55
|
+
/** Defaults to "depth24plus". */
|
|
56
|
+
format?: GPUTextureFormat;
|
|
57
|
+
sampleCount?: number;
|
|
58
|
+
/** Both default to the canvas's current pixel size. */
|
|
59
|
+
width?: number;
|
|
60
|
+
height?: number;
|
|
61
|
+
}
|
|
62
|
+
export interface VertexState {
|
|
63
|
+
code: string;
|
|
64
|
+
entryPoint?: string;
|
|
65
|
+
buffers?: GPUVertexBufferLayout[];
|
|
66
|
+
constants?: Record<string, number>;
|
|
67
|
+
}
|
|
68
|
+
export interface FragmentState {
|
|
69
|
+
code: string;
|
|
70
|
+
entryPoint?: string;
|
|
71
|
+
/** Plain formats are sugar for `{ format }`. */
|
|
72
|
+
targets: Array<GPUColorTargetState | GPUTextureFormat | null>;
|
|
73
|
+
constants?: Record<string, number>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A resource that can be resolved into a `GPUBindGroupEntry.resource` by name,
|
|
77
|
+
* using the pipeline's WGSL reflection to find its @group/@binding and expected
|
|
78
|
+
* resource category. Buffers/textures accept either the Oria wrapper or the
|
|
79
|
+
* native WebGPU object; `{ buffer, offset, size }` narrows a buffer binding's range.
|
|
80
|
+
*/
|
|
81
|
+
export type BindingResource = Buffer | GPUBuffer | {
|
|
82
|
+
buffer: Buffer | GPUBuffer;
|
|
83
|
+
offset?: number;
|
|
84
|
+
size?: number;
|
|
85
|
+
} | GPUSampler | Texture | GPUTexture | GPUTextureView | GPUExternalTexture;
|
|
86
|
+
export interface RenderPipelineDescriptor {
|
|
87
|
+
label?: string;
|
|
88
|
+
vertex: VertexState;
|
|
89
|
+
fragment?: FragmentState;
|
|
90
|
+
primitive?: GPUPrimitiveState;
|
|
91
|
+
depthStencil?: GPUDepthStencilState;
|
|
92
|
+
multisample?: GPUMultisampleState;
|
|
93
|
+
layout?: GPUPipelineLayout | "auto";
|
|
94
|
+
/** Named resources resolved via WGSL reflection, applied immediately after creation. */
|
|
95
|
+
bindings?: Record<string, BindingResource>;
|
|
96
|
+
}
|
|
97
|
+
export interface RenderPipeline {
|
|
98
|
+
readonly raw: GPURenderPipeline;
|
|
99
|
+
readonly label: string | undefined;
|
|
100
|
+
/** Resolves named resources to bind groups via WGSL reflection and caches them on the pipeline. */
|
|
101
|
+
bindings(namedResources: Record<string, BindingResource>): this;
|
|
102
|
+
/** Bind groups currently resolved for this pipeline, keyed by @group index. */
|
|
103
|
+
readonly boundGroups: ReadonlyMap<number, GPUBindGroup>;
|
|
104
|
+
}
|
|
105
|
+
export interface RenderPassBuilder {
|
|
106
|
+
pipeline(pipeline: RenderPipeline): this;
|
|
107
|
+
/** Requires `.pipeline(...)` to have been called first on this pass. */
|
|
108
|
+
bindings(namedResources: Record<string, BindingResource>): this;
|
|
109
|
+
vertexBuffer(slot: number, buffer: Buffer, offset?: number, size?: number): this;
|
|
110
|
+
indexBuffer(buffer: Buffer, format: GPUIndexFormat, offset?: number, size?: number): this;
|
|
111
|
+
draw(vertexCount: number, instanceCount?: number, firstVertex?: number, firstInstance?: number): this;
|
|
112
|
+
drawIndexed(indexCount: number, instanceCount?: number, firstIndex?: number, baseVertex?: number, firstInstance?: number): this;
|
|
113
|
+
/** Escape hatch: the native encoder for anything not covered above. */
|
|
114
|
+
readonly raw: GPURenderPassEncoder;
|
|
115
|
+
}
|
|
116
|
+
export interface RenderTargetOptions {
|
|
117
|
+
/** Offscreen color target. Defaults to the canvas's current texture. */
|
|
118
|
+
target?: GPUTexture;
|
|
119
|
+
clearColor?: GPUColor;
|
|
120
|
+
loadOp?: GPULoadOp;
|
|
121
|
+
storeOp?: GPUStoreOp;
|
|
122
|
+
}
|
|
123
|
+
export interface TextureDescriptor {
|
|
124
|
+
label?: string;
|
|
125
|
+
width: number;
|
|
126
|
+
height: number;
|
|
127
|
+
depthOrArrayLayers?: number;
|
|
128
|
+
format: GPUTextureFormat;
|
|
129
|
+
usage: GPUTextureUsageFlags;
|
|
130
|
+
mipLevelCount?: number;
|
|
131
|
+
sampleCount?: number;
|
|
132
|
+
dimension?: GPUTextureDimension;
|
|
133
|
+
}
|
|
134
|
+
/** Sources WebGPU can copy pixels from directly via `copyExternalImageToTexture`. */
|
|
135
|
+
export type TextureSource = ImageBitmap | HTMLCanvasElement | OffscreenCanvas | VideoFrame;
|
|
136
|
+
export interface TextureFromSourceDescriptor {
|
|
137
|
+
label?: string;
|
|
138
|
+
source: TextureSource;
|
|
139
|
+
/** Defaults to "rgba8unorm". */
|
|
140
|
+
format?: GPUTextureFormat;
|
|
141
|
+
/** Defaults to TEXTURE_BINDING | COPY_DST | RENDER_ATTACHMENT. */
|
|
142
|
+
usage?: GPUTextureUsageFlags;
|
|
143
|
+
premultipliedAlpha?: boolean;
|
|
144
|
+
flipY?: boolean;
|
|
145
|
+
}
|
|
146
|
+
export interface Texture {
|
|
147
|
+
readonly raw: GPUTexture;
|
|
148
|
+
readonly width: number;
|
|
149
|
+
readonly height: number;
|
|
150
|
+
readonly format: GPUTextureFormat;
|
|
151
|
+
createView(descriptor?: GPUTextureViewDescriptor): GPUTextureView;
|
|
152
|
+
destroy(): void;
|
|
153
|
+
}
|
|
154
|
+
export interface ComputePipelineDescriptor {
|
|
155
|
+
label?: string;
|
|
156
|
+
code: string;
|
|
157
|
+
entryPoint?: string;
|
|
158
|
+
constants?: Record<string, number>;
|
|
159
|
+
layout?: GPUPipelineLayout | "auto";
|
|
160
|
+
/** Named resources resolved via WGSL reflection, applied immediately after creation. */
|
|
161
|
+
bindings?: Record<string, BindingResource>;
|
|
162
|
+
}
|
|
163
|
+
export interface ComputePipeline {
|
|
164
|
+
readonly raw: GPUComputePipeline;
|
|
165
|
+
readonly label: string | undefined;
|
|
166
|
+
/** Resolves named resources to bind groups via WGSL reflection and caches them on the pipeline. */
|
|
167
|
+
bindings(namedResources: Record<string, BindingResource>): this;
|
|
168
|
+
/** Bind groups currently resolved for this pipeline, keyed by @group index. */
|
|
169
|
+
readonly boundGroups: ReadonlyMap<number, GPUBindGroup>;
|
|
170
|
+
}
|
|
171
|
+
export interface ComputePassBuilder {
|
|
172
|
+
pipeline(pipeline: ComputePipeline): this;
|
|
173
|
+
/** Requires `.pipeline(...)` to have been called first on this pass. */
|
|
174
|
+
bindings(namedResources: Record<string, BindingResource>): this;
|
|
175
|
+
dispatch(x: number, y?: number, z?: number): this;
|
|
176
|
+
/** Escape hatch: the native encoder for anything not covered above. */
|
|
177
|
+
readonly raw: GPUComputePassEncoder;
|
|
178
|
+
}
|
|
179
|
+
export interface GPUContext {
|
|
180
|
+
readonly adapter: GPUAdapter;
|
|
181
|
+
readonly device: GPUDevice;
|
|
182
|
+
readonly context: GPUCanvasContext;
|
|
183
|
+
readonly format: GPUTextureFormat;
|
|
184
|
+
readonly canvas: HTMLCanvasElement;
|
|
185
|
+
buffer(descriptor: BufferDescriptor): Buffer;
|
|
186
|
+
/** Sugar over `buffer()` defaulting usage to STORAGE | COPY_DST | COPY_SRC. */
|
|
187
|
+
storageBuffer(descriptor: StorageBufferDescriptor): Buffer;
|
|
188
|
+
texture(descriptor: TextureDescriptor): Texture;
|
|
189
|
+
/** Creates a texture from an ImageBitmap/canvas/VideoFrame and uploads it immediately. */
|
|
190
|
+
textureFromSource(descriptor: TextureFromSourceDescriptor): Texture;
|
|
191
|
+
/** A texture sized to the canvas (or an explicit width/height), for use as a depth attachment. */
|
|
192
|
+
depthTexture(descriptor?: DepthTextureDescriptor): Texture;
|
|
193
|
+
/** Extremely thin — returns the native GPUSampler directly. */
|
|
194
|
+
sampler(descriptor?: GPUSamplerDescriptor): GPUSampler;
|
|
195
|
+
/** Reads a GPUBuffer back to the CPU. `buffer` must have COPY_SRC usage. */
|
|
196
|
+
readBuffer(buffer: Buffer): Promise<ArrayBuffer>;
|
|
197
|
+
readBuffer<T extends TypedArrayConstructor>(buffer: Buffer, ctor: T): Promise<InstanceType<T>>;
|
|
198
|
+
/** Cached per distinct pipeline descriptor (excluding `bindings`) — see the pipeline cache docs. */
|
|
199
|
+
renderPipeline(descriptor: RenderPipelineDescriptor): RenderPipeline;
|
|
200
|
+
computePipeline(descriptor: ComputePipelineDescriptor): ComputePipeline;
|
|
201
|
+
clearPipelineCache(): void;
|
|
202
|
+
render(callback: (pass: RenderPassBuilder) => void): void;
|
|
203
|
+
render(options: RenderTargetOptions, callback: (pass: RenderPassBuilder) => void): void;
|
|
204
|
+
compute(callback: (pass: ComputePassBuilder) => void): void;
|
|
205
|
+
/** Escape hatch: a native command encoder, submitted automatically after the callback returns. */
|
|
206
|
+
command(callback: (encoder: GPUCommandEncoder) => void): void;
|
|
207
|
+
resize(options?: ResizeOptions): void;
|
|
208
|
+
onDeviceLost(callback: (info: GPUDeviceLostInfo) => void): void;
|
|
209
|
+
dispose(): void;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=public.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Rounds `value` up to the nearest multiple of `alignment`. */
|
|
2
|
+
export declare function alignTo(value: number, alignment: number): number;
|
|
3
|
+
/** WebGPU requires GPUBuffer sizes to be a multiple of 4 bytes. */
|
|
4
|
+
export declare const GPU_BUFFER_SIZE_ALIGNMENT = 4;
|
|
5
|
+
export declare function alignBufferSize(size: number): number;
|
|
6
|
+
//# sourceMappingURL=alignment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alignment.d.ts","sourceRoot":"","sources":["../../src/utils/alignment.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,mEAAmE;AACnE,eAAO,MAAM,yBAAyB,IAAI,CAAA;AAE1C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic, order-independent serialization for building stable cache
|
|
3
|
+
* keys from plain descriptor objects (shader source, layouts, formats, ...).
|
|
4
|
+
* Not suitable for values containing functions, symbols, or cyclic references.
|
|
5
|
+
*/
|
|
6
|
+
export declare function stableStringify(value: unknown): string;
|
|
7
|
+
/** FNV-1a 32-bit — fast and stable for an in-memory cache key. Not cryptographic. */
|
|
8
|
+
export declare function hashString(input: string): string;
|
|
9
|
+
/** A stable per-process token for an object reference, for use inside cache keys. */
|
|
10
|
+
export declare function identityToken(obj: object): string;
|
|
11
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/utils/hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAYtD;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAKD,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjD"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Base error type for all library-raised errors. Prefixed for easy log filtering. */
|
|
2
|
+
export declare class OriaError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare function assert(condition: unknown, message: string): asserts condition;
|
|
6
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAE7E"}
|