@carbonenginejs/runtime-resource 0.11.1 → 0.12.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.
Files changed (211) hide show
  1. package/dist/CjsResMan.js +4 -4
  2. package/dist/CjsResMan.js.map +1 -1
  3. package/dist/_virtual/_rollupPluginBabelHelpers.js +1 -4
  4. package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
  5. package/dist/format/CjsByteReader.js +310 -0
  6. package/dist/format/CjsByteReader.js.map +1 -0
  7. package/dist/format/CjsByteWriter.js +242 -0
  8. package/dist/format/CjsByteWriter.js.map +1 -0
  9. package/dist/format/CjsFormatError.js +41 -0
  10. package/dist/format/CjsFormatError.js.map +1 -0
  11. package/dist/format/CjsStringTable.js +268 -0
  12. package/dist/format/CjsStringTable.js.map +1 -0
  13. package/dist/format/carbonEffect/CjsCarbonEffectReader.js +361 -0
  14. package/dist/format/carbonEffect/CjsCarbonEffectReader.js.map +1 -0
  15. package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +373 -0
  16. package/dist/format/carbonEffect/CjsCarbonEffectWriter.js.map +1 -0
  17. package/dist/format/carbonEffect/carbonDescriptionFromPortable.js +372 -0
  18. package/dist/format/carbonEffect/carbonDescriptionFromPortable.js.map +1 -0
  19. package/dist/format/carbonEffect/carbonEffectBackendBlock.js +427 -0
  20. package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -0
  21. package/dist/format/carbonEffect/carbonEffectRecords.js +955 -0
  22. package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -0
  23. package/dist/format/compareUtf8.js +36 -0
  24. package/dist/format/compareUtf8.js.map +1 -0
  25. package/dist/format/index.js +11 -0
  26. package/dist/format/index.js.map +1 -0
  27. package/dist/formats/bnk/CjsBnkFormat.js +18 -2
  28. package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
  29. package/dist/formats/bnk/core/eventAction.js +305 -0
  30. package/dist/formats/bnk/core/eventAction.js.map +1 -0
  31. package/dist/formats/bnk/core/graph.js +3 -6
  32. package/dist/formats/bnk/core/graph.js.map +1 -1
  33. package/dist/formats/bnk/core/helpers.js +62 -11
  34. package/dist/formats/bnk/core/helpers.js.map +1 -1
  35. package/dist/formats/bnk/core/nodeBase.js +532 -0
  36. package/dist/formats/bnk/core/nodeBase.js.map +1 -0
  37. package/dist/formats/bnk/core/sfxNodes.js +632 -0
  38. package/dist/formats/bnk/core/sfxNodes.js.map +1 -0
  39. package/dist/formats/bnk/core/soundbanksInfo.js +59 -51
  40. package/dist/formats/bnk/core/soundbanksInfo.js.map +1 -1
  41. package/dist/formats/gr2/CjsGr2Format.js +256 -13
  42. package/dist/formats/gr2/CjsGr2Format.js.map +1 -1
  43. package/dist/formats/gr2/core/helpers.js +15 -15
  44. package/dist/formats/gr2/core/helpers.js.map +1 -1
  45. package/dist/formats/gr2/core/json.js +1 -1
  46. package/dist/formats/gr2/core/json.js.map +1 -1
  47. package/dist/formats/gr2/core/targets.js +1 -1
  48. package/dist/formats/gr2/core/targets.js.map +1 -1
  49. package/dist/formats/gr2/index.js +0 -1
  50. package/dist/formats/gr2/index.js.map +1 -1
  51. package/dist/formats/hlsl/core/HlslReader.js +7 -257
  52. package/dist/formats/hlsl/core/HlslReader.js.map +1 -1
  53. package/dist/formats/hlsl/core/analysis.js +1 -1
  54. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +781 -0
  55. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -0
  56. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +21 -1
  57. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -1
  58. package/dist/formats/hlsl/index.js +1 -0
  59. package/dist/formats/hlsl/index.js.map +1 -1
  60. package/dist/formats/index.js +3 -6
  61. package/dist/formats/index.js.map +1 -1
  62. package/dist/formats/webgl/core/cewg/CewgPackage.js +2 -1
  63. package/dist/formats/webgl/core/cewg/CewgPackage.js.map +1 -1
  64. package/dist/formats/webgl/core/cewg/binary.js +11 -93
  65. package/dist/formats/webgl/core/cewg/binary.js.map +1 -1
  66. package/dist/formats/webgl/core/effectPackage.js +4 -1
  67. package/dist/formats/webgl/core/effectPackage.js.map +1 -1
  68. package/dist/formats/webgl/core/errors.js +3 -3
  69. package/dist/formats/webgl/core/errors.js.map +1 -1
  70. package/dist/formats/webgpu/CjsWebgpuFormat.js +4 -23
  71. package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
  72. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +197 -0
  73. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -0
  74. package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js +368 -0
  75. package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js.map +1 -0
  76. package/dist/formats/webgpu/core/cewgpu/containerViews.js +355 -0
  77. package/dist/formats/webgpu/core/cewgpu/containerViews.js.map +1 -0
  78. package/dist/formats/webgpu/core/cewgpu/validateContainer.js +90 -0
  79. package/dist/formats/webgpu/core/cewgpu/validateContainer.js.map +1 -0
  80. package/dist/formats/webgpu/core/effectBackendBodySet.js +21 -20
  81. package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
  82. package/dist/formats/webgpu/core/helpers.js +87 -92
  83. package/dist/formats/webgpu/core/helpers.js.map +1 -1
  84. package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js +14 -13
  85. package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js.map +1 -1
  86. package/dist/formats/webgpu/core/ir/inferValueTypes.js +10 -8
  87. package/dist/formats/webgpu/core/ir/inferValueTypes.js.map +1 -1
  88. package/dist/formats/webgpu/core/packageEffect.js +94 -9
  89. package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
  90. package/dist/formats/webgpu/core/packageMetadata.js +10 -1
  91. package/dist/formats/webgpu/core/packageMetadata.js.map +1 -1
  92. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +17 -15
  93. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -1
  94. package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +13 -12
  95. package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js.map +1 -1
  96. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +9 -8
  97. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -1
  98. package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js +23 -22
  99. package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js.map +1 -1
  100. package/dist/formats/webgpu/core/wgsl/selectionPlans.js +46 -44
  101. package/dist/formats/webgpu/core/wgsl/selectionPlans.js.map +1 -1
  102. package/dist/resource/CjsResource.js +700 -684
  103. package/dist/resource/CjsResource.js.map +1 -1
  104. package/dist/resource/Tr2LightProfileRes.js +18 -27
  105. package/dist/resource/Tr2LightProfileRes.js.map +1 -1
  106. package/dist/resource/audio/CjsAudioBufferRes.js +2 -2
  107. package/dist/resource/audio/CjsAudioBufferRes.js.map +1 -1
  108. package/dist/resource/audio/CjsAudioRes.js +2 -2
  109. package/dist/resource/audio/CjsAudioRes.js.map +1 -1
  110. package/dist/resource/geometry/TriGeometryRes.js +605 -586
  111. package/dist/resource/geometry/TriGeometryRes.js.map +1 -1
  112. package/dist/resource/geometry/granny/Tr2GrannyStateRes.js +21 -30
  113. package/dist/resource/geometry/granny/Tr2GrannyStateRes.js.map +1 -1
  114. package/dist/resource/geometry/granny/TriGrannyRes.js +21 -30
  115. package/dist/resource/geometry/granny/TriGrannyRes.js.map +1 -1
  116. package/dist/resource/shader/Tr2EffectRes.js +9 -7
  117. package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
  118. package/dist/resource/shader/Tr2MaterialArea.js +5 -3
  119. package/dist/resource/shader/Tr2MaterialArea.js.map +1 -1
  120. package/dist/resource/shader/Tr2MaterialMesh.js +4 -2
  121. package/dist/resource/shader/Tr2MaterialMesh.js.map +1 -1
  122. package/dist/resource/shader/Tr2MaterialRes.js +5 -3
  123. package/dist/resource/shader/Tr2MaterialRes.js.map +1 -1
  124. package/dist/resource/shader/Tr2Shader.js +26 -21
  125. package/dist/resource/shader/Tr2Shader.js.map +1 -1
  126. package/dist/resource/shader/Tr2ShaderPermutation.js +8 -6
  127. package/dist/resource/shader/Tr2ShaderPermutation.js.map +1 -1
  128. package/dist/resource/shader/reflection/Tr2EffectDefine.js +5 -3
  129. package/dist/resource/shader/reflection/Tr2EffectDefine.js.map +1 -1
  130. package/dist/resource/shader/reflection/Tr2EffectDescription.js +5 -3
  131. package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
  132. package/dist/resource/shader/reflection/Tr2EffectLibrary.js +17 -15
  133. package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
  134. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +11 -9
  135. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
  136. package/dist/resource/shader/reflection/Tr2EffectResource.js +8 -6
  137. package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
  138. package/dist/resource/shader/reflection/Tr2EffectStageInput.js +15 -13
  139. package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
  140. package/dist/resource/shader/reflection/Tr2EffectTechnique.js +7 -5
  141. package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
  142. package/dist/resource/shader/reflection/Tr2Pass.js +11 -9
  143. package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
  144. package/dist/resource/shader/sampler/Tr2SamplerSetup.js +8 -6
  145. package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
  146. package/dist/resource/texture/CjsTextureArrayRes.js +400 -411
  147. package/dist/resource/texture/CjsTextureArrayRes.js.map +1 -1
  148. package/dist/resource/texture/Tr2ImageRes.js +99 -95
  149. package/dist/resource/texture/Tr2ImageRes.js.map +1 -1
  150. package/dist/resource/texture/TriTextureRes.js +312 -273
  151. package/dist/resource/texture/TriTextureRes.js.map +1 -1
  152. package/docs/README.md +13 -1
  153. package/docs/architecture.md +3 -3
  154. package/docs/concepts/resource-lifecycle.md +9 -2
  155. package/docs/concepts/shader-resource-model.md +114 -0
  156. package/docs/concepts/writing-an-engine-adapter.md +115 -0
  157. package/docs/formats/README.md +24 -1
  158. package/docs/formats/carbon-effect-container.md +452 -0
  159. package/docs/formats/dxbc/README.md +68 -0
  160. package/docs/formats/dxbc/architecture.md +80 -0
  161. package/docs/formats/dxbc/reference/api.md +77 -0
  162. package/docs/formats/dxbc/reference/classes/README.md +9 -0
  163. package/docs/formats/dxbc/reference/decoded-output.md +122 -0
  164. package/docs/formats/gr2.md +3 -4
  165. package/docs/formats/hlsl/README.md +54 -0
  166. package/docs/formats/hlsl/architecture.md +67 -0
  167. package/docs/formats/hlsl/guides/hydrating-json-output.md +62 -0
  168. package/docs/formats/hlsl/guides/reading-effects.md +64 -0
  169. package/docs/formats/hlsl/reference/advanced-analysis.md +66 -0
  170. package/docs/formats/hlsl/reference/api.md +98 -0
  171. package/docs/formats/hlsl/reference/classes/README.md +11 -0
  172. package/docs/formats/hlsl/reference/json-graph.md +100 -0
  173. package/docs/formats/hlsl/reference/portable-reflection.md +141 -0
  174. package/docs/formats/provenance.md +32 -17
  175. package/docs/formats/webgl/README.md +57 -0
  176. package/docs/formats/webgl/architecture.md +70 -0
  177. package/docs/formats/webgl/carbon-constant-layouts.md +326 -0
  178. package/docs/formats/webgl/decl-io.md +1234 -0
  179. package/docs/formats/webgl/effect-reflection.md +127 -0
  180. package/docs/formats/webgl/memory-structured.md +871 -0
  181. package/docs/formats/webgl/reference/classes/README.md +9 -0
  182. package/docs/formats/webgl/texture-sample.md +964 -0
  183. package/docs/formats/webgpu/README.md +84 -0
  184. package/docs/formats/webgpu/architecture.md +96 -0
  185. package/docs/formats/webgpu/formats/cewgpu.md +216 -0
  186. package/docs/formats/webgpu/guides/effect-packaging.md +191 -0
  187. package/docs/formats/webgpu/reference/api.md +197 -0
  188. package/docs/formats/webgpu/reference/classes/README.md +9 -0
  189. package/docs/formats/webgpu/reference/wgsl-compatibility.md +1543 -0
  190. package/docs/formats/wwise.md +45 -4
  191. package/docs/reference/classes/core.md +80 -0
  192. package/docs/reference/classes/formats.md +24 -34
  193. package/docs/reference/events.md +25 -0
  194. package/docs/reference/motherlode-cache.md +22 -8
  195. package/docs/reference/workers.md +5 -5
  196. package/docs/roadmap.md +61 -41
  197. package/format-notices/bnk/NOTICE +5 -4
  198. package/format-notices/webgl/NOTICE +1 -1
  199. package/package.json +2 -1
  200. package/dist/formats/gr2/core/CjsFormatGr2.js +0 -273
  201. package/dist/formats/gr2/core/CjsFormatGr2.js.map +0 -1
  202. package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js +0 -415
  203. package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js.map +0 -1
  204. package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js +0 -100
  205. package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js.map +0 -1
  206. package/dist/formats/webgpu/core/cewgpu/binary.js +0 -93
  207. package/dist/formats/webgpu/core/cewgpu/binary.js.map +0 -1
  208. package/dist/formats/webgpu/core/cewgpu/tags.js +0 -17
  209. package/dist/formats/webgpu/core/cewgpu/tags.js.map +0 -1
  210. package/dist/formats/webgpu/core/effectPackageValidation.js +0 -1078
  211. package/dist/formats/webgpu/core/effectPackageValidation.js.map +0 -1
@@ -0,0 +1,427 @@
1
+ import { CjsByteWriter } from '../CjsByteWriter.js';
2
+ import { CjsByteReader } from '../CjsByteReader.js';
3
+ import { CjsFormatReadError, CjsFormatWriteError } from '../CjsFormatError.js';
4
+
5
+ /**
6
+ * The one optional trailing block per pass: WebGPU bind-group layouts and
7
+ * resource transforms.
8
+ *
9
+ * Neither is derivable from Carbon reflection. Carbon's `registers[]` is the D3D
10
+ * binding model, while `(group, binding, visibility, generatedSymbol)` comes from
11
+ * the *lowered IR's* bindings. So this is the port's only genuine invention, and
12
+ * it is built entirely from Carbon's own techniques: count-prefixed fixed-width
13
+ * records inside a blob referenced by `{u32 size, u32 offset}`, exactly like
14
+ * program source.
15
+ *
16
+ * Both sections share **one** block rather than occupying two, because the
17
+ * invariant worth keeping is "the Carbon region is backend-invariant, with
18
+ * exactly one optional trailing block". They are also mutually required — a
19
+ * transform needs a carrier binding in the same pass's layout and a transformed
20
+ * binding needs a recipe — so one unit is the honest shape.
21
+ *
22
+ * ## Why the block is self-contained
23
+ *
24
+ * The block lives in the arena so that identical layouts dedupe across bodies the
25
+ * way program source does; measured sharing is 30.5:1 at `(body, pass)`
26
+ * granularity, 22 distinct blocks across 672 pairs.
27
+ *
28
+ * That forces one design consequence: **the block cannot contain arena offsets.**
29
+ * An offset is only known after the arena's content sort, and the sort depends on
30
+ * every blob's bytes — including this one. A block referencing the arena would
31
+ * have to be interned before its own contents could be computed. Carbon never
32
+ * meets this because no Carbon arena blob refers to the arena.
33
+ *
34
+ * So strings are inline here, length-prefixed, not interned. The cost is real but
35
+ * small: a repeated `"t11"` inside 22 distinct blocks rather than one shared copy.
36
+ * The block itself is what dedupes, and it dedupes 30x.
37
+ */
38
+
39
+ /** Current block version. Bump when a field is added; readers may skip unknown. */
40
+ const CARBON_EFFECT_BACKEND_BLOCK_VERSION = 1;
41
+
42
+ /**
43
+ * Resource kinds, ordered so the wire value is stable
44
+ * (`buildWgslSet.js:117-122`).
45
+ */
46
+ const CARBON_BACKEND_RESOURCE_KIND = Object.freeze(["uniform-buffer", "sampled-resource", "sampler", "storage-resource"]);
47
+
48
+ /** Shader stages, as a bit position in the visibility mask. */
49
+ const CARBON_BACKEND_VISIBILITY = Object.freeze(["vertex", "fragment", "compute"]);
50
+
51
+ /**
52
+ * Resource-transform families. The discriminator exists so `kind`,
53
+ * `representation`, `missingLayer` and the output name stay derivable without
54
+ * pinning the format to one recognizer: a second family costs an enum value
55
+ * rather than a format version bump.
56
+ */
57
+ const CARBON_BACKEND_TRANSFORM_FAMILY = Object.freeze(["detail-map-array"]);
58
+
59
+ /** Constants a `detail-map-array` transform restores rather than storing. */
60
+ const DETAIL_MAP_ARRAY_DEFAULTS = Object.freeze({
61
+ version: 1,
62
+ kind: "texture-2d-array",
63
+ stage: "fragment",
64
+ representation: "native-or-rgba8",
65
+ missingLayer: "reject",
66
+ viewDimension: "2d-array",
67
+ outputName: "DetailMapArray"
68
+ });
69
+
70
+ /** Marks an absent optional `u32`. Carbon's null-reference value. */
71
+ const ABSENT = 0xffffffff;
72
+
73
+ /**
74
+ * Writes a length-prefixed UTF-8 string.
75
+ *
76
+ * @param {CjsByteWriter} writer Target writer.
77
+ * @param {string} value Text value.
78
+ */
79
+ function writeInlineString(writer, value) {
80
+ const bytes = new TextEncoder().encode(String(value ?? ""));
81
+ if (bytes.length > 0xffff) {
82
+ throw new CjsFormatWriteError("Backend block string exceeds 65535 bytes", {
83
+ byteLength: bytes.length
84
+ });
85
+ }
86
+ writer.u16(bytes.length);
87
+ writer.bytes(bytes);
88
+ }
89
+
90
+ /**
91
+ * Reads a length-prefixed UTF-8 string.
92
+ *
93
+ * @param {CjsByteReader} reader Source reader.
94
+ * @returns {string} Decoded text.
95
+ */
96
+ function readInlineString(reader) {
97
+ const length = reader.readUint16();
98
+ return new TextDecoder("utf-8", {
99
+ fatal: false
100
+ }).decode(reader.readRaw(length));
101
+ }
102
+
103
+ /**
104
+ * Encodes a visibility list as a bit mask.
105
+ *
106
+ * @param {string[]} visibility Stage names.
107
+ * @returns {number} Bit mask.
108
+ */
109
+ function packVisibility(visibility) {
110
+ let mask = 0;
111
+ for (const stage of visibility ?? []) {
112
+ const bit = CARBON_BACKEND_VISIBILITY.indexOf(stage);
113
+ if (bit < 0) {
114
+ throw new CjsFormatWriteError(`Unknown binding visibility "${stage}"`, {
115
+ stage
116
+ });
117
+ }
118
+ mask |= 1 << bit;
119
+ }
120
+ return mask;
121
+ }
122
+
123
+ /**
124
+ * Decodes a visibility bit mask, in the canonical stage order.
125
+ *
126
+ * @param {number} mask Bit mask.
127
+ * @returns {string[]} Stage names.
128
+ */
129
+ function unpackVisibility(mask) {
130
+ const stages = [];
131
+ for (let bit = 0; bit < CARBON_BACKEND_VISIBILITY.length; bit += 1) {
132
+ if (mask & 1 << bit) stages.push(CARBON_BACKEND_VISIBILITY[bit]);
133
+ }
134
+ return stages;
135
+ }
136
+
137
+ /**
138
+ * Rebuilds a binding's WebGPU descriptor from what the block does store.
139
+ *
140
+ * The descriptor — `buffer`, `texture` or `sampler` — is not on the wire because
141
+ * it is a pure function of the WGSL type, the resource kind and the structure
142
+ * stride, all three of which are. `lowerBindingLayout.js` derives it from the
143
+ * same three inputs on the way out; this derives it back on the way in.
144
+ *
145
+ * The pairs that could collide do not. `array<u32>` reaches both a structured
146
+ * buffer and a compute typed buffer, and the structure stride separates them:
147
+ * structured always carries one, typed never does.
148
+ *
149
+ * @param {object} binding Decoded binding record.
150
+ * @returns {object} The descriptor fragment, as one `{buffer|texture|sampler}` key.
151
+ */
152
+ function deriveBindingDescriptor(binding) {
153
+ const stride = binding.structureStride;
154
+ if (binding.resourceKind === "sampler") {
155
+ return {
156
+ sampler: {
157
+ type: "filtering"
158
+ }
159
+ };
160
+ }
161
+ if (binding.resourceKind === "uniform-buffer") {
162
+ const vec4Count = /^array<vec4<f32>, (\d+)>$/u.exec(binding.type)?.[1];
163
+ if (!vec4Count) {
164
+ throw new CjsFormatReadError(`Backend block uniform binding has untranslatable type "${binding.type}"`, {
165
+ type: binding.type
166
+ });
167
+ }
168
+ return {
169
+ buffer: {
170
+ type: "uniform",
171
+ hasDynamicOffset: false,
172
+ minBindingSize: Number(vec4Count) * 16
173
+ }
174
+ };
175
+ }
176
+ if (binding.resourceKind === "sampled-resource") {
177
+ const texture = TEXTURE_DESCRIPTORS[binding.type];
178
+ if (texture) return {
179
+ texture: {
180
+ ...texture
181
+ }
182
+ };
183
+ return {
184
+ buffer: {
185
+ type: "read-only-storage",
186
+ hasDynamicOffset: false,
187
+ minBindingSize: stride === undefined ? 4 : stride
188
+ }
189
+ };
190
+ }
191
+ return {
192
+ buffer: {
193
+ type: "storage",
194
+ hasDynamicOffset: false,
195
+ minBindingSize: stride === undefined ? 4 : stride
196
+ }
197
+ };
198
+ }
199
+
200
+ /** Texture descriptors by WGSL type (`lowerBindingLayout.js:90-95`). */
201
+ const TEXTURE_DESCRIPTORS = Object.freeze({
202
+ "texture_2d<f32>": Object.freeze({
203
+ sampleType: "float",
204
+ viewDimension: "2d",
205
+ multisampled: false
206
+ }),
207
+ "texture_cube<f32>": Object.freeze({
208
+ sampleType: "float",
209
+ viewDimension: "cube",
210
+ multisampled: false
211
+ }),
212
+ "texture_3d<f32>": Object.freeze({
213
+ sampleType: "float",
214
+ viewDimension: "3d",
215
+ multisampled: false
216
+ }),
217
+ "texture_2d_array<f32>": Object.freeze({
218
+ sampleType: "float",
219
+ viewDimension: "2d-array",
220
+ multisampled: false
221
+ })
222
+ });
223
+
224
+ /**
225
+ * Serialises one pass's backend block.
226
+ *
227
+ * @param {object} block Block contents.
228
+ * @param {object[]} [block.bindGroups] Bind groups with their bindings.
229
+ * @param {object[]} [block.transforms] Resource transforms.
230
+ * @returns {Uint8Array} Self-contained block bytes.
231
+ */
232
+ function writeBackendBlock(block) {
233
+ const bindGroups = block.bindGroups ?? [];
234
+ const transforms = block.transforms ?? [];
235
+ const writer = new CjsByteWriter(256);
236
+ writer.u8(CARBON_EFFECT_BACKEND_BLOCK_VERSION);
237
+ writer.u8(bindGroups.length);
238
+ for (const group of bindGroups) {
239
+ writer.u8(group.group);
240
+ writer.u8(group.bindings.length);
241
+ for (const binding of group.bindings) {
242
+ const kind = CARBON_BACKEND_RESOURCE_KIND.indexOf(binding.resourceKind);
243
+ if (kind < 0) {
244
+ throw new CjsFormatWriteError(`Unknown resource kind "${binding.resourceKind}"`, {
245
+ resourceKind: binding.resourceKind
246
+ });
247
+ }
248
+ writer.u8(kind);
249
+ writer.u8(binding.registerSpace);
250
+ writer.u8(binding.binding);
251
+ writer.u8(packVisibility(binding.visibility));
252
+ writer.u32(binding.registerIndex);
253
+ writer.u32(binding.structureStride ?? ABSENT);
254
+ writer.u8(binding.arrayLayerCount ?? 0);
255
+ writeInlineString(writer, binding.type);
256
+ writeInlineString(writer, binding.generatedSymbol);
257
+ // A binding either carries a transform id or it does not; an empty
258
+ // string is not a legal id, so length zero encodes absence.
259
+ writeInlineString(writer, binding.transformId ?? "");
260
+ }
261
+ }
262
+ writer.u8(transforms.length);
263
+ for (const transform of transforms) {
264
+ const family = CARBON_BACKEND_TRANSFORM_FAMILY.indexOf(transform.family ?? "detail-map-array");
265
+ if (family < 0) {
266
+ throw new CjsFormatWriteError(`Unknown transform family "${transform.family}"`, {
267
+ family: transform.family
268
+ });
269
+ }
270
+ writer.u8(family);
271
+ // `id` stays on the wire: a caller may supply it, and it propagates into
272
+ // the engine binding as `transformId`. Deriving it would foreclose the
273
+ // caller-supplied plan path to save four bytes.
274
+ writeInlineString(writer, transform.id);
275
+ writer.u8(transform.inputs.length);
276
+ for (const input of transform.inputs) {
277
+ // Array position is the layer. Safe because `parameter` stays on the
278
+ // wire, so layer identity remains cross-checkable rather than
279
+ // asserted by position.
280
+ writer.u8(input.registerSpace);
281
+ writer.u8(input.registerIndex);
282
+ writeInlineString(writer, input.parameter);
283
+ }
284
+ }
285
+ return writer.toBytes();
286
+ }
287
+
288
+ /**
289
+ * Parses one pass's backend block, restoring every derived field.
290
+ *
291
+ * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes Block bytes.
292
+ * @param {object} [options] Read options.
293
+ * @param {string} [options.layoutKey] Enclosing pass key, restored onto records.
294
+ * @param {string} [options.source] Source name for error details.
295
+ * @returns {object} Block contents with derived fields restored.
296
+ */
297
+ function readBackendBlock(bytes, options = {}) {
298
+ const reader = new CjsByteReader(bytes, {
299
+ source: options.source ?? "backend block"
300
+ });
301
+ const layoutKey = options.layoutKey ?? null;
302
+ const version = reader.readUint8();
303
+ if (version > CARBON_EFFECT_BACKEND_BLOCK_VERSION) {
304
+ // Forward compatibility: an unknown block version means a newer writer
305
+ // added fields. Report the pass as having no backend data rather than
306
+ // misparsing it; the enclosing `{size, offset}` pair makes it skippable.
307
+ return {
308
+ version,
309
+ unsupported: true,
310
+ bindGroups: [],
311
+ transforms: []
312
+ };
313
+ }
314
+ const bindGroups = [];
315
+ const groupCount = reader.readUint8();
316
+ for (let groupIndex = 0; groupIndex < groupCount; groupIndex += 1) {
317
+ const group = reader.readUint8();
318
+ const bindings = [];
319
+ const bindingCount = reader.readUint8();
320
+ for (let index = 0; index < bindingCount; index += 1) {
321
+ const resourceKind = CARBON_BACKEND_RESOURCE_KIND[reader.readUint8()];
322
+ const registerSpace = reader.readUint8();
323
+ const binding = reader.readUint8();
324
+ const visibility = unpackVisibility(reader.readUint8());
325
+ const registerIndex = reader.readUint32();
326
+ const structureStride = reader.readUint32();
327
+ const arrayLayerCount = reader.readUint8();
328
+ const type = readInlineString(reader);
329
+ const generatedSymbol = readInlineString(reader);
330
+ const transformId = readInlineString(reader);
331
+ const identity = `${resourceKind}:${registerSpace}:${registerIndex}`;
332
+ const record = {
333
+ group,
334
+ binding,
335
+ resourceKind,
336
+ registerSpace,
337
+ registerIndex,
338
+ visibility,
339
+ type,
340
+ generatedSymbol,
341
+ identity,
342
+ scopeIdentity: `${identity}@${visibility[0]}`,
343
+ ...(structureStride === ABSENT ? {} : {
344
+ structureStride
345
+ }),
346
+ ...(arrayLayerCount === 0 ? {} : {
347
+ arrayLayerCount
348
+ }),
349
+ ...(transformId === "" ? {} : {
350
+ transformId
351
+ })
352
+ };
353
+ bindings.push({
354
+ ...record,
355
+ ...deriveBindingDescriptor(record)
356
+ });
357
+ }
358
+ bindGroups.push({
359
+ group,
360
+ bindings
361
+ });
362
+ }
363
+ const transforms = [];
364
+ const transformCount = reader.readUint8();
365
+ for (let index = 0; index < transformCount; index += 1) {
366
+ const family = CARBON_BACKEND_TRANSFORM_FAMILY[reader.readUint8()];
367
+ const id = readInlineString(reader);
368
+ const inputs = [];
369
+ const inputCount = reader.readUint8();
370
+ for (let layer = 0; layer < inputCount; layer += 1) {
371
+ const registerSpace = reader.readUint8();
372
+ const registerIndex = reader.readUint8();
373
+ const parameter = readInlineString(reader);
374
+ const identity = `sampled-resource:${registerSpace}:${registerIndex}`;
375
+ inputs.push({
376
+ parameter,
377
+ layer,
378
+ identity,
379
+ scopeIdentity: `${identity}@${DETAIL_MAP_ARRAY_DEFAULTS.stage}`
380
+ });
381
+ }
382
+ transforms.push({
383
+ id,
384
+ family,
385
+ version: DETAIL_MAP_ARRAY_DEFAULTS.version,
386
+ kind: DETAIL_MAP_ARRAY_DEFAULTS.kind,
387
+ stage: DETAIL_MAP_ARRAY_DEFAULTS.stage,
388
+ representation: DETAIL_MAP_ARRAY_DEFAULTS.representation,
389
+ missingLayer: DETAIL_MAP_ARRAY_DEFAULTS.missingLayer,
390
+ layoutKey,
391
+ inputs,
392
+ output: {
393
+ name: DETAIL_MAP_ARRAY_DEFAULTS.outputName,
394
+ viewDimension: DETAIL_MAP_ARRAY_DEFAULTS.viewDimension,
395
+ layerCount: inputs.length,
396
+ identity: inputs[0]?.identity ?? null,
397
+ scopeIdentity: inputs[0]?.scopeIdentity ?? null
398
+ }
399
+ });
400
+ }
401
+
402
+ // A sized record parsed at a known version must land exactly on its declared
403
+ // end. Trailing bytes mean the writer knew fields this reader does not — the
404
+ // same skew an unknown `blobVersion` reports, arriving without a version bump.
405
+ // This is the only surviving form of a closed-schema check: under a record
406
+ // layout a field either exists at its offset or the read fails, so there is
407
+ // nothing per-field left to assert, but exhaustiveness is still checkable and
408
+ // is exactly what a silently-discarded tail would violate.
409
+ if (reader.remaining !== 0) {
410
+ throw new CjsFormatReadError(`Backend block has ${reader.remaining} unparsed trailing byte(s) at version ${version}`, {
411
+ source: options.source ?? "backend block",
412
+ version,
413
+ trailingBytes: reader.remaining
414
+ });
415
+ }
416
+ return {
417
+ version,
418
+ unsupported: false,
419
+ layoutKey,
420
+ bindGroups,
421
+ transforms,
422
+ trailingBytes: 0
423
+ };
424
+ }
425
+
426
+ export { CARBON_BACKEND_RESOURCE_KIND, CARBON_BACKEND_TRANSFORM_FAMILY, CARBON_BACKEND_VISIBILITY, CARBON_EFFECT_BACKEND_BLOCK_VERSION, DETAIL_MAP_ARRAY_DEFAULTS, readBackendBlock, writeBackendBlock };
427
+ //# sourceMappingURL=carbonEffectBackendBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carbonEffectBackendBlock.js","sources":["../../../../src/format/carbonEffect/carbonEffectBackendBlock.js"],"sourcesContent":["import { CjsByteWriter } from \"../CjsByteWriter.js\";\nimport { CjsByteReader } from \"../CjsByteReader.js\";\nimport { CjsFormatReadError, CjsFormatWriteError } from \"../CjsFormatError.js\";\n\n/**\n * The one optional trailing block per pass: WebGPU bind-group layouts and\n * resource transforms.\n *\n * Neither is derivable from Carbon reflection. Carbon's `registers[]` is the D3D\n * binding model, while `(group, binding, visibility, generatedSymbol)` comes from\n * the *lowered IR's* bindings. So this is the port's only genuine invention, and\n * it is built entirely from Carbon's own techniques: count-prefixed fixed-width\n * records inside a blob referenced by `{u32 size, u32 offset}`, exactly like\n * program source.\n *\n * Both sections share **one** block rather than occupying two, because the\n * invariant worth keeping is \"the Carbon region is backend-invariant, with\n * exactly one optional trailing block\". They are also mutually required — a\n * transform needs a carrier binding in the same pass's layout and a transformed\n * binding needs a recipe — so one unit is the honest shape.\n *\n * ## Why the block is self-contained\n *\n * The block lives in the arena so that identical layouts dedupe across bodies the\n * way program source does; measured sharing is 30.5:1 at `(body, pass)`\n * granularity, 22 distinct blocks across 672 pairs.\n *\n * That forces one design consequence: **the block cannot contain arena offsets.**\n * An offset is only known after the arena's content sort, and the sort depends on\n * every blob's bytes — including this one. A block referencing the arena would\n * have to be interned before its own contents could be computed. Carbon never\n * meets this because no Carbon arena blob refers to the arena.\n *\n * So strings are inline here, length-prefixed, not interned. The cost is real but\n * small: a repeated `\"t11\"` inside 22 distinct blocks rather than one shared copy.\n * The block itself is what dedupes, and it dedupes 30x.\n */\n\n/** Current block version. Bump when a field is added; readers may skip unknown. */\nexport const CARBON_EFFECT_BACKEND_BLOCK_VERSION = 1;\n\n/**\n * Resource kinds, ordered so the wire value is stable\n * (`buildWgslSet.js:117-122`).\n */\nexport const CARBON_BACKEND_RESOURCE_KIND = Object.freeze([\n \"uniform-buffer\",\n \"sampled-resource\",\n \"sampler\",\n \"storage-resource\"\n]);\n\n/** Shader stages, as a bit position in the visibility mask. */\nexport const CARBON_BACKEND_VISIBILITY = Object.freeze([ \"vertex\", \"fragment\", \"compute\" ]);\n\n/**\n * Resource-transform families. The discriminator exists so `kind`,\n * `representation`, `missingLayer` and the output name stay derivable without\n * pinning the format to one recognizer: a second family costs an enum value\n * rather than a format version bump.\n */\nexport const CARBON_BACKEND_TRANSFORM_FAMILY = Object.freeze([ \"detail-map-array\" ]);\n\n/** Constants a `detail-map-array` transform restores rather than storing. */\nexport const DETAIL_MAP_ARRAY_DEFAULTS = Object.freeze({\n version: 1,\n kind: \"texture-2d-array\",\n stage: \"fragment\",\n representation: \"native-or-rgba8\",\n missingLayer: \"reject\",\n viewDimension: \"2d-array\",\n outputName: \"DetailMapArray\"\n});\n\n/** Marks an absent optional `u32`. Carbon's null-reference value. */\nconst ABSENT = 0xffffffff;\n\n/**\n * Writes a length-prefixed UTF-8 string.\n *\n * @param {CjsByteWriter} writer Target writer.\n * @param {string} value Text value.\n */\nfunction writeInlineString(writer, value)\n{\n const bytes = new TextEncoder().encode(String(value ?? \"\"));\n if (bytes.length > 0xffff)\n {\n throw new CjsFormatWriteError(\"Backend block string exceeds 65535 bytes\", {\n byteLength: bytes.length\n });\n }\n writer.u16(bytes.length);\n writer.bytes(bytes);\n}\n\n/**\n * Reads a length-prefixed UTF-8 string.\n *\n * @param {CjsByteReader} reader Source reader.\n * @returns {string} Decoded text.\n */\nfunction readInlineString(reader)\n{\n const length = reader.readUint16();\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(reader.readRaw(length));\n}\n\n/**\n * Encodes a visibility list as a bit mask.\n *\n * @param {string[]} visibility Stage names.\n * @returns {number} Bit mask.\n */\nfunction packVisibility(visibility)\n{\n let mask = 0;\n for (const stage of visibility ?? [])\n {\n const bit = CARBON_BACKEND_VISIBILITY.indexOf(stage);\n if (bit < 0)\n {\n throw new CjsFormatWriteError(`Unknown binding visibility \"${stage}\"`, { stage });\n }\n mask |= 1 << bit;\n }\n return mask;\n}\n\n/**\n * Decodes a visibility bit mask, in the canonical stage order.\n *\n * @param {number} mask Bit mask.\n * @returns {string[]} Stage names.\n */\nfunction unpackVisibility(mask)\n{\n const stages = [];\n for (let bit = 0; bit < CARBON_BACKEND_VISIBILITY.length; bit += 1)\n {\n if (mask & (1 << bit)) stages.push(CARBON_BACKEND_VISIBILITY[bit]);\n }\n return stages;\n}\n\n/**\n * Rebuilds a binding's WebGPU descriptor from what the block does store.\n *\n * The descriptor — `buffer`, `texture` or `sampler` — is not on the wire because\n * it is a pure function of the WGSL type, the resource kind and the structure\n * stride, all three of which are. `lowerBindingLayout.js` derives it from the\n * same three inputs on the way out; this derives it back on the way in.\n *\n * The pairs that could collide do not. `array<u32>` reaches both a structured\n * buffer and a compute typed buffer, and the structure stride separates them:\n * structured always carries one, typed never does.\n *\n * @param {object} binding Decoded binding record.\n * @returns {object} The descriptor fragment, as one `{buffer|texture|sampler}` key.\n */\nfunction deriveBindingDescriptor(binding)\n{\n const stride = binding.structureStride;\n\n if (binding.resourceKind === \"sampler\")\n {\n return { sampler: { type: \"filtering\" } };\n }\n\n if (binding.resourceKind === \"uniform-buffer\")\n {\n const vec4Count = /^array<vec4<f32>, (\\d+)>$/u.exec(binding.type)?.[1];\n if (!vec4Count)\n {\n throw new CjsFormatReadError(\n `Backend block uniform binding has untranslatable type \"${binding.type}\"`,\n { type: binding.type }\n );\n }\n return {\n buffer: {\n type: \"uniform\",\n hasDynamicOffset: false,\n minBindingSize: Number(vec4Count) * 16\n }\n };\n }\n\n if (binding.resourceKind === \"sampled-resource\")\n {\n const texture = TEXTURE_DESCRIPTORS[binding.type];\n if (texture) return { texture: { ...texture } };\n\n return {\n buffer: {\n type: \"read-only-storage\",\n hasDynamicOffset: false,\n minBindingSize: stride === undefined ? 4 : stride\n }\n };\n }\n\n return {\n buffer: {\n type: \"storage\",\n hasDynamicOffset: false,\n minBindingSize: stride === undefined ? 4 : stride\n }\n };\n}\n\n/** Texture descriptors by WGSL type (`lowerBindingLayout.js:90-95`). */\nconst TEXTURE_DESCRIPTORS = Object.freeze({\n \"texture_2d<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"2d\", multisampled: false }),\n \"texture_cube<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"cube\", multisampled: false }),\n \"texture_3d<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"3d\", multisampled: false }),\n \"texture_2d_array<f32>\": Object.freeze({ sampleType: \"float\", viewDimension: \"2d-array\", multisampled: false })\n});\n\n/**\n * Serialises one pass's backend block.\n *\n * @param {object} block Block contents.\n * @param {object[]} [block.bindGroups] Bind groups with their bindings.\n * @param {object[]} [block.transforms] Resource transforms.\n * @returns {Uint8Array} Self-contained block bytes.\n */\nexport function writeBackendBlock(block)\n{\n const bindGroups = block.bindGroups ?? [];\n const transforms = block.transforms ?? [];\n const writer = new CjsByteWriter(256);\n\n writer.u8(CARBON_EFFECT_BACKEND_BLOCK_VERSION);\n\n writer.u8(bindGroups.length);\n for (const group of bindGroups)\n {\n writer.u8(group.group);\n writer.u8(group.bindings.length);\n for (const binding of group.bindings)\n {\n const kind = CARBON_BACKEND_RESOURCE_KIND.indexOf(binding.resourceKind);\n if (kind < 0)\n {\n throw new CjsFormatWriteError(`Unknown resource kind \"${binding.resourceKind}\"`, {\n resourceKind: binding.resourceKind\n });\n }\n writer.u8(kind);\n writer.u8(binding.registerSpace);\n writer.u8(binding.binding);\n writer.u8(packVisibility(binding.visibility));\n writer.u32(binding.registerIndex);\n writer.u32(binding.structureStride ?? ABSENT);\n writer.u8(binding.arrayLayerCount ?? 0);\n writeInlineString(writer, binding.type);\n writeInlineString(writer, binding.generatedSymbol);\n // A binding either carries a transform id or it does not; an empty\n // string is not a legal id, so length zero encodes absence.\n writeInlineString(writer, binding.transformId ?? \"\");\n }\n }\n\n writer.u8(transforms.length);\n for (const transform of transforms)\n {\n const family = CARBON_BACKEND_TRANSFORM_FAMILY.indexOf(transform.family ?? \"detail-map-array\");\n if (family < 0)\n {\n throw new CjsFormatWriteError(`Unknown transform family \"${transform.family}\"`, {\n family: transform.family\n });\n }\n writer.u8(family);\n // `id` stays on the wire: a caller may supply it, and it propagates into\n // the engine binding as `transformId`. Deriving it would foreclose the\n // caller-supplied plan path to save four bytes.\n writeInlineString(writer, transform.id);\n writer.u8(transform.inputs.length);\n for (const input of transform.inputs)\n {\n // Array position is the layer. Safe because `parameter` stays on the\n // wire, so layer identity remains cross-checkable rather than\n // asserted by position.\n writer.u8(input.registerSpace);\n writer.u8(input.registerIndex);\n writeInlineString(writer, input.parameter);\n }\n }\n\n return writer.toBytes();\n}\n\n/**\n * Parses one pass's backend block, restoring every derived field.\n *\n * @param {ArrayBuffer|ArrayBufferView|Uint8Array} bytes Block bytes.\n * @param {object} [options] Read options.\n * @param {string} [options.layoutKey] Enclosing pass key, restored onto records.\n * @param {string} [options.source] Source name for error details.\n * @returns {object} Block contents with derived fields restored.\n */\nexport function readBackendBlock(bytes, options = {})\n{\n const reader = new CjsByteReader(bytes, { source: options.source ?? \"backend block\" });\n const layoutKey = options.layoutKey ?? null;\n\n const version = reader.readUint8();\n if (version > CARBON_EFFECT_BACKEND_BLOCK_VERSION)\n {\n // Forward compatibility: an unknown block version means a newer writer\n // added fields. Report the pass as having no backend data rather than\n // misparsing it; the enclosing `{size, offset}` pair makes it skippable.\n return { version, unsupported: true, bindGroups: [], transforms: [] };\n }\n\n const bindGroups = [];\n const groupCount = reader.readUint8();\n for (let groupIndex = 0; groupIndex < groupCount; groupIndex += 1)\n {\n const group = reader.readUint8();\n const bindings = [];\n const bindingCount = reader.readUint8();\n for (let index = 0; index < bindingCount; index += 1)\n {\n const resourceKind = CARBON_BACKEND_RESOURCE_KIND[reader.readUint8()];\n const registerSpace = reader.readUint8();\n const binding = reader.readUint8();\n const visibility = unpackVisibility(reader.readUint8());\n const registerIndex = reader.readUint32();\n const structureStride = reader.readUint32();\n const arrayLayerCount = reader.readUint8();\n const type = readInlineString(reader);\n const generatedSymbol = readInlineString(reader);\n const transformId = readInlineString(reader);\n\n const identity = `${resourceKind}:${registerSpace}:${registerIndex}`;\n const record = {\n group,\n binding,\n resourceKind,\n registerSpace,\n registerIndex,\n visibility,\n type,\n generatedSymbol,\n identity,\n scopeIdentity: `${identity}@${visibility[0]}`,\n ...(structureStride === ABSENT ? {} : { structureStride }),\n ...(arrayLayerCount === 0 ? {} : { arrayLayerCount }),\n ...(transformId === \"\" ? {} : { transformId })\n };\n bindings.push({ ...record, ...deriveBindingDescriptor(record) });\n }\n bindGroups.push({ group, bindings });\n }\n\n const transforms = [];\n const transformCount = reader.readUint8();\n for (let index = 0; index < transformCount; index += 1)\n {\n const family = CARBON_BACKEND_TRANSFORM_FAMILY[reader.readUint8()];\n const id = readInlineString(reader);\n const inputs = [];\n const inputCount = reader.readUint8();\n for (let layer = 0; layer < inputCount; layer += 1)\n {\n const registerSpace = reader.readUint8();\n const registerIndex = reader.readUint8();\n const parameter = readInlineString(reader);\n const identity = `sampled-resource:${registerSpace}:${registerIndex}`;\n inputs.push({\n parameter,\n layer,\n identity,\n scopeIdentity: `${identity}@${DETAIL_MAP_ARRAY_DEFAULTS.stage}`\n });\n }\n\n transforms.push({\n id,\n family,\n version: DETAIL_MAP_ARRAY_DEFAULTS.version,\n kind: DETAIL_MAP_ARRAY_DEFAULTS.kind,\n stage: DETAIL_MAP_ARRAY_DEFAULTS.stage,\n representation: DETAIL_MAP_ARRAY_DEFAULTS.representation,\n missingLayer: DETAIL_MAP_ARRAY_DEFAULTS.missingLayer,\n layoutKey,\n inputs,\n output: {\n name: DETAIL_MAP_ARRAY_DEFAULTS.outputName,\n viewDimension: DETAIL_MAP_ARRAY_DEFAULTS.viewDimension,\n layerCount: inputs.length,\n identity: inputs[0]?.identity ?? null,\n scopeIdentity: inputs[0]?.scopeIdentity ?? null\n }\n });\n }\n\n // A sized record parsed at a known version must land exactly on its declared\n // end. Trailing bytes mean the writer knew fields this reader does not — the\n // same skew an unknown `blobVersion` reports, arriving without a version bump.\n // This is the only surviving form of a closed-schema check: under a record\n // layout a field either exists at its offset or the read fails, so there is\n // nothing per-field left to assert, but exhaustiveness is still checkable and\n // is exactly what a silently-discarded tail would violate.\n if (reader.remaining !== 0)\n {\n throw new CjsFormatReadError(\n `Backend block has ${reader.remaining} unparsed trailing byte(s) at version ${version}`,\n { source: options.source ?? \"backend block\", version, trailingBytes: reader.remaining }\n );\n }\n\n return {\n version,\n unsupported: false,\n layoutKey,\n bindGroups,\n transforms,\n trailingBytes: 0\n };\n}\n"],"names":["CARBON_EFFECT_BACKEND_BLOCK_VERSION","CARBON_BACKEND_RESOURCE_KIND","Object","freeze","CARBON_BACKEND_VISIBILITY","CARBON_BACKEND_TRANSFORM_FAMILY","DETAIL_MAP_ARRAY_DEFAULTS","version","kind","stage","representation","missingLayer","viewDimension","outputName","ABSENT","writeInlineString","writer","value","bytes","TextEncoder","encode","String","length","CjsFormatWriteError","byteLength","u16","readInlineString","reader","readUint16","TextDecoder","fatal","decode","readRaw","packVisibility","visibility","mask","bit","indexOf","unpackVisibility","stages","push","deriveBindingDescriptor","binding","stride","structureStride","resourceKind","sampler","type","vec4Count","exec","CjsFormatReadError","buffer","hasDynamicOffset","minBindingSize","Number","texture","TEXTURE_DESCRIPTORS","undefined","sampleType","multisampled","writeBackendBlock","block","bindGroups","transforms","CjsByteWriter","u8","group","bindings","registerSpace","u32","registerIndex","arrayLayerCount","generatedSymbol","transformId","transform","family","id","inputs","input","parameter","toBytes","readBackendBlock","options","CjsByteReader","source","layoutKey","readUint8","unsupported","groupCount","groupIndex","bindingCount","index","readUint32","identity","record","scopeIdentity","transformCount","inputCount","layer","output","name","layerCount","remaining","trailingBytes"],"mappings":"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"}