@aardworx/wombat.rendering 0.1.0 → 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/dist/commands/clear.d.ts +3 -0
- package/dist/commands/clear.d.ts.map +1 -0
- package/dist/commands/clear.js +69 -0
- package/dist/commands/clear.js.map +1 -0
- package/dist/commands/index.d.ts +3 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +5 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/render.d.ts +16 -0
- package/dist/commands/render.d.ts.map +1 -0
- package/dist/commands/render.js +93 -0
- package/dist/commands/render.js.map +1 -0
- package/dist/core/acquire.d.ts +3 -0
- package/dist/core/acquire.d.ts.map +1 -0
- package/dist/core/acquire.js +22 -0
- package/dist/core/acquire.js.map +1 -0
- package/dist/core/adaptiveResource.d.ts +29 -0
- package/dist/core/adaptiveResource.d.ts.map +1 -0
- package/dist/core/adaptiveResource.js +73 -0
- package/dist/core/adaptiveResource.js.map +1 -0
- package/dist/core/buffer.d.ts +20 -0
- package/dist/core/buffer.d.ts.map +1 -0
- package/dist/core/buffer.js +30 -0
- package/dist/core/buffer.js.map +1 -0
- package/dist/core/bufferView.d.ts +15 -0
- package/dist/core/bufferView.d.ts.map +1 -0
- package/dist/core/bufferView.js +12 -0
- package/dist/core/bufferView.js.map +1 -0
- package/dist/core/clear.d.ts +9 -0
- package/dist/core/clear.d.ts.map +1 -0
- package/dist/core/clear.js +7 -0
- package/dist/core/clear.js.map +1 -0
- package/dist/core/command.d.ts +45 -0
- package/dist/core/command.d.ts.map +1 -0
- package/dist/core/command.js +12 -0
- package/dist/core/command.js.map +1 -0
- package/dist/core/drawCall.d.ts +17 -0
- package/dist/core/drawCall.d.ts.map +1 -0
- package/dist/core/drawCall.js +5 -0
- package/dist/core/drawCall.js.map +1 -0
- package/dist/core/framebuffer.d.ts +32 -0
- package/dist/core/framebuffer.d.ts.map +1 -0
- package/dist/core/framebuffer.js +6 -0
- package/dist/core/framebuffer.js.map +1 -0
- package/dist/core/framebufferSignature.d.ts +12 -0
- package/dist/core/framebufferSignature.d.ts.map +1 -0
- package/dist/core/framebufferSignature.js +7 -0
- package/dist/core/framebufferSignature.js.map +1 -0
- package/dist/core/index.d.ts +20 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pipelineState.d.ts +56 -0
- package/dist/core/pipelineState.d.ts.map +1 -0
- package/dist/core/pipelineState.js +6 -0
- package/dist/core/pipelineState.js.map +1 -0
- package/dist/core/renderContext.d.ts +8 -0
- package/dist/core/renderContext.d.ts.map +1 -0
- package/dist/core/renderContext.js +39 -0
- package/dist/core/renderContext.js.map +1 -0
- package/dist/core/renderObject.d.ts +45 -0
- package/dist/core/renderObject.d.ts.map +1 -0
- package/dist/core/renderObject.js +11 -0
- package/dist/core/renderObject.js.map +1 -0
- package/dist/core/renderTask.d.ts +12 -0
- package/dist/core/renderTask.d.ts.map +1 -0
- package/dist/core/renderTask.js +5 -0
- package/dist/core/renderTask.js.map +1 -0
- package/dist/core/renderTree.d.ts +35 -0
- package/dist/core/renderTree.d.ts.map +1 -0
- package/dist/core/renderTree.js +17 -0
- package/dist/core/renderTree.js.map +1 -0
- package/dist/core/sampler.d.ts +12 -0
- package/dist/core/sampler.d.ts.map +1 -0
- package/dist/core/sampler.js +8 -0
- package/dist/core/sampler.js.map +1 -0
- package/dist/core/shader.d.ts +3 -0
- package/dist/core/shader.d.ts.map +1 -0
- package/dist/core/shader.js +6 -0
- package/dist/core/shader.js.map +1 -0
- package/dist/core/texture.d.ts +34 -0
- package/dist/core/texture.d.ts.map +1 -0
- package/dist/core/texture.js +29 -0
- package/dist/core/texture.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/adaptiveBuffer.d.ts +22 -0
- package/dist/resources/adaptiveBuffer.d.ts.map +1 -0
- package/dist/resources/adaptiveBuffer.js +99 -0
- package/dist/resources/adaptiveBuffer.js.map +1 -0
- package/dist/resources/adaptiveSampler.d.ts +4 -0
- package/dist/resources/adaptiveSampler.d.ts.map +1 -0
- package/dist/resources/adaptiveSampler.js +73 -0
- package/dist/resources/adaptiveSampler.js.map +1 -0
- package/dist/resources/adaptiveTexture.d.ts +14 -0
- package/dist/resources/adaptiveTexture.d.ts.map +1 -0
- package/dist/resources/adaptiveTexture.js +265 -0
- package/dist/resources/adaptiveTexture.js.map +1 -0
- package/dist/resources/framebuffer.d.ts +14 -0
- package/dist/resources/framebuffer.d.ts.map +1 -0
- package/dist/resources/framebuffer.js +144 -0
- package/dist/resources/framebuffer.js.map +1 -0
- package/dist/resources/framebufferSignature.d.ts +10 -0
- package/dist/resources/framebufferSignature.d.ts.map +1 -0
- package/dist/resources/framebufferSignature.js +22 -0
- package/dist/resources/framebufferSignature.js.map +1 -0
- package/dist/resources/index.d.ts +14 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +24 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/mipGen.d.ts +17 -0
- package/dist/resources/mipGen.d.ts.map +1 -0
- package/dist/resources/mipGen.js +125 -0
- package/dist/resources/mipGen.js.map +1 -0
- package/dist/resources/preparedComputeShader.d.ts +104 -0
- package/dist/resources/preparedComputeShader.d.ts.map +1 -0
- package/dist/resources/preparedComputeShader.js +341 -0
- package/dist/resources/preparedComputeShader.js.map +1 -0
- package/dist/resources/preparedRenderObject.d.ts +61 -0
- package/dist/resources/preparedRenderObject.d.ts.map +1 -0
- package/dist/resources/preparedRenderObject.js +430 -0
- package/dist/resources/preparedRenderObject.js.map +1 -0
- package/dist/resources/renderPipeline.d.ts +27 -0
- package/dist/resources/renderPipeline.d.ts.map +1 -0
- package/dist/resources/renderPipeline.js +102 -0
- package/dist/resources/renderPipeline.js.map +1 -0
- package/dist/resources/shaderDiagnostics.d.ts +14 -0
- package/dist/resources/shaderDiagnostics.d.ts.map +1 -0
- package/dist/resources/shaderDiagnostics.js +40 -0
- package/dist/resources/shaderDiagnostics.js.map +1 -0
- package/dist/resources/sourceMapDecoder.d.ts +23 -0
- package/dist/resources/sourceMapDecoder.d.ts.map +1 -0
- package/dist/resources/sourceMapDecoder.js +116 -0
- package/dist/resources/sourceMapDecoder.js.map +1 -0
- package/dist/resources/uniformBuffer.d.ts +23 -0
- package/dist/resources/uniformBuffer.d.ts.map +1 -0
- package/dist/resources/uniformBuffer.js +149 -0
- package/dist/resources/uniformBuffer.js.map +1 -0
- package/dist/resources/webgpuFlags.d.ts +32 -0
- package/dist/resources/webgpuFlags.d.ts.map +1 -0
- package/dist/resources/webgpuFlags.js +40 -0
- package/dist/resources/webgpuFlags.js.map +1 -0
- package/dist/runtime/copy.d.ts +3 -0
- package/dist/runtime/copy.d.ts.map +1 -0
- package/dist/runtime/copy.js +12 -0
- package/dist/runtime/copy.js.map +1 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +7 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/renderTask.d.ts +10 -0
- package/dist/runtime/renderTask.d.ts.map +1 -0
- package/dist/runtime/renderTask.js +119 -0
- package/dist/runtime/renderTask.js.map +1 -0
- package/dist/runtime/renderTo.d.ts +40 -0
- package/dist/runtime/renderTo.d.ts.map +1 -0
- package/dist/runtime/renderTo.js +97 -0
- package/dist/runtime/renderTo.js.map +1 -0
- package/dist/runtime/runtime.d.ts +48 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +100 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/scenePass.d.ts +25 -0
- package/dist/runtime/scenePass.d.ts.map +1 -0
- package/dist/runtime/scenePass.js +250 -0
- package/dist/runtime/scenePass.js.map +1 -0
- package/dist/window/canvas.d.ts +38 -0
- package/dist/window/canvas.d.ts.map +1 -0
- package/dist/window/canvas.js +194 -0
- package/dist/window/canvas.js.map +1 -0
- package/dist/window/index.d.ts +3 -0
- package/dist/window/index.d.ts.map +1 -0
- package/dist/window/index.js +4 -0
- package/dist/window/index.js.map +1 -0
- package/dist/window/loop.d.ts +16 -0
- package/dist/window/loop.d.ts.map +1 -0
- package/dist/window/loop.js +43 -0
- package/dist/window/loop.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Shader-compile error reporting. WebGPU's `createShaderModule`
|
|
2
|
+
// is synchronous and never throws on parse errors; the errors
|
|
3
|
+
// surface only via `module.getCompilationInfo()`, which is async.
|
|
4
|
+
// We fire-and-forget that call after creation and log structured
|
|
5
|
+
// messages including the originating TS source location decoded
|
|
6
|
+
// from the supplied source map.
|
|
7
|
+
import { decodeLine } from "./sourceMapDecoder.js";
|
|
8
|
+
export function installShaderDiagnostics(module, source, opts = {}) {
|
|
9
|
+
// getCompilationInfo is part of the WebGPU spec; some test mocks
|
|
10
|
+
// may not implement it. Detect and skip silently.
|
|
11
|
+
const info = module.getCompilationInfo;
|
|
12
|
+
if (typeof info !== "function")
|
|
13
|
+
return;
|
|
14
|
+
const log = opts.logger ?? console;
|
|
15
|
+
const tag = opts.label ?? "shader";
|
|
16
|
+
info.call(module).then((compInfo) => {
|
|
17
|
+
if (compInfo.messages.length === 0)
|
|
18
|
+
return;
|
|
19
|
+
const map = opts.sourceMap ?? null;
|
|
20
|
+
for (const m of compInfo.messages) {
|
|
21
|
+
const lineText = source.split("\n")[Math.max(0, m.lineNum - 1)] ?? "";
|
|
22
|
+
const head = `[${tag}] ${m.type} ${m.lineNum}:${m.linePos}: ${m.message}`;
|
|
23
|
+
const body = lineText.length > 0 ? `\n ${lineText.trim()}` : "";
|
|
24
|
+
const decoded = map ? decodeLine(map, m.lineNum) : null;
|
|
25
|
+
const origin = decoded
|
|
26
|
+
? `\n → ${decoded.file}:${decoded.line}:${decoded.column}`
|
|
27
|
+
: (map && map.sources.length > 0
|
|
28
|
+
? `\n (originated in ${map.sources.join(", ")})`
|
|
29
|
+
: "");
|
|
30
|
+
const line = `${head}${body}${origin}`;
|
|
31
|
+
if (m.type === "error")
|
|
32
|
+
log.error(line);
|
|
33
|
+
else
|
|
34
|
+
log.warn(line);
|
|
35
|
+
}
|
|
36
|
+
}).catch(() => {
|
|
37
|
+
// Mock environments / older browsers may reject; silent swallow.
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=shaderDiagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shaderDiagnostics.js","sourceRoot":"","sources":["../../src/resources/shaderDiagnostics.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,8DAA8D;AAC9D,kEAAkE;AAClE,iEAAiE;AACjE,gEAAgE;AAChE,gCAAgC;AAGhC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAWnD,MAAM,UAAU,wBAAwB,CACtC,MAAuB,EACvB,MAAc,EACd,OAAiC,EAAE;IAEnC,iEAAiE;IACjE,kDAAkD;IAClD,MAAM,IAAI,GAAI,MAAqE,CAAC,kBAAkB,CAAC;IACvG,IAAI,OAAO,IAAI,KAAK,UAAU;QAAE,OAAO;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;IAEnC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QAClC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1E,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACxD,MAAM,MAAM,GAAG,OAAO;gBACpB,CAAC,CAAC,SAAS,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE;gBAC3D,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;oBAC9B,CAAC,CAAC,sBAAsB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBACjD,CAAC,CAAC,EAAE,CAAC,CAAC;YACV,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;gBAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;gBACnC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACZ,iEAAiE;IACnE,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SourceMap } from "@aardworx/wombat.shader/ir";
|
|
2
|
+
export interface DecodedPosition {
|
|
3
|
+
/** Source file as listed in `SourceMap.sources`. */
|
|
4
|
+
readonly file: string;
|
|
5
|
+
/** 1-based line in the original source. */
|
|
6
|
+
readonly line: number;
|
|
7
|
+
/** 1-based column in the original source. */
|
|
8
|
+
readonly column: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Closest-preceding-segment lookup. Given a 1-based generated
|
|
12
|
+
* `line` + 0-based generated `col`, returns the originating source
|
|
13
|
+
* position. Falls back to the last segment on a previous mapped
|
|
14
|
+
* line if `line` itself has no segments.
|
|
15
|
+
*/
|
|
16
|
+
export declare function decodePosition(map: SourceMap, generatedLine: number, generatedCol?: number): DecodedPosition | null;
|
|
17
|
+
/**
|
|
18
|
+
* Backwards-compatible line-only decoder: returns the *first*
|
|
19
|
+
* segment of `generatedLine`, or the most recent mapped line for
|
|
20
|
+
* unmapped lines. Equivalent to `decodePosition(map, line, 0)`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function decodeLine(map: SourceMap, generatedLine: number): DecodedPosition | null;
|
|
23
|
+
//# sourceMappingURL=sourceMapDecoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceMapDecoder.d.ts","sourceRoot":"","sources":["../../src/resources/sourceMapDecoder.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AA+B5D,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAyCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,SAAS,EACd,aAAa,EAAE,MAAM,EACrB,YAAY,SAAI,GACf,eAAe,GAAG,IAAI,CAqBxB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAExF"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// Decoder for v3 source maps. Supports both line-granular maps
|
|
2
|
+
// (one segment per generated line at col 0) and multi-segment
|
|
3
|
+
// lines (per-Expr granularity). Segments encode
|
|
4
|
+
// (genColDelta, sourceIdxDelta, sourceLineDelta, sourceColDelta)
|
|
5
|
+
// as base64-VLQ, with deltas accumulating across the whole map
|
|
6
|
+
// except for genCol which resets at every `;` line boundary.
|
|
7
|
+
//
|
|
8
|
+
// `decodeLine(map, line)` returns the position for the *first*
|
|
9
|
+
// segment on the line; `decodePosition(map, line, col)` picks the
|
|
10
|
+
// closest preceding segment. Both fall back to the most recent
|
|
11
|
+
// mapped line if the queried line is unmapped, which is what
|
|
12
|
+
// `installShaderDiagnostics` wants for "go to source" navigation.
|
|
13
|
+
const VLQ_INDEX = new Map();
|
|
14
|
+
{
|
|
15
|
+
const a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
16
|
+
for (let i = 0; i < a.length; i++)
|
|
17
|
+
VLQ_INDEX.set(a.charAt(i), i);
|
|
18
|
+
}
|
|
19
|
+
function vlqDecode(s) {
|
|
20
|
+
const out = [];
|
|
21
|
+
let value = 0;
|
|
22
|
+
let shift = 0;
|
|
23
|
+
for (let i = 0; i < s.length; i++) {
|
|
24
|
+
const ch = s.charAt(i);
|
|
25
|
+
const digit = VLQ_INDEX.get(ch);
|
|
26
|
+
if (digit === undefined)
|
|
27
|
+
throw new Error(`bad VLQ char: ${ch}`);
|
|
28
|
+
const cont = (digit & 0b100000) !== 0;
|
|
29
|
+
value |= (digit & 0b11111) << shift;
|
|
30
|
+
if (cont) {
|
|
31
|
+
shift += 5;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const negative = (value & 1) === 1;
|
|
35
|
+
const magnitude = value >>> 1;
|
|
36
|
+
out.push(negative ? -magnitude : magnitude);
|
|
37
|
+
value = 0;
|
|
38
|
+
shift = 0;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
/** Walk the map up to (and including) `targetLine`, returning each line's segments. */
|
|
44
|
+
function segmentsUpTo(map, targetLine) {
|
|
45
|
+
const lines = map.mappings.split(";");
|
|
46
|
+
const out = [];
|
|
47
|
+
let srcIdx = 0;
|
|
48
|
+
let srcLine = 0;
|
|
49
|
+
let srcCol = 0;
|
|
50
|
+
for (let i = 0; i <= targetLine && i < lines.length; i++) {
|
|
51
|
+
const segs = (lines[i] ?? "").split(",").filter(s => s.length > 0);
|
|
52
|
+
let prevGenCol = 0;
|
|
53
|
+
const lineOut = [];
|
|
54
|
+
for (const sStr of segs) {
|
|
55
|
+
const fields = vlqDecode(sStr);
|
|
56
|
+
if (fields.length < 4)
|
|
57
|
+
continue;
|
|
58
|
+
const genCol = prevGenCol + fields[0];
|
|
59
|
+
srcIdx += fields[1];
|
|
60
|
+
srcLine += fields[2];
|
|
61
|
+
srcCol += fields[3];
|
|
62
|
+
lineOut.push({ genCol, idx: srcIdx, line: srcLine, col: srcCol });
|
|
63
|
+
prevGenCol = genCol;
|
|
64
|
+
}
|
|
65
|
+
out.push(lineOut);
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
function makePosition(map, s) {
|
|
70
|
+
const file = map.sources[s.idx];
|
|
71
|
+
if (file === undefined)
|
|
72
|
+
return null;
|
|
73
|
+
return { file, line: s.line + 1, column: s.col + 1 };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Closest-preceding-segment lookup. Given a 1-based generated
|
|
77
|
+
* `line` + 0-based generated `col`, returns the originating source
|
|
78
|
+
* position. Falls back to the last segment on a previous mapped
|
|
79
|
+
* line if `line` itself has no segments.
|
|
80
|
+
*/
|
|
81
|
+
export function decodePosition(map, generatedLine, generatedCol = 0) {
|
|
82
|
+
const target = generatedLine - 1;
|
|
83
|
+
if (target < 0)
|
|
84
|
+
return null;
|
|
85
|
+
const allLines = segmentsUpTo(map, target);
|
|
86
|
+
// Prefer a segment on the target line at or before generatedCol.
|
|
87
|
+
const onTarget = allLines[target];
|
|
88
|
+
if (onTarget && onTarget.length > 0) {
|
|
89
|
+
let pick;
|
|
90
|
+
for (const s of onTarget) {
|
|
91
|
+
if (s.genCol <= generatedCol)
|
|
92
|
+
pick = s;
|
|
93
|
+
else
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
if (pick)
|
|
97
|
+
return makePosition(map, pick);
|
|
98
|
+
return makePosition(map, onTarget[0]);
|
|
99
|
+
}
|
|
100
|
+
// Fallback: last segment on the most recent mapped line.
|
|
101
|
+
for (let i = target - 1; i >= 0; i--) {
|
|
102
|
+
const segs = allLines[i];
|
|
103
|
+
if (segs && segs.length > 0)
|
|
104
|
+
return makePosition(map, segs[segs.length - 1]);
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Backwards-compatible line-only decoder: returns the *first*
|
|
110
|
+
* segment of `generatedLine`, or the most recent mapped line for
|
|
111
|
+
* unmapped lines. Equivalent to `decodePosition(map, line, 0)`.
|
|
112
|
+
*/
|
|
113
|
+
export function decodeLine(map, generatedLine) {
|
|
114
|
+
return decodePosition(map, generatedLine, 0);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=sourceMapDecoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sourceMapDecoder.js","sourceRoot":"","sources":["../../src/resources/sourceMapDecoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AdaptiveResource, type UniformBlockInfo } from "../core/index.js";
|
|
2
|
+
import { type aval, type HashMap } from "@aardworx/wombat.adaptive";
|
|
3
|
+
export interface PackedView {
|
|
4
|
+
readonly bytes: ArrayBuffer;
|
|
5
|
+
readonly f32: Float32Array;
|
|
6
|
+
readonly i32: Int32Array;
|
|
7
|
+
readonly u32: Uint32Array;
|
|
8
|
+
}
|
|
9
|
+
export declare function makePackedView(byteSize: number): PackedView;
|
|
10
|
+
/**
|
|
11
|
+
* Write a value into a UBO scratch buffer at the given byte offset.
|
|
12
|
+
* `fieldType`, when supplied, disambiguates a bare `number`:
|
|
13
|
+
* - Int (signed) → i32
|
|
14
|
+
* - Int (unsigned) → u32
|
|
15
|
+
* - Float (default) → f32
|
|
16
|
+
* Without it, numbers are assumed to be f32.
|
|
17
|
+
*/
|
|
18
|
+
export declare function writeField(view: PackedView, offset: number, value: unknown, fieldType?: import("../core/index.js").UniformFieldInfo["type"]): void;
|
|
19
|
+
export interface PrepareUniformBufferOptions {
|
|
20
|
+
readonly label?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function prepareUniformBuffer(device: GPUDevice, layout: UniformBlockInfo, inputs: HashMap<string, aval<unknown>>, opts?: PrepareUniformBufferOptions): AdaptiveResource<GPUBuffer>;
|
|
23
|
+
//# sourceMappingURL=uniformBuffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uniformBuffer.d.ts","sourceRoot":"","sources":["../../src/resources/uniformBuffer.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,gBAAgB,EAGhB,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,IAAI,EACT,KAAK,OAAO,EACb,MAAM,2BAA2B,CAAC;AAGnC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAQ3D;AA6DD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,OAAO,kBAAkB,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAC9D,IAAI,CA6BN;AAMD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EACtC,IAAI,GAAE,2BAAgC,GACrC,gBAAgB,CAAC,SAAS,CAAC,CAE7B"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// prepareUniformBuffer — pack a name-keyed bag of `aval<unknown>`
|
|
2
|
+
// uniforms into a single UBO described by a `UniformBlockInfo`
|
|
3
|
+
// (from wombat.shader's ProgramInterface).
|
|
4
|
+
//
|
|
5
|
+
// The layout dictates byte offsets + sizes per field; this packer
|
|
6
|
+
// trusts those numbers and just encodes values into a Float32-
|
|
7
|
+
// addressable scratch buffer, then uploads via `queue.writeBuffer`
|
|
8
|
+
// on each change.
|
|
9
|
+
//
|
|
10
|
+
// Value encoding by type:
|
|
11
|
+
// - `number` → 1 × f32 at offset
|
|
12
|
+
// - `Float32Array` → memcpy floats
|
|
13
|
+
// - `Int32Array`/`Uint32Array` → memcpy as-is (also valid for f32 storage)
|
|
14
|
+
// - any object with `_data: Float32Array | Int32Array | Uint32Array`
|
|
15
|
+
// (V2f/V3f/V4f/M44f/M33f/M22f, etc. from wombat.base) → memcpy `_data`
|
|
16
|
+
//
|
|
17
|
+
// Missing inputs (a layout field with no corresponding entry in
|
|
18
|
+
// the bag) are left zero-initialised. Extras in the bag are
|
|
19
|
+
// silently ignored — same "pull, don't push" semantics as the
|
|
20
|
+
// rest of the renderer.
|
|
21
|
+
import { AdaptiveResource, tryAcquire, tryRelease, } from "../core/index.js";
|
|
22
|
+
import {} from "@aardworx/wombat.adaptive";
|
|
23
|
+
import { BufferUsage } from "./webgpuFlags.js";
|
|
24
|
+
export function makePackedView(byteSize) {
|
|
25
|
+
const bytes = new ArrayBuffer(roundUp4(byteSize));
|
|
26
|
+
return {
|
|
27
|
+
bytes,
|
|
28
|
+
f32: new Float32Array(bytes),
|
|
29
|
+
i32: new Int32Array(bytes),
|
|
30
|
+
u32: new Uint32Array(bytes),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
class UniformBufferResource extends AdaptiveResource {
|
|
34
|
+
device;
|
|
35
|
+
layout;
|
|
36
|
+
inputs;
|
|
37
|
+
label;
|
|
38
|
+
_gpu;
|
|
39
|
+
_scratch;
|
|
40
|
+
constructor(device, layout, inputs, label) {
|
|
41
|
+
super();
|
|
42
|
+
this.device = device;
|
|
43
|
+
this.layout = layout;
|
|
44
|
+
this.inputs = inputs;
|
|
45
|
+
this.label = label;
|
|
46
|
+
const bytes = new ArrayBuffer(roundUp4(layout.size));
|
|
47
|
+
this._scratch = {
|
|
48
|
+
bytes,
|
|
49
|
+
f32: new Float32Array(bytes),
|
|
50
|
+
i32: new Int32Array(bytes),
|
|
51
|
+
u32: new Uint32Array(bytes),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
create() {
|
|
55
|
+
for (const f of this.layout.fields) {
|
|
56
|
+
const av = this.inputs.tryFind(f.name);
|
|
57
|
+
if (av !== undefined)
|
|
58
|
+
tryAcquire(av);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
destroy() {
|
|
62
|
+
if (this._gpu !== undefined) {
|
|
63
|
+
this._gpu.destroy();
|
|
64
|
+
this._gpu = undefined;
|
|
65
|
+
}
|
|
66
|
+
for (const f of this.layout.fields) {
|
|
67
|
+
const av = this.inputs.tryFind(f.name);
|
|
68
|
+
if (av !== undefined)
|
|
69
|
+
tryRelease(av);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
compute(token) {
|
|
73
|
+
// Pack scratch.
|
|
74
|
+
new Uint8Array(this._scratch.bytes).fill(0);
|
|
75
|
+
for (const field of this.layout.fields) {
|
|
76
|
+
const av = this.inputs.tryFind(field.name);
|
|
77
|
+
if (av === undefined)
|
|
78
|
+
continue;
|
|
79
|
+
writeField(this._scratch, field.offset, av.getValue(token));
|
|
80
|
+
}
|
|
81
|
+
if (this._gpu === undefined) {
|
|
82
|
+
const desc = {
|
|
83
|
+
size: this._scratch.bytes.byteLength,
|
|
84
|
+
usage: BufferUsage.UNIFORM | BufferUsage.COPY_DST,
|
|
85
|
+
...(this.label !== undefined ? { label: this.label } : {}),
|
|
86
|
+
};
|
|
87
|
+
this._gpu = this.device.createBuffer(desc);
|
|
88
|
+
}
|
|
89
|
+
this.device.queue.writeBuffer(this._gpu, 0, this._scratch.bytes);
|
|
90
|
+
return this._gpu;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Write a value into a UBO scratch buffer at the given byte offset.
|
|
95
|
+
* `fieldType`, when supplied, disambiguates a bare `number`:
|
|
96
|
+
* - Int (signed) → i32
|
|
97
|
+
* - Int (unsigned) → u32
|
|
98
|
+
* - Float (default) → f32
|
|
99
|
+
* Without it, numbers are assumed to be f32.
|
|
100
|
+
*/
|
|
101
|
+
export function writeField(view, offset, value, fieldType) {
|
|
102
|
+
if (typeof value === "number") {
|
|
103
|
+
if (fieldType?.kind === "Int") {
|
|
104
|
+
if (fieldType.signed)
|
|
105
|
+
view.i32[offset >> 2] = value;
|
|
106
|
+
else
|
|
107
|
+
view.u32[offset >> 2] = value;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
view.f32[offset >> 2] = value;
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (value instanceof Float32Array) {
|
|
115
|
+
view.f32.set(value, offset >> 2);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (value instanceof Int32Array) {
|
|
119
|
+
view.i32.set(value, offset >> 2);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (value instanceof Uint32Array) {
|
|
123
|
+
view.u32.set(value, offset >> 2);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (value !== null && typeof value === "object" && "_data" in value) {
|
|
127
|
+
const data = value._data;
|
|
128
|
+
if (data instanceof Float32Array) {
|
|
129
|
+
view.f32.set(data, offset >> 2);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (data instanceof Int32Array) {
|
|
133
|
+
view.i32.set(data, offset >> 2);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (data instanceof Uint32Array) {
|
|
137
|
+
view.u32.set(data, offset >> 2);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
throw new Error(`prepareUniformBuffer: unsupported uniform value at offset ${offset}: ${String(value)}`);
|
|
142
|
+
}
|
|
143
|
+
function roundUp4(n) {
|
|
144
|
+
return (n + 3) & ~3;
|
|
145
|
+
}
|
|
146
|
+
export function prepareUniformBuffer(device, layout, inputs, opts = {}) {
|
|
147
|
+
return new UniformBufferResource(device, layout, inputs, opts.label);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=uniformBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uniformBuffer.js","sourceRoot":"","sources":["../../src/resources/uniformBuffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const BufferUsage: {
|
|
2
|
+
readonly MAP_READ: 1;
|
|
3
|
+
readonly MAP_WRITE: 2;
|
|
4
|
+
readonly COPY_SRC: 4;
|
|
5
|
+
readonly COPY_DST: 8;
|
|
6
|
+
readonly INDEX: 16;
|
|
7
|
+
readonly VERTEX: 32;
|
|
8
|
+
readonly UNIFORM: 64;
|
|
9
|
+
readonly STORAGE: 128;
|
|
10
|
+
readonly INDIRECT: 256;
|
|
11
|
+
readonly QUERY_RESOLVE: 512;
|
|
12
|
+
};
|
|
13
|
+
export declare const TextureUsage: {
|
|
14
|
+
readonly COPY_SRC: 1;
|
|
15
|
+
readonly COPY_DST: 2;
|
|
16
|
+
readonly TEXTURE_BINDING: 4;
|
|
17
|
+
readonly STORAGE_BINDING: 8;
|
|
18
|
+
readonly RENDER_ATTACHMENT: 16;
|
|
19
|
+
};
|
|
20
|
+
export declare const ShaderStage: {
|
|
21
|
+
readonly VERTEX: 1;
|
|
22
|
+
readonly FRAGMENT: 2;
|
|
23
|
+
readonly COMPUTE: 4;
|
|
24
|
+
};
|
|
25
|
+
export declare const ColorWrite: {
|
|
26
|
+
readonly RED: 1;
|
|
27
|
+
readonly GREEN: 2;
|
|
28
|
+
readonly BLUE: 4;
|
|
29
|
+
readonly ALPHA: 8;
|
|
30
|
+
readonly ALL: 15;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=webgpuFlags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpuFlags.d.ts","sourceRoot":"","sources":["../../src/resources/webgpuFlags.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,WAAW;;;;;;;;;;;CAWd,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;CAMf,CAAC;AAEX,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;CAMb,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// `GPUBufferUsage` / `GPUTextureUsage` / `GPUMapMode` etc. are
|
|
2
|
+
// runtime-provided in the browser and Dawn-Node, but `@webgpu/types`
|
|
3
|
+
// is a types-only package — the constants don't exist when running
|
|
4
|
+
// under plain Node (vitest). Vendor the flag values here so the
|
|
5
|
+
// resource layer can compose usage flags portably.
|
|
6
|
+
//
|
|
7
|
+
// Numbers are taken from the WebGPU spec. They are part of the
|
|
8
|
+
// stable API surface.
|
|
9
|
+
export const BufferUsage = {
|
|
10
|
+
MAP_READ: 0x0001,
|
|
11
|
+
MAP_WRITE: 0x0002,
|
|
12
|
+
COPY_SRC: 0x0004,
|
|
13
|
+
COPY_DST: 0x0008,
|
|
14
|
+
INDEX: 0x0010,
|
|
15
|
+
VERTEX: 0x0020,
|
|
16
|
+
UNIFORM: 0x0040,
|
|
17
|
+
STORAGE: 0x0080,
|
|
18
|
+
INDIRECT: 0x0100,
|
|
19
|
+
QUERY_RESOLVE: 0x0200,
|
|
20
|
+
};
|
|
21
|
+
export const TextureUsage = {
|
|
22
|
+
COPY_SRC: 0x01,
|
|
23
|
+
COPY_DST: 0x02,
|
|
24
|
+
TEXTURE_BINDING: 0x04,
|
|
25
|
+
STORAGE_BINDING: 0x08,
|
|
26
|
+
RENDER_ATTACHMENT: 0x10,
|
|
27
|
+
};
|
|
28
|
+
export const ShaderStage = {
|
|
29
|
+
VERTEX: 0x1,
|
|
30
|
+
FRAGMENT: 0x2,
|
|
31
|
+
COMPUTE: 0x4,
|
|
32
|
+
};
|
|
33
|
+
export const ColorWrite = {
|
|
34
|
+
RED: 0x1,
|
|
35
|
+
GREEN: 0x2,
|
|
36
|
+
BLUE: 0x4,
|
|
37
|
+
ALPHA: 0x8,
|
|
38
|
+
ALL: 0xf,
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=webgpuFlags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpuFlags.js","sourceRoot":"","sources":["../../src/resources/webgpuFlags.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,qEAAqE;AACrE,mEAAmE;AACnE,gEAAgE;AAChE,mDAAmD;AACnD,EAAE;AACF,+DAA+D;AAC/D,sBAAsB;AAEtB,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,MAAM;IACjB,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,MAAM;IAChB,aAAa,EAAE,MAAM;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,IAAI;IACrB,iBAAiB,EAAE,IAAI;CACf,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;CACJ,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,GAAG,EAAE,GAAG;IACR,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,GAAG;IACV,GAAG,EAAE,GAAG;CACA,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/runtime/copy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,wBAAgB,IAAI,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAOjE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// copy(cmd, spec) — encode a buffer↔buffer or texture↔texture
|
|
2
|
+
// transfer described by a `CopySpec`.
|
|
3
|
+
export function copy(cmd, spec) {
|
|
4
|
+
if (spec.kind === "buffer") {
|
|
5
|
+
const range = spec.range ?? { srcOffset: 0, dstOffset: 0, size: spec.src.size };
|
|
6
|
+
cmd.copyBufferToBuffer(spec.src, range.srcOffset, spec.dst, range.dstOffset, range.size);
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
cmd.copyTextureToTexture(spec.src, spec.dst, spec.size);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/runtime/copy.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,sCAAsC;AAItC,MAAM,UAAU,IAAI,CAAC,GAAsB,EAAE,IAAc;IACzD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChF,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3F,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Runtime, type RuntimeOptions, } from "./runtime.js";
|
|
2
|
+
export { compileRenderTask, type RuntimeContext, } from "./renderTask.js";
|
|
3
|
+
export { copy } from "./copy.js";
|
|
4
|
+
export { renderTo, type RenderToOptions, type RenderToResult, } from "./renderTo.js";
|
|
5
|
+
export { ScenePass, type WalkerStats, } from "./scenePass.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,OAAO,EACP,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,QAAQ,EACR,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,EACT,KAAK,WAAW,GACjB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Public API of @aardworx/wombat.rendering-runtime.
|
|
2
|
+
export { Runtime, } from "./runtime.js";
|
|
3
|
+
export { compileRenderTask, } from "./renderTask.js";
|
|
4
|
+
export { copy } from "./copy.js";
|
|
5
|
+
export { renderTo, } from "./renderTo.js";
|
|
6
|
+
export { ScenePass, } from "./scenePass.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,OAAO,EACL,OAAO,GAER,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,QAAQ,GAGT,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,GAEV,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Command, type CompiledEffect, type Effect, type IRenderTask } from "../core/index.js";
|
|
2
|
+
import { AdaptiveToken, type alist } from "@aardworx/wombat.adaptive";
|
|
3
|
+
export interface RuntimeContext {
|
|
4
|
+
readonly device: GPUDevice;
|
|
5
|
+
readonly compileEffect: (effect: Effect) => CompiledEffect;
|
|
6
|
+
}
|
|
7
|
+
export declare function compileRenderTask(ctx: RuntimeContext, commands: alist<Command>): IRenderTask & {
|
|
8
|
+
encode(enc: GPUCommandEncoder, token: AdaptiveToken): void;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=renderTask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderTask.d.ts","sourceRoot":"","sources":["../../src/runtime/renderTask.ts"],"names":[],"mappings":"AAcA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,MAAM,EAEX,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,KAAK,KAAK,EAAa,MAAM,2BAA2B,CAAC;AAIjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC;CAC5D;AA+FD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,WAAW,GAAG;IAC9F,MAAM,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;CAC5D,CAEA"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// RenderTask — compile an `alist<Command>` into a runnable
|
|
2
|
+
// IRenderTask.
|
|
3
|
+
//
|
|
4
|
+
// Per `Render` command we lazily build a `ScenePass` that holds a
|
|
5
|
+
// stateful tree-walker subscribed to the dynamic subtrees
|
|
6
|
+
// (`Adaptive` / `OrderedFromList` / `UnorderedFromSet`). Each frame:
|
|
7
|
+
// - The walker pulls deltas from its readers (O(deltas) work).
|
|
8
|
+
// - It produces the ordered list of `PreparedRenderObject`s.
|
|
9
|
+
// - We open the render pass and call `record(pass, token)` per leaf.
|
|
10
|
+
//
|
|
11
|
+
// The previous per-frame `collectLeaves` recursion through the tree
|
|
12
|
+
// is gone. Static subtrees prep their leaves once at construction;
|
|
13
|
+
// dynamic subtrees splice on delta — see scenePass.ts.
|
|
14
|
+
import { RenderContext, } from "../core/index.js";
|
|
15
|
+
import { beginPassDescriptor, clear } from "../commands/index.js";
|
|
16
|
+
import { AdaptiveToken } from "@aardworx/wombat.adaptive";
|
|
17
|
+
import { copy } from "./copy.js";
|
|
18
|
+
import { ScenePass } from "./scenePass.js";
|
|
19
|
+
class RenderTask {
|
|
20
|
+
ctx;
|
|
21
|
+
commands;
|
|
22
|
+
/**
|
|
23
|
+
* Cache of `ScenePass`es keyed on the `Render` command itself.
|
|
24
|
+
* Holding ScenePass per command means the same `RenderTree`
|
|
25
|
+
* reused across frames keeps its incrementally-maintained
|
|
26
|
+
* walker state.
|
|
27
|
+
*/
|
|
28
|
+
_scenes = new Map();
|
|
29
|
+
_disposed = false;
|
|
30
|
+
constructor(ctx, commands) {
|
|
31
|
+
this.ctx = ctx;
|
|
32
|
+
this.commands = commands;
|
|
33
|
+
}
|
|
34
|
+
run(token) {
|
|
35
|
+
if (this._disposed)
|
|
36
|
+
throw new Error("RenderTask: run after dispose");
|
|
37
|
+
const enc = this.ctx.device.createCommandEncoder();
|
|
38
|
+
this.encode(enc, token);
|
|
39
|
+
this.ctx.device.queue.submit([enc.finish()]);
|
|
40
|
+
}
|
|
41
|
+
encode(enc, token) {
|
|
42
|
+
if (this._disposed)
|
|
43
|
+
throw new Error("RenderTask: encode after dispose");
|
|
44
|
+
RenderContext.withEncoder(enc, () => {
|
|
45
|
+
const arr = [];
|
|
46
|
+
for (const c of this.commands.content.getValue(token))
|
|
47
|
+
arr.push(c);
|
|
48
|
+
for (let i = 0; i < arr.length; i++) {
|
|
49
|
+
const c = arr[i];
|
|
50
|
+
if (c.kind === "Clear") {
|
|
51
|
+
const next = arr[i + 1];
|
|
52
|
+
if (next !== undefined && next.kind === "Render" && next.output === c.output) {
|
|
53
|
+
this.encodeRenderCommand(enc, next, token, c.values);
|
|
54
|
+
i++;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
this.encodeCommand(enc, c, token);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
dispose() {
|
|
63
|
+
if (this._disposed)
|
|
64
|
+
return;
|
|
65
|
+
for (const s of this._scenes.values())
|
|
66
|
+
s.dispose();
|
|
67
|
+
this._scenes.clear();
|
|
68
|
+
this._disposed = true;
|
|
69
|
+
}
|
|
70
|
+
encodeCommand(enc, c, token) {
|
|
71
|
+
switch (c.kind) {
|
|
72
|
+
case "Clear":
|
|
73
|
+
clear(enc, c.output.getValue(token), c.values);
|
|
74
|
+
return;
|
|
75
|
+
case "Copy":
|
|
76
|
+
copy(enc, c.copy);
|
|
77
|
+
return;
|
|
78
|
+
case "Custom":
|
|
79
|
+
c.encode(enc);
|
|
80
|
+
return;
|
|
81
|
+
case "Render":
|
|
82
|
+
this.encodeRenderCommand(enc, c, token);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
encodeRenderCommand(enc, cmd, token, clearValues) {
|
|
87
|
+
const output = cmd.output.getValue(token);
|
|
88
|
+
const scene = this.sceneFor(cmd, output, cmd.tree);
|
|
89
|
+
const leaves = scene.resolve(token);
|
|
90
|
+
if (leaves.length === 0 && clearValues === undefined)
|
|
91
|
+
return;
|
|
92
|
+
// Either we have draws or we need to clear — open a single pass.
|
|
93
|
+
const pass = enc.beginRenderPass(beginPassDescriptor(output, clearValues));
|
|
94
|
+
for (const leaf of leaves)
|
|
95
|
+
leaf.record(pass, token);
|
|
96
|
+
pass.end();
|
|
97
|
+
}
|
|
98
|
+
sceneFor(cmd, output, tree) {
|
|
99
|
+
let s = this._scenes.get(cmd);
|
|
100
|
+
if (s === undefined) {
|
|
101
|
+
s = new ScenePass(this.ctx.device, output.signature, tree, this.ctx.compileEffect);
|
|
102
|
+
this._scenes.set(cmd, s);
|
|
103
|
+
}
|
|
104
|
+
return s;
|
|
105
|
+
// Note: `output.signature` is read here only to seed the
|
|
106
|
+
// ScenePass; subsequent frames continue to use this signature
|
|
107
|
+
// even if the framebuffer aval emits a different sig. That
|
|
108
|
+
// matches the `(RenderObject, signature)` cache invariant —
|
|
109
|
+
// changing signature requires a fresh Render command.
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export function compileRenderTask(ctx, commands) {
|
|
113
|
+
return new RenderTask(ctx, commands);
|
|
114
|
+
}
|
|
115
|
+
// `RenderTree` carries an `aval<RenderTree>` inside its `Adaptive`
|
|
116
|
+
// variant; this `void` reference keeps the `aval` import live.
|
|
117
|
+
const _avalGuard = undefined;
|
|
118
|
+
void _avalGuard;
|
|
119
|
+
//# sourceMappingURL=renderTask.js.map
|