@aardworx/wombat.rendering 0.9.14 → 0.9.15

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.
Files changed (65) hide show
  1. package/dist/runtime/derivedModes/modeKeyCpu.d.ts +45 -0
  2. package/dist/runtime/derivedModes/modeKeyCpu.d.ts.map +1 -0
  3. package/dist/runtime/derivedModes/modeKeyCpu.js +179 -0
  4. package/dist/runtime/derivedModes/modeKeyCpu.js.map +1 -0
  5. package/dist/runtime/derivedModes/partition.d.ts +36 -0
  6. package/dist/runtime/derivedModes/partition.d.ts.map +1 -0
  7. package/dist/runtime/derivedModes/partition.js +170 -0
  8. package/dist/runtime/derivedModes/partition.js.map +1 -0
  9. package/dist/runtime/derivedModes/slotTable.d.ts +70 -0
  10. package/dist/runtime/derivedModes/slotTable.d.ts.map +1 -0
  11. package/dist/runtime/derivedModes/slotTable.js +130 -0
  12. package/dist/runtime/derivedModes/slotTable.js.map +1 -0
  13. package/dist/runtime/heapScene/growBuffer.d.ts +33 -0
  14. package/dist/runtime/heapScene/growBuffer.d.ts.map +1 -0
  15. package/dist/runtime/heapScene/growBuffer.js +76 -0
  16. package/dist/runtime/heapScene/growBuffer.js.map +1 -0
  17. package/dist/runtime/heapScene/packers.d.ts +25 -0
  18. package/dist/runtime/heapScene/packers.d.ts.map +1 -0
  19. package/dist/runtime/heapScene/packers.js +111 -0
  20. package/dist/runtime/heapScene/packers.js.map +1 -0
  21. package/dist/runtime/heapScene/pools.d.ts +181 -0
  22. package/dist/runtime/heapScene/pools.d.ts.map +1 -0
  23. package/dist/runtime/heapScene/pools.js +417 -0
  24. package/dist/runtime/heapScene/pools.js.map +1 -0
  25. package/dist/runtime/heapScene/scanKernel.d.ts +11 -0
  26. package/dist/runtime/heapScene/scanKernel.d.ts.map +1 -0
  27. package/dist/runtime/heapScene/scanKernel.js +181 -0
  28. package/dist/runtime/heapScene/scanKernel.js.map +1 -0
  29. package/dist/runtime/heapScene.d.ts.map +1 -1
  30. package/dist/runtime/heapScene.js +228 -937
  31. package/dist/runtime/heapScene.js.map +1 -1
  32. package/dist/runtime/index.d.ts +4 -0
  33. package/dist/runtime/index.d.ts.map +1 -1
  34. package/dist/runtime/index.js +5 -0
  35. package/dist/runtime/index.js.map +1 -1
  36. package/dist/runtime/pipelineCache/bitfield.d.ts +5 -0
  37. package/dist/runtime/pipelineCache/bitfield.d.ts.map +1 -0
  38. package/dist/runtime/pipelineCache/bitfield.js +201 -0
  39. package/dist/runtime/pipelineCache/bitfield.js.map +1 -0
  40. package/dist/runtime/pipelineCache/cache.d.ts +36 -0
  41. package/dist/runtime/pipelineCache/cache.d.ts.map +1 -0
  42. package/dist/runtime/pipelineCache/cache.js +108 -0
  43. package/dist/runtime/pipelineCache/cache.js.map +1 -0
  44. package/dist/runtime/pipelineCache/descriptor.d.ts +58 -0
  45. package/dist/runtime/pipelineCache/descriptor.d.ts.map +1 -0
  46. package/dist/runtime/pipelineCache/descriptor.js +100 -0
  47. package/dist/runtime/pipelineCache/descriptor.js.map +1 -0
  48. package/dist/runtime/pipelineCache/index.d.ts +5 -0
  49. package/dist/runtime/pipelineCache/index.d.ts.map +1 -0
  50. package/dist/runtime/pipelineCache/index.js +12 -0
  51. package/dist/runtime/pipelineCache/index.js.map +1 -0
  52. package/package.json +1 -1
  53. package/src/runtime/derivedModes/modeKeyCpu.ts +213 -0
  54. package/src/runtime/derivedModes/partition.ts +206 -0
  55. package/src/runtime/derivedModes/slotTable.ts +153 -0
  56. package/src/runtime/heapScene/growBuffer.ts +75 -0
  57. package/src/runtime/heapScene/packers.ts +127 -0
  58. package/src/runtime/heapScene/pools.ts +492 -0
  59. package/src/runtime/heapScene/scanKernel.ts +184 -0
  60. package/src/runtime/heapScene.ts +283 -1064
  61. package/src/runtime/index.ts +40 -0
  62. package/src/runtime/pipelineCache/bitfield.ts +225 -0
  63. package/src/runtime/pipelineCache/cache.ts +129 -0
  64. package/src/runtime/pipelineCache/descriptor.ts +150 -0
  65. package/src/runtime/pipelineCache/index.ts +37 -0
@@ -16,4 +16,9 @@ export { compileHybridScene, } from "./hybridScene.js";
16
16
  export { BvhTree2d, SPLIT_LIMIT_DEFAULT, } from "./textureAtlas/bvhTree2d.js";
17
17
  export { TexturePacking, empty as emptyTexturePacking, isEmpty as isEmptyTexturePacking, count as countTexturePacking, occupancy as texturePackingOccupancy, square as squareTexturePacking, tryAddMany as texturePackingTryAddMany, tryOfArray as texturePackingTryOfArray, } from "./textureAtlas/packer.js";
18
18
  export { AtlasPool, ATLAS_PAGE_SIZE, ATLAS_MAX_DIM, ATLAS_MAX_PAGES_PER_FORMAT, ATLAS_PAGE_FORMATS, atlasFormatIndex, } from "./textureAtlas/atlasPool.js";
19
+ // Pipeline-state cache + bitfield encoding (Task 1 of derived-modes).
20
+ export { PipelineCache, encodeModeKey, decodeModeKey, MAX_ATTACHMENTS, DEFAULT_DESCRIPTOR, DEFAULT_ATTACHMENT_BLEND, descriptorEquals, } from "./pipelineCache/index.js";
21
+ export { ModeKeyTracker, snapshotDescriptor, } from "./derivedModes/modeKeyCpu.js";
22
+ export { SlotTable, } from "./derivedModes/slotTable.js";
23
+ export { partitionCPU, PARTITION_HISTOGRAM_WGSL, PARTITION_SCATTER_WGSL, MAX_SLOTS_PER_BUCKET, } from "./derivedModes/partition.js";
19
24
  //# sourceMappingURL=index.js.map
@@ -1 +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;AAExB,OAAO,EACL,cAAc,GAOf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iBAAiB,GAGlB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,uFAAuF;AACvF,OAAO,EACL,cAAc,EAAE,WAAW,EAC3B,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAE7C,sBAAsB,EAAE,qBAAqB,GAC9C,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,kBAAkB,GAGnB,MAAM,kBAAkB,CAAC;AAE1B,uEAAuE;AACvE,OAAO,EACL,SAAS,EACT,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,cAAc,EACd,KAAK,IAAI,mBAAmB,EAC5B,OAAO,IAAI,qBAAqB,EAChC,KAAK,IAAI,mBAAmB,EAC5B,SAAS,IAAI,uBAAuB,EACpC,MAAM,IAAI,oBAAoB,EAC9B,UAAU,IAAI,wBAAwB,EACtC,UAAU,IAAI,wBAAwB,GACvC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,SAAS,EACT,eAAe,EACf,aAAa,EACb,0BAA0B,EAC1B,kBAAkB,EAClB,gBAAgB,GAKjB,MAAM,6BAA6B,CAAC"}
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;AAExB,OAAO,EACL,cAAc,GAOf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iBAAiB,GAGlB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,uFAAuF;AACvF,OAAO,EACL,cAAc,EAAE,WAAW,EAC3B,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAE7C,sBAAsB,EAAE,qBAAqB,GAC9C,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,kBAAkB,GAGnB,MAAM,kBAAkB,CAAC;AAE1B,uEAAuE;AACvE,OAAO,EACL,SAAS,EACT,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,cAAc,EACd,KAAK,IAAI,mBAAmB,EAC5B,OAAO,IAAI,qBAAqB,EAChC,KAAK,IAAI,mBAAmB,EAC5B,SAAS,IAAI,uBAAuB,EACpC,MAAM,IAAI,oBAAoB,EAC9B,UAAU,IAAI,wBAAwB,EACtC,UAAU,IAAI,wBAAwB,GACvC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,SAAS,EACT,eAAe,EACf,aAAa,EACb,0BAA0B,EAC1B,kBAAkB,EAClB,gBAAgB,GAKjB,MAAM,6BAA6B,CAAC;AAErC,sEAAsE;AACtE,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,GAWjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,cAAc,EACd,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,SAAS,GAEV,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,GAGrB,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type PipelineStateDescriptor } from "./descriptor.js";
2
+ export declare const MAX_ATTACHMENTS = 2;
3
+ export declare function encodeModeKey(d: PipelineStateDescriptor): bigint;
4
+ export declare function decodeModeKey(key: bigint): PipelineStateDescriptor;
5
+ //# sourceMappingURL=bitfield.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitfield.d.ts","sourceRoot":"","sources":["../../../src/runtime/pipelineCache/bitfield.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,KAAK,uBAAuB,EAM7B,MAAM,iBAAiB,CAAC;AA0EzB,eAAO,MAAM,eAAe,IAAI,CAAC;AAuEjC,wBAAgB,aAAa,CAAC,CAAC,EAAE,uBAAuB,GAAG,MAAM,CA6BhE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CA4BlE"}
@@ -0,0 +1,201 @@
1
+ // Bitfield encoding of a PipelineStateDescriptor into a single bigint.
2
+ //
3
+ // The encoded value is BOTH the pipeline-cache key AND the per-RO modeKey
4
+ // the partition kernel reads. There is no hash function — the encoding
5
+ // is exact and reversible. Two distinct descriptors always produce
6
+ // distinct keys; identical descriptors always produce identical keys.
7
+ //
8
+ // v1 layout supports up to MAX_ATTACHMENTS color attachments. Per-
9
+ // attachment data is packed sequentially after a fixed-width header.
10
+ // Stencil is encoded as a single "enabled" bit in v1; when enabled,
11
+ // the full stencil state is rejected (returned as an "open" key) — the
12
+ // design defers per-RO stencil derivation to v2.
13
+ import {} from "./descriptor.js";
14
+ const TOPOLOGY = [
15
+ "point-list",
16
+ "line-list",
17
+ "line-strip",
18
+ "triangle-list",
19
+ "triangle-strip",
20
+ ];
21
+ const STRIP_INDEX_FORMAT = [
22
+ undefined,
23
+ "uint16",
24
+ "uint32",
25
+ ];
26
+ const COMPARE = [
27
+ "never", "less", "equal", "less-equal",
28
+ "greater", "not-equal", "greater-equal", "always",
29
+ ];
30
+ const BLEND_FACTOR = [
31
+ "zero", "one",
32
+ "src", "one-minus-src",
33
+ "src-alpha", "one-minus-src-alpha",
34
+ "dst", "one-minus-dst",
35
+ "dst-alpha", "one-minus-dst-alpha",
36
+ "src-alpha-saturated",
37
+ "constant", "one-minus-constant",
38
+ ];
39
+ const BLEND_OPERATION = [
40
+ "add", "subtract", "reverse-subtract", "min", "max",
41
+ ];
42
+ const CULL_MODE = ["none", "front", "back"];
43
+ const FRONT_FACE = ["ccw", "cw"];
44
+ function indexOf(arr, v, name) {
45
+ const i = arr.indexOf(v);
46
+ if (i < 0)
47
+ throw new Error(`pipelineCache: unknown ${name} "${String(v)}"`);
48
+ return i;
49
+ }
50
+ // ─── Bit layout ────────────────────────────────────────────────────────
51
+ //
52
+ // Header (28 bits):
53
+ // [ 2: 0] topology (3 bits, indexes TOPOLOGY)
54
+ // [ 4: 3] stripIndexFormat (2 bits, indexes STRIP_INDEX_FORMAT)
55
+ // [ 5: 5] frontFace (1 bit)
56
+ // [ 7: 6] cullMode (2 bits)
57
+ // [ 8: 8] depth enabled
58
+ // [ 9: 9] depth write
59
+ // [12:10] depth compare (3 bits)
60
+ // [13:13] depth clamp (unclippedDepth)
61
+ // [14:14] stencil enabled (full stencil state in side-bits region —
62
+ // currently unimplemented; throws if set)
63
+ // [15:15] alphaToCoverage
64
+ // [19:16] attachment count (4 bits, 0..MAX_ATTACHMENTS)
65
+ // [27:20] reserved
66
+ //
67
+ // Attachment slot (27 bits each), packed starting at bit 28:
68
+ // [ 0: 0] blend enabled
69
+ // [ 3: 1] color operation (3 bits)
70
+ // [ 7: 4] color srcFactor (4 bits)
71
+ // [11: 8] color dstFactor (4 bits)
72
+ // [14:12] alpha operation (3 bits)
73
+ // [18:15] alpha srcFactor (4 bits)
74
+ // [22:19] alpha dstFactor (4 bits)
75
+ // [26:23] writeMask (4 bits, RGBA)
76
+ //
77
+ // At MAX_ATTACHMENTS=2 (v1 cap): header 28 + 2×27 = 82 bits → fits a
78
+ // bigint comfortably; CPU map keys take it natively.
79
+ export const MAX_ATTACHMENTS = 2;
80
+ const HEADER_BITS = 28n;
81
+ const ATTACHMENT_BITS = 27n;
82
+ // Field shifts (header)
83
+ const SH_TOPOLOGY = 0n;
84
+ const SH_STRIP = 3n;
85
+ const SH_FRONTFACE = 5n;
86
+ const SH_CULLMODE = 6n;
87
+ const SH_DEPTH_EN = 8n;
88
+ const SH_DEPTH_WRITE = 9n;
89
+ const SH_DEPTH_CMP = 10n;
90
+ const SH_DEPTH_CLAMP = 13n;
91
+ const SH_STENCIL_EN = 14n;
92
+ const SH_ATC = 15n;
93
+ const SH_ATT_COUNT = 16n;
94
+ // Field shifts (attachment slot, relative to slot base)
95
+ const A_EN = 0n;
96
+ const A_COLOR_OP = 1n;
97
+ const A_COLOR_SRC = 4n;
98
+ const A_COLOR_DST = 8n;
99
+ const A_ALPHA_OP = 12n;
100
+ const A_ALPHA_SRC = 15n;
101
+ const A_ALPHA_DST = 19n;
102
+ const A_MASK = 23n;
103
+ function bits(value, width) {
104
+ const mask = (1n << width) - 1n;
105
+ return (BigInt(value) & mask);
106
+ }
107
+ function encodeAttachment(att) {
108
+ let s = 0n;
109
+ s |= bits(att.enabled ? 1 : 0, 1n) << A_EN;
110
+ // When disabled, color/alpha components are stored as zero so that
111
+ // logically-equal descriptors encode identically. (descriptor.ts'
112
+ // attachmentEquals also ignores color/alpha when !enabled.)
113
+ if (att.enabled) {
114
+ s |= bits(indexOf(BLEND_OPERATION, att.color.operation, "color blend op"), 3n) << A_COLOR_OP;
115
+ s |= bits(indexOf(BLEND_FACTOR, att.color.srcFactor, "color srcFactor"), 4n) << A_COLOR_SRC;
116
+ s |= bits(indexOf(BLEND_FACTOR, att.color.dstFactor, "color dstFactor"), 4n) << A_COLOR_DST;
117
+ s |= bits(indexOf(BLEND_OPERATION, att.alpha.operation, "alpha blend op"), 3n) << A_ALPHA_OP;
118
+ s |= bits(indexOf(BLEND_FACTOR, att.alpha.srcFactor, "alpha srcFactor"), 4n) << A_ALPHA_SRC;
119
+ s |= bits(indexOf(BLEND_FACTOR, att.alpha.dstFactor, "alpha dstFactor"), 4n) << A_ALPHA_DST;
120
+ }
121
+ s |= bits(att.writeMask & 0xF, 4n) << A_MASK;
122
+ return s;
123
+ }
124
+ function decodeAttachment(slot) {
125
+ const en = ((slot >> A_EN) & 1n) === 1n;
126
+ const writeMask = Number((slot >> A_MASK) & 0xfn);
127
+ if (!en) {
128
+ return { enabled: false, color: { srcFactor: "one", dstFactor: "zero", operation: "add" },
129
+ alpha: { srcFactor: "one", dstFactor: "zero", operation: "add" }, writeMask };
130
+ }
131
+ const color = {
132
+ operation: BLEND_OPERATION[Number((slot >> A_COLOR_OP) & 7n)],
133
+ srcFactor: BLEND_FACTOR[Number((slot >> A_COLOR_SRC) & 0xfn)],
134
+ dstFactor: BLEND_FACTOR[Number((slot >> A_COLOR_DST) & 0xfn)],
135
+ };
136
+ const alpha = {
137
+ operation: BLEND_OPERATION[Number((slot >> A_ALPHA_OP) & 7n)],
138
+ srcFactor: BLEND_FACTOR[Number((slot >> A_ALPHA_SRC) & 0xfn)],
139
+ dstFactor: BLEND_FACTOR[Number((slot >> A_ALPHA_DST) & 0xfn)],
140
+ };
141
+ return { enabled: true, color, alpha, writeMask };
142
+ }
143
+ export function encodeModeKey(d) {
144
+ if (d.attachments.length > MAX_ATTACHMENTS) {
145
+ throw new Error(`pipelineCache: ${d.attachments.length} attachments exceeds v1 cap of ${MAX_ATTACHMENTS}`);
146
+ }
147
+ if (d.stencil !== undefined) {
148
+ throw new Error("pipelineCache: per-RO stencil state is not yet supported in v1 (use a static stencil at scene level)");
149
+ }
150
+ let key = 0n;
151
+ key |= bits(indexOf(TOPOLOGY, d.topology, "topology"), 3n) << SH_TOPOLOGY;
152
+ key |= bits(indexOf(STRIP_INDEX_FORMAT, d.stripIndexFormat, "stripIndexFormat"), 2n) << SH_STRIP;
153
+ key |= bits(indexOf(FRONT_FACE, d.frontFace, "frontFace"), 1n) << SH_FRONTFACE;
154
+ key |= bits(indexOf(CULL_MODE, d.cullMode, "cullMode"), 2n) << SH_CULLMODE;
155
+ if (d.depth !== undefined) {
156
+ key |= 1n << SH_DEPTH_EN;
157
+ if (d.depth.write)
158
+ key |= 1n << SH_DEPTH_WRITE;
159
+ key |= bits(indexOf(COMPARE, d.depth.compare, "depth compare"), 3n) << SH_DEPTH_CMP;
160
+ if (d.depth.clamp)
161
+ key |= 1n << SH_DEPTH_CLAMP;
162
+ }
163
+ if (d.alphaToCoverage)
164
+ key |= 1n << SH_ATC;
165
+ key |= bits(d.attachments.length, 4n) << SH_ATT_COUNT;
166
+ for (let i = 0; i < d.attachments.length; i++) {
167
+ const slot = encodeAttachment(d.attachments[i]);
168
+ key |= slot << (HEADER_BITS + BigInt(i) * ATTACHMENT_BITS);
169
+ }
170
+ return key;
171
+ }
172
+ export function decodeModeKey(key) {
173
+ const topology = TOPOLOGY[Number((key >> SH_TOPOLOGY) & 7n)];
174
+ const strip = STRIP_INDEX_FORMAT[Number((key >> SH_STRIP) & 3n)];
175
+ const frontFace = FRONT_FACE[Number((key >> SH_FRONTFACE) & 1n)];
176
+ const cullMode = CULL_MODE[Number((key >> SH_CULLMODE) & 3n)];
177
+ const depthEn = ((key >> SH_DEPTH_EN) & 1n) === 1n;
178
+ const atc = ((key >> SH_ATC) & 1n) === 1n;
179
+ const attCount = Number((key >> SH_ATT_COUNT) & 0xfn);
180
+ const slotMask = (1n << ATTACHMENT_BITS) - 1n;
181
+ const attachments = [];
182
+ for (let i = 0; i < attCount; i++) {
183
+ const slot = (key >> (HEADER_BITS + BigInt(i) * ATTACHMENT_BITS)) & slotMask;
184
+ attachments.push(decodeAttachment(slot));
185
+ }
186
+ const out = {
187
+ topology,
188
+ stripIndexFormat: strip,
189
+ frontFace,
190
+ cullMode,
191
+ ...(depthEn ? { depth: {
192
+ write: ((key >> SH_DEPTH_WRITE) & 1n) === 1n,
193
+ compare: COMPARE[Number((key >> SH_DEPTH_CMP) & 7n)],
194
+ clamp: ((key >> SH_DEPTH_CLAMP) & 1n) === 1n,
195
+ } } : {}),
196
+ attachments,
197
+ alphaToCoverage: atc,
198
+ };
199
+ return out;
200
+ }
201
+ //# sourceMappingURL=bitfield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitfield.js","sourceRoot":"","sources":["../../../src/runtime/pipelineCache/bitfield.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,0EAA0E;AAC1E,uEAAuE;AACvE,mEAAmE;AACnE,sEAAsE;AACtE,EAAE;AACF,mEAAmE;AACnE,qEAAqE;AACrE,oEAAoE;AACpE,uEAAuE;AACvE,iDAAiD;AAEjD,OAAO,EAON,MAAM,iBAAiB,CAAC;AAEzB,MAAM,QAAQ,GAAwB;IACpC,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,eAAe;IACf,gBAAgB;CACjB,CAAC;AAEF,MAAM,kBAAkB,GAA4C;IAClE,SAAS;IACT,QAAQ;IACR,QAAQ;CACT,CAAC;AAEF,MAAM,OAAO,GAAkC;IAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY;IACtC,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ;CAClD,CAAC;AAEF,MAAM,YAAY,GAA8B;IAC9C,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,eAAe;IACtB,WAAW,EAAE,qBAAqB;IAClC,KAAK,EAAE,eAAe;IACtB,WAAW,EAAE,qBAAqB;IAClC,qBAAqB;IACrB,UAAU,EAAE,oBAAoB;CACjC,CAAC;AAEF,MAAM,eAAe,GAAiC;IACpD,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK;CACpD,CAAC;AAEF,MAAM,SAAS,GAAyB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAClE,MAAM,UAAU,GAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAEvD,SAAS,OAAO,CAAI,GAAiB,EAAE,CAAI,EAAE,IAAY;IACvD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,0EAA0E;AAC1E,EAAE;AACF,oBAAoB;AACpB,yDAAyD;AACzD,mEAAmE;AACnE,sCAAsC;AACtC,uCAAuC;AACvC,2BAA2B;AAC3B,yBAAyB;AACzB,uCAAuC;AACvC,0CAA0C;AAC1C,wEAAwE;AACxE,uEAAuE;AACvE,6BAA6B;AAC7B,2DAA2D;AAC3D,sBAAsB;AACtB,EAAE;AACF,6DAA6D;AAC7D,2BAA2B;AAC3B,uCAAuC;AACvC,uCAAuC;AACvC,uCAAuC;AACvC,uCAAuC;AACvC,uCAAuC;AACvC,uCAAuC;AACvC,6CAA6C;AAC7C,EAAE;AACF,qEAAqE;AACrE,qDAAqD;AAErD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,MAAM,WAAW,GAAQ,GAAG,CAAC;AAC7B,MAAM,eAAe,GAAI,GAAG,CAAC;AAE7B,wBAAwB;AACxB,MAAM,WAAW,GAAQ,EAAE,CAAC;AAC5B,MAAM,QAAQ,GAAW,EAAE,CAAC;AAC5B,MAAM,YAAY,GAAO,EAAE,CAAC;AAC5B,MAAM,WAAW,GAAQ,EAAE,CAAC;AAC5B,MAAM,WAAW,GAAQ,EAAE,CAAC;AAC5B,MAAM,cAAc,GAAK,EAAE,CAAC;AAC5B,MAAM,YAAY,GAAO,GAAG,CAAC;AAC7B,MAAM,cAAc,GAAK,GAAG,CAAC;AAC7B,MAAM,aAAa,GAAM,GAAG,CAAC;AAC7B,MAAM,MAAM,GAAa,GAAG,CAAC;AAC7B,MAAM,YAAY,GAAO,GAAG,CAAC;AAE7B,wDAAwD;AACxD,MAAM,IAAI,GAAU,EAAE,CAAC;AACvB,MAAM,UAAU,GAAI,EAAE,CAAC;AACvB,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,UAAU,GAAI,GAAG,CAAC;AACxB,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,MAAM,GAAQ,GAAG,CAAC;AAExB,SAAS,IAAI,CAAC,KAAsB,EAAE,KAAa;IACjD,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAoB;IAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;IAC3C,mEAAmE;IACnE,kEAAkE;IAClE,4DAA4D;IAC5D,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;QAC7F,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAK,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAG,EAAE,CAAC,IAAI,WAAW,CAAC;QAChG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAK,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAG,EAAE,CAAC,IAAI,WAAW,CAAC;QAChG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;QAC7F,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAK,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAG,EAAE,CAAC,IAAI,WAAW,CAAC;QAChG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAK,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAG,EAAE,CAAC,IAAI,WAAW,CAAC;IAClG,CAAC;IACD,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC;IAC7C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;YAChF,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC;IACzF,CAAC;IACD,MAAM,KAAK,GAAmB;QAC5B,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC,GAAI,EAAE,CAAC,CAAE;QAC/D,SAAS,EAAE,YAAY,CAAI,MAAM,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,CAAE;QACjE,SAAS,EAAE,YAAY,CAAI,MAAM,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,CAAE;KAClE,CAAC;IACF,MAAM,KAAK,GAAmB;QAC5B,SAAS,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC,GAAI,EAAE,CAAC,CAAE;QAC/D,SAAS,EAAE,YAAY,CAAI,MAAM,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,CAAE;QACjE,SAAS,EAAE,YAAY,CAAI,MAAM,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,CAAE;KAClE,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAA0B;IACtD,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,kBAAkB,CAAC,CAAC,WAAW,CAAC,MAAM,kCAAkC,eAAe,EAAE,CAC1F,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,sGAAsG,CACvG,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC;IAC1E,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC;IACjG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC;IAC/E,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAG,CAAC,CAAC,QAAQ,EAAG,UAAU,CAAC,EAAG,EAAE,CAAC,IAAI,WAAW,CAAC;IAC9E,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1B,GAAG,IAAI,EAAE,IAAI,WAAW,CAAC;QACzB,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK;YAAE,GAAG,IAAI,EAAE,IAAI,cAAc,CAAC;QAC/C,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC;QACpF,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK;YAAE,GAAG,IAAI,EAAE,IAAI,cAAc,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,CAAC,eAAe;QAAE,GAAG,IAAI,EAAE,IAAI,MAAM,CAAC;IAC3C,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC;QACjD,GAAG,IAAI,IAAI,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,QAAQ,GAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,GAAI,EAAE,CAAC,CAAE,CAAC;IAChE,MAAM,KAAK,GAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,CAAC,CAAE,CAAC;IAClE,MAAM,QAAQ,GAAI,SAAS,CAAE,MAAM,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,GAAI,EAAE,CAAC,CAAE,CAAC;IAClE,MAAM,OAAO,GAAK,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACrD,MAAM,GAAG,GAAS,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,GAAQ,EAAE,CAAC,KAAK,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAI,MAAM,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAI,CAAC,EAAE,IAAI,eAAe,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,GAAG,QAAQ,CAAC;QAC7E,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,GAAG,GAA4B;QACnC,QAAQ;QACR,gBAAgB,EAAE,KAAK;QACvB,SAAS;QACT,QAAQ;QACR,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;gBACrB,KAAK,EAAI,CAAC,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE;gBAC9C,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,CAAC,CAAE;gBACrD,KAAK,EAAI,CAAC,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE;aAC/C,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACT,WAAW;QACX,eAAe,EAAE,GAAG;KACrB,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { PipelineStateDescriptor } from "./descriptor.js";
2
+ /** Builder hook: turn a descriptor into a real pipeline. */
3
+ export interface PipelineBuilder {
4
+ /** Sync — pipeline returned immediately; compile may continue in BG. */
5
+ createSync(descriptor: PipelineStateDescriptor): GPURenderPipeline;
6
+ /** Async — Promise resolves when compile + link finish. */
7
+ createAsync(descriptor: PipelineStateDescriptor): Promise<GPURenderPipeline>;
8
+ }
9
+ export declare class PipelineCache {
10
+ private readonly entries;
11
+ /** Number of populated (or in-flight) entries. */
12
+ get size(): number;
13
+ /** Sync lookup. Returns null if not in cache. */
14
+ lookup(modeKey: bigint): GPURenderPipeline | null;
15
+ /** True if any pipeline has been registered for this key (even pending). */
16
+ has(modeKey: bigint): boolean;
17
+ /**
18
+ * Sync create-or-fetch. The returned pipeline is usable immediately;
19
+ * driver compile may still be in flight. First GPU submission using
20
+ * it may queue-stall while compile completes.
21
+ */
22
+ getOrCreateSync(builder: PipelineBuilder, descriptor: PipelineStateDescriptor): GPURenderPipeline;
23
+ /**
24
+ * Async precompile a batch of descriptors. Resolves when every
25
+ * pipeline has linked. Idempotent: duplicate descriptors (by
26
+ * modeKey) share one compile.
27
+ */
28
+ precompile(builder: PipelineBuilder, descriptors: readonly PipelineStateDescriptor[]): Promise<void>;
29
+ /** Iterate every entry with a linked pipeline. */
30
+ ready(): IterableIterator<readonly [bigint, GPURenderPipeline, PipelineStateDescriptor]>;
31
+ /** All registered descriptors (linked or pending). Used by manifest. */
32
+ all(): IterableIterator<readonly [bigint, PipelineStateDescriptor]>;
33
+ /** Forget everything. Caller is responsible for dropping pipeline refs. */
34
+ clear(): void;
35
+ }
36
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/runtime/pipelineCache/cache.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,UAAU,CAAC,UAAU,EAAE,uBAAuB,GAAG,iBAAiB,CAAC;IACnE,2DAA2D;IAC3D,WAAW,CAAC,UAAU,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC9E;AASD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IAEzD,kDAAkD;IAClD,IAAI,IAAI,IAAI,MAAM,CAA8B;IAEhD,iDAAiD;IACjD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAKjD,4EAA4E;IAC5E,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7B;;;;OAIG;IACH,eAAe,CACb,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,uBAAuB,GAClC,iBAAiB;IAoBpB;;;;OAIG;IACG,UAAU,CACd,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,SAAS,uBAAuB,EAAE,GAC9C,OAAO,CAAC,IAAI,CAAC;IAkBhB,kDAAkD;IACjD,KAAK,IAAI,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;IAMzF,wEAAwE;IACvE,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAIpE,2EAA2E;IAC3E,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,108 @@
1
+ // CPU-side GPURenderPipeline cache keyed on the bitfield-encoded
2
+ // modeKey from bitfield.ts.
3
+ //
4
+ // Two access modes:
5
+ //
6
+ // - `precompile(builder, descriptors[])` — async batch warm. Used at
7
+ // scene-build with the enumerated pipeline domain so frame 0 sees a
8
+ // hot cache. Concurrent calls for the same modeKey deduplicate
9
+ // against the in-flight pipeline.
10
+ //
11
+ // - `getOrCreateSync(builder, descriptor)` — sync. Used on the
12
+ // runtime-mutation path when a never-before-seen descriptor
13
+ // appears. The returned `GPURenderPipeline` is usable immediately
14
+ // (driver compile happens in the background; first submit using it
15
+ // may stall the GPU queue if compile isn't done).
16
+ //
17
+ // The cache is layered on a user-supplied `PipelineBuilder` — the
18
+ // adapter that turns a `PipelineStateDescriptor` + the bucket's
19
+ // effect / vertex layout / bind group layout / framebuffer signature
20
+ // into the full `GPURenderPipelineDescriptor` and calls
21
+ // `device.createRenderPipeline{,Async}`. This module knows nothing
22
+ // about effect compilation; it just dedupes by modeKey and bookkeeps.
23
+ import { encodeModeKey } from "./bitfield.js";
24
+ export class PipelineCache {
25
+ entries = new Map();
26
+ /** Number of populated (or in-flight) entries. */
27
+ get size() { return this.entries.size; }
28
+ /** Sync lookup. Returns null if not in cache. */
29
+ lookup(modeKey) {
30
+ const e = this.entries.get(modeKey);
31
+ return e?.pipeline ?? null;
32
+ }
33
+ /** True if any pipeline has been registered for this key (even pending). */
34
+ has(modeKey) {
35
+ return this.entries.has(modeKey);
36
+ }
37
+ /**
38
+ * Sync create-or-fetch. The returned pipeline is usable immediately;
39
+ * driver compile may still be in flight. First GPU submission using
40
+ * it may queue-stall while compile completes.
41
+ */
42
+ getOrCreateSync(builder, descriptor) {
43
+ const key = encodeModeKey(descriptor);
44
+ const existing = this.entries.get(key);
45
+ if (existing?.pipeline)
46
+ return existing.pipeline;
47
+ if (existing && !existing.pipeline && existing.pending) {
48
+ // An async create is in flight. Bridge to a sync object by
49
+ // calling createSync — we still produce a usable pipeline now;
50
+ // the async one will resolve later (and be redundant, but
51
+ // harmless — the second pipeline object simply isn't used by
52
+ // anything past this point if we wire callers to read from
53
+ // `entry.pipeline`).
54
+ const pipeline = builder.createSync(descriptor);
55
+ existing.pipeline = pipeline;
56
+ return pipeline;
57
+ }
58
+ const pipeline = builder.createSync(descriptor);
59
+ this.entries.set(key, { modeKey: key, descriptor, pipeline });
60
+ return pipeline;
61
+ }
62
+ /**
63
+ * Async precompile a batch of descriptors. Resolves when every
64
+ * pipeline has linked. Idempotent: duplicate descriptors (by
65
+ * modeKey) share one compile.
66
+ */
67
+ async precompile(builder, descriptors) {
68
+ const promises = [];
69
+ for (const d of descriptors) {
70
+ const key = encodeModeKey(d);
71
+ const existing = this.entries.get(key);
72
+ if (existing?.pipeline)
73
+ continue; // already linked
74
+ if (existing?.pending) {
75
+ promises.push(existing.pending);
76
+ continue;
77
+ }
78
+ const pending = builder.createAsync(d).then((pipeline) => {
79
+ const e = this.entries.get(key);
80
+ if (e) {
81
+ e.pipeline = pipeline;
82
+ delete e.pending;
83
+ }
84
+ return pipeline;
85
+ });
86
+ this.entries.set(key, { modeKey: key, descriptor: d, pending });
87
+ promises.push(pending);
88
+ }
89
+ await Promise.all(promises);
90
+ }
91
+ /** Iterate every entry with a linked pipeline. */
92
+ *ready() {
93
+ for (const [k, e] of this.entries) {
94
+ if (e.pipeline)
95
+ yield [k, e.pipeline, e.descriptor];
96
+ }
97
+ }
98
+ /** All registered descriptors (linked or pending). Used by manifest. */
99
+ *all() {
100
+ for (const [k, e] of this.entries)
101
+ yield [k, e.descriptor];
102
+ }
103
+ /** Forget everything. Caller is responsible for dropping pipeline refs. */
104
+ clear() {
105
+ this.entries.clear();
106
+ }
107
+ }
108
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/runtime/pipelineCache/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export type CullMode = "none" | "front" | "back";
2
+ export type FrontFace = "ccw" | "cw";
3
+ export type Topology = GPUPrimitiveTopology;
4
+ export interface DepthSlice {
5
+ readonly write: boolean;
6
+ readonly compare: GPUCompareFunction;
7
+ /** unclippedDepth — requires the WebGPU adapter feature. */
8
+ readonly clamp: boolean;
9
+ }
10
+ export interface BlendComponent {
11
+ readonly srcFactor: GPUBlendFactor;
12
+ readonly dstFactor: GPUBlendFactor;
13
+ readonly operation: GPUBlendOperation;
14
+ }
15
+ export interface AttachmentBlend {
16
+ /** Whether blending is enabled for this attachment. */
17
+ readonly enabled: boolean;
18
+ /** Only valid if `enabled` is true. */
19
+ readonly color: BlendComponent;
20
+ readonly alpha: BlendComponent;
21
+ /** RGBA channel write mask (bitmask: R=1, G=2, B=4, A=8). */
22
+ readonly writeMask: number;
23
+ }
24
+ export interface StencilFace {
25
+ readonly compare: GPUCompareFunction;
26
+ readonly failOp: GPUStencilOperation;
27
+ readonly depthFailOp: GPUStencilOperation;
28
+ readonly passOp: GPUStencilOperation;
29
+ }
30
+ export interface StencilSlice {
31
+ readonly readMask: number;
32
+ readonly writeMask: number;
33
+ readonly front: StencilFace;
34
+ readonly back: StencilFace;
35
+ }
36
+ export interface PipelineStateDescriptor {
37
+ readonly topology: Topology;
38
+ readonly stripIndexFormat: GPUIndexFormat | undefined;
39
+ readonly frontFace: FrontFace;
40
+ readonly cullMode: CullMode;
41
+ /** Present only if the depth attachment is in use. */
42
+ readonly depth?: DepthSlice;
43
+ /** Present only if stencil testing is enabled. */
44
+ readonly stencil?: StencilSlice;
45
+ /** One entry per color attachment. v1: at most one; v2 expands. */
46
+ readonly attachments: readonly AttachmentBlend[];
47
+ readonly alphaToCoverage: boolean;
48
+ }
49
+ export declare const DEFAULT_ATTACHMENT_BLEND: AttachmentBlend;
50
+ export declare const DEFAULT_DESCRIPTOR: PipelineStateDescriptor;
51
+ /**
52
+ * Structural equality on two descriptors. Used as the collision-safety
53
+ * fallback if a bitfield key ever needs disambiguation (not expected
54
+ * with the current layout; the bitfield is collision-free by
55
+ * construction).
56
+ */
57
+ export declare function descriptorEquals(a: PipelineStateDescriptor, b: PipelineStateDescriptor): boolean;
58
+ //# sourceMappingURL=descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../src/runtime/pipelineCache/descriptor.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,QAAQ,GAAI,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAClD,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC;AACrC,MAAM,MAAM,QAAQ,GAAI,oBAAoB,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAI,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAI,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,QAAQ,CAAC,OAAO,EAAI,OAAO,CAAC;IAC5B,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAM,cAAc,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAM,cAAc,CAAC;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAM,kBAAkB,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAO,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAO,mBAAmB,CAAC;CAC3C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAM,WAAW,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAO,WAAW,CAAC;CACjC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAU,QAAQ,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,cAAc,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,SAAS,EAAS,SAAS,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAU,QAAQ,CAAC;IACpC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAY,UAAU,CAAC;IACtC,kDAAkD;IAClD,QAAQ,CAAC,OAAO,CAAC,EAAU,YAAY,CAAC;IACxC,mEAAmE;IACnE,QAAQ,CAAC,WAAW,EAAO,SAAS,eAAe,EAAE,CAAC;IACtD,QAAQ,CAAC,eAAe,EAAG,OAAO,CAAC;CACpC;AAED,eAAO,MAAM,wBAAwB,EAAE,eAKtC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,uBAQhC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,uBAAuB,EAC1B,CAAC,EAAE,uBAAuB,GACzB,OAAO,CAqBT"}
@@ -0,0 +1,100 @@
1
+ // Canonical pipeline-state descriptor — the data needed to bake a
2
+ // `GPURenderPipeline` minus the bind-group / shader-module / vertex-layout
3
+ // pieces (those come from the bucket's effect + family). This struct is
4
+ // what the bitfield encoder/decoder round-trips and what the pipeline
5
+ // cache keys on.
6
+ //
7
+ // All fields are plain (non-aval) values — descriptors are produced by
8
+ // snapshotting the user-authored aval PipelineState at scene-build or
9
+ // at modeKey-recompute time.
10
+ //
11
+ // Fields excluded by design (see derived-modes.md "What can and cannot
12
+ // be derived"):
13
+ // - depthBias triplet (continuous baked field; stays per-effect or
14
+ // per-SG-scope static, set when the descriptor is constructed)
15
+ // - blendConstant (dynamic state; set via setBlendConstant)
16
+ // - stencilReference (dynamic state; set via setStencilReference)
17
+ // - render-pass-constant fields (color/depth formats, sample count;
18
+ // known per bucket from the framebuffer signature)
19
+ export const DEFAULT_ATTACHMENT_BLEND = {
20
+ enabled: false,
21
+ color: { srcFactor: "one", dstFactor: "zero", operation: "add" },
22
+ alpha: { srcFactor: "one", dstFactor: "zero", operation: "add" },
23
+ writeMask: 0xF,
24
+ };
25
+ export const DEFAULT_DESCRIPTOR = {
26
+ topology: "triangle-list",
27
+ stripIndexFormat: undefined,
28
+ frontFace: "ccw",
29
+ cullMode: "back",
30
+ depth: { write: true, compare: "less", clamp: false },
31
+ attachments: [DEFAULT_ATTACHMENT_BLEND],
32
+ alphaToCoverage: false,
33
+ };
34
+ /**
35
+ * Structural equality on two descriptors. Used as the collision-safety
36
+ * fallback if a bitfield key ever needs disambiguation (not expected
37
+ * with the current layout; the bitfield is collision-free by
38
+ * construction).
39
+ */
40
+ export function descriptorEquals(a, b) {
41
+ if (a.topology !== b.topology)
42
+ return false;
43
+ if (a.stripIndexFormat !== b.stripIndexFormat)
44
+ return false;
45
+ if (a.frontFace !== b.frontFace)
46
+ return false;
47
+ if (a.cullMode !== b.cullMode)
48
+ return false;
49
+ if ((a.depth === undefined) !== (b.depth === undefined))
50
+ return false;
51
+ if (a.depth !== undefined && b.depth !== undefined) {
52
+ if (a.depth.write !== b.depth.write)
53
+ return false;
54
+ if (a.depth.compare !== b.depth.compare)
55
+ return false;
56
+ if (a.depth.clamp !== b.depth.clamp)
57
+ return false;
58
+ }
59
+ if ((a.stencil === undefined) !== (b.stencil === undefined))
60
+ return false;
61
+ if (a.stencil !== undefined && b.stencil !== undefined) {
62
+ if (!stencilEquals(a.stencil, b.stencil))
63
+ return false;
64
+ }
65
+ if (a.alphaToCoverage !== b.alphaToCoverage)
66
+ return false;
67
+ if (a.attachments.length !== b.attachments.length)
68
+ return false;
69
+ for (let i = 0; i < a.attachments.length; i++) {
70
+ if (!attachmentEquals(a.attachments[i], b.attachments[i]))
71
+ return false;
72
+ }
73
+ return true;
74
+ }
75
+ function attachmentEquals(a, b) {
76
+ if (a.enabled !== b.enabled)
77
+ return false;
78
+ if (a.writeMask !== b.writeMask)
79
+ return false;
80
+ if (!a.enabled)
81
+ return true; // color/alpha fields irrelevant
82
+ return (a.color.srcFactor === b.color.srcFactor &&
83
+ a.color.dstFactor === b.color.dstFactor &&
84
+ a.color.operation === b.color.operation &&
85
+ a.alpha.srcFactor === b.alpha.srcFactor &&
86
+ a.alpha.dstFactor === b.alpha.dstFactor &&
87
+ a.alpha.operation === b.alpha.operation);
88
+ }
89
+ function stencilFaceEquals(a, b) {
90
+ return (a.compare === b.compare &&
91
+ a.failOp === b.failOp &&
92
+ a.depthFailOp === b.depthFailOp &&
93
+ a.passOp === b.passOp);
94
+ }
95
+ function stencilEquals(a, b) {
96
+ if (a.readMask !== b.readMask || a.writeMask !== b.writeMask)
97
+ return false;
98
+ return stencilFaceEquals(a.front, b.front) && stencilFaceEquals(a.back, b.back);
99
+ }
100
+ //# sourceMappingURL=descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.js","sourceRoot":"","sources":["../../../src/runtime/pipelineCache/descriptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { PipelineStateDescriptor, AttachmentBlend, BlendComponent, DepthSlice, StencilSlice, StencilFace, CullMode, FrontFace, Topology, } from "./descriptor.js";
2
+ export { DEFAULT_DESCRIPTOR, DEFAULT_ATTACHMENT_BLEND, descriptorEquals, } from "./descriptor.js";
3
+ export { encodeModeKey, decodeModeKey, MAX_ATTACHMENTS, } from "./bitfield.js";
4
+ export { PipelineCache, type PipelineBuilder, } from "./cache.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/pipelineCache/index.ts"],"names":[],"mappings":"AASA,YAAY,EACV,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,UAAU,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,aAAa,EACb,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ // Pipeline cache module — bitfield-encoded GPURenderPipeline registry.
2
+ // Consumed by the multi-pipeline-bucket machinery to (a) pre-warm
3
+ // pipelines at scene-build, (b) sync-create on the runtime-mutation
4
+ // path, (c) look up pipelines by per-RO modeKey at encode.
5
+ //
6
+ // Manifest persistence (IndexedDB) is part of the design but not yet
7
+ // wired — added in a follow-up phase. The in-memory cache is the
8
+ // load-bearing piece.
9
+ export { DEFAULT_DESCRIPTOR, DEFAULT_ATTACHMENT_BLEND, descriptorEquals, } from "./descriptor.js";
10
+ export { encodeModeKey, decodeModeKey, MAX_ATTACHMENTS, } from "./bitfield.js";
11
+ export { PipelineCache, } from "./cache.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/pipelineCache/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,kEAAkE;AAClE,oEAAoE;AACpE,2DAA2D;AAC3D,EAAE;AACF,qEAAqE;AACrE,iEAAiE;AACjE,sBAAsB;AActB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,aAAa,GAEd,MAAM,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aardworx/wombat.rendering",
3
- "version": "0.9.14",
3
+ "version": "0.9.15",
4
4
  "description": "WebGPU rendering layer for the Wombat TypeScript stack — RenderObject/RenderTask/runtime + window glue, port of Aardvark.Rendering's lower layers on top of WebGPU and wombat.shader.",
5
5
  "license": "MIT",
6
6
  "author": "krauthaufen",