@carbonenginejs/runtime-resource 0.12.2 → 0.14.0

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 (238) hide show
  1. package/README.md +21 -0
  2. package/dist/CjsResMan.js +393 -29
  3. package/dist/CjsResMan.js.map +1 -1
  4. package/dist/format/carbonEffect/CjsCarbonEffectReader.js +165 -118
  5. package/dist/format/carbonEffect/CjsCarbonEffectReader.js.map +1 -1
  6. package/dist/format/carbonEffect/buildCarbonEffectContainer.js +182 -0
  7. package/dist/format/carbonEffect/buildCarbonEffectContainer.js.map +1 -0
  8. package/dist/format/carbonEffect/carbonEffectBackendBlock.js +7 -113
  9. package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
  10. package/dist/format/carbonEffect/carbonEffectRecords.js +258 -66
  11. package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -1
  12. package/dist/format/carbonEffect/carbonEffectResourceTransform.js +197 -0
  13. package/dist/format/carbonEffect/carbonEffectResourceTransform.js.map +1 -0
  14. package/dist/format/effect/effectBodyInventory.js +146 -0
  15. package/dist/format/effect/effectBodyInventory.js.map +1 -0
  16. package/dist/format/effect/effectPermutationGraph.js +13 -13
  17. package/dist/format/effect/effectPermutationGraph.js.map +1 -1
  18. package/dist/format/index.js +4 -4
  19. package/dist/formats/black/CjsBlackFormat.js +19 -1
  20. package/dist/formats/black/CjsBlackFormat.js.map +1 -1
  21. package/dist/formats/bnk/CjsBnkFormat.js +28 -9
  22. package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
  23. package/dist/formats/bnk/core/busNodes.js +252 -0
  24. package/dist/formats/bnk/core/busNodes.js.map +1 -0
  25. package/dist/formats/bnk/core/effectNodes.js +147 -0
  26. package/dist/formats/bnk/core/effectNodes.js.map +1 -0
  27. package/dist/formats/bnk/core/eventAction.js +135 -24
  28. package/dist/formats/bnk/core/eventAction.js.map +1 -1
  29. package/dist/formats/bnk/core/globalSettings.js +215 -0
  30. package/dist/formats/bnk/core/globalSettings.js.map +1 -0
  31. package/dist/formats/bnk/core/helpers.js +37 -5
  32. package/dist/formats/bnk/core/helpers.js.map +1 -1
  33. package/dist/formats/bnk/core/musicNodes.js +43 -19
  34. package/dist/formats/bnk/core/musicNodes.js.map +1 -1
  35. package/dist/formats/bnk/core/nodeBase.js +28 -7
  36. package/dist/formats/bnk/core/nodeBase.js.map +1 -1
  37. package/dist/formats/dds/core/helpers.js +40 -1
  38. package/dist/formats/dds/core/helpers.js.map +1 -1
  39. package/dist/formats/dxbc/CjsDxbcFormat.js +45 -0
  40. package/dist/formats/dxbc/CjsDxbcFormat.js.map +1 -1
  41. package/dist/formats/dxbc/core/disassemble.js +240 -0
  42. package/dist/formats/dxbc/core/disassemble.js.map +1 -0
  43. package/dist/formats/gltf/CjsGltfFormat.js +1 -39
  44. package/dist/formats/gltf/CjsGltfFormat.js.map +1 -1
  45. package/dist/formats/gltf/core/helpers.js +1 -21
  46. package/dist/formats/gltf/core/helpers.js.map +1 -1
  47. package/dist/formats/hlsl/CjsHlslFormat.js +0 -21
  48. package/dist/formats/hlsl/CjsHlslFormat.js.map +1 -1
  49. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +118 -49
  50. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -1
  51. package/dist/formats/hlsl/core/detailMapFamily.js +128 -0
  52. package/dist/formats/hlsl/core/detailMapFamily.js.map +1 -0
  53. package/dist/formats/hlsl/core/localLightFamily.js +133 -0
  54. package/dist/formats/hlsl/core/localLightFamily.js.map +1 -0
  55. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +79 -73
  56. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -1
  57. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +8 -1
  58. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -1
  59. package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +11 -691
  60. package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js.map +1 -1
  61. package/dist/formats/index.js +4 -2
  62. package/dist/formats/index.js.map +1 -1
  63. package/dist/formats/obj/CjsObjFormat.js +1 -22
  64. package/dist/formats/obj/CjsObjFormat.js.map +1 -1
  65. package/dist/formats/obj/core/helpers.js +1 -21
  66. package/dist/formats/obj/core/helpers.js.map +1 -1
  67. package/dist/formats/pickle/CjsPickleFormat.js +214 -0
  68. package/dist/formats/pickle/CjsPickleFormat.js.map +1 -0
  69. package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js +551 -0
  70. package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js.map +1 -0
  71. package/dist/formats/pickle/index.js +2 -0
  72. package/dist/formats/pickle/index.js.map +1 -0
  73. package/dist/formats/red/core/redGraph.js +11 -8
  74. package/dist/formats/red/core/redGraph.js.map +1 -1
  75. package/dist/formats/stl/CjsStlFormat.js +1 -46
  76. package/dist/formats/stl/CjsStlFormat.js.map +1 -1
  77. package/dist/formats/stl/core/helpers.js +1 -21
  78. package/dist/formats/stl/core/helpers.js.map +1 -1
  79. package/dist/formats/webgl/CjsWebglFormat.js +33 -55
  80. package/dist/formats/webgl/CjsWebglFormat.js.map +1 -1
  81. package/dist/formats/webgl/core/buildGlslEffectContainer.js +70 -0
  82. package/dist/formats/webgl/core/buildGlslEffectContainer.js.map +1 -0
  83. package/dist/formats/webgl/core/effectPackage.js +216 -108
  84. package/dist/formats/webgl/core/effectPackage.js.map +1 -1
  85. package/dist/formats/webgl/core/errors.js +1 -1
  86. package/dist/formats/webgl/core/errors.js.map +1 -1
  87. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +166 -24
  88. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
  89. package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +63 -5
  90. package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -1
  91. package/dist/formats/webgl/core/glsl/packedLightFixups.js +98 -0
  92. package/dist/formats/webgl/core/glsl/packedLightFixups.js.map +1 -0
  93. package/dist/formats/webgl/core/glslBackendBlock.js +552 -0
  94. package/dist/formats/webgl/core/glslBackendBlock.js.map +1 -0
  95. package/dist/formats/webgl/core/glslBackendBodySet.js +243 -0
  96. package/dist/formats/webgl/core/glslBackendBodySet.js.map +1 -0
  97. package/dist/formats/webgl/core/{cewgCompleteness.js → glslEffectCompleteness.js} +12 -8
  98. package/dist/formats/webgl/core/glslEffectCompleteness.js.map +1 -0
  99. package/dist/formats/webgl/core/helpers.js +33 -172
  100. package/dist/formats/webgl/core/helpers.js.map +1 -1
  101. package/dist/formats/webgl/core/inspectGlslEffectContainer.js +122 -0
  102. package/dist/formats/webgl/core/inspectGlslEffectContainer.js.map +1 -0
  103. package/dist/formats/webgl/core/readGlslEffectContainer.js +249 -0
  104. package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -0
  105. package/dist/formats/webgpu/CjsWebgpuFormat.js +15 -15
  106. package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
  107. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +37 -145
  108. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -1
  109. package/dist/formats/webgpu/core/{cewgpu/CewgpuContainer.js → carbonWebgpu/CarbonWebgpuContainer.js} +13 -27
  110. package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js.map +1 -0
  111. package/dist/formats/webgpu/core/{cewgpu → carbonWebgpu}/containerViews.js +1 -1
  112. package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js.map +1 -0
  113. package/dist/formats/webgpu/core/{cewgpu → carbonWebgpu}/validateContainer.js +4 -4
  114. package/dist/formats/webgpu/core/carbonWebgpu/validateContainer.js.map +1 -0
  115. package/dist/formats/webgpu/core/effectBackendBodySet.js +18 -18
  116. package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
  117. package/dist/formats/webgpu/core/errors.js +1 -1
  118. package/dist/formats/webgpu/core/errors.js.map +1 -1
  119. package/dist/formats/webgpu/core/helpers.js +22 -22
  120. package/dist/formats/webgpu/core/helpers.js.map +1 -1
  121. package/dist/formats/webgpu/core/packageEffect.js +11 -15
  122. package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
  123. package/dist/formats/webgpu/core/packageEffectSelection.js +1 -1
  124. package/dist/formats/webgpu/core/packageEffectSelection.js.map +1 -1
  125. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +23 -23
  126. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -1
  127. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +6 -6
  128. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -1
  129. package/dist/formats/yaml/CjsYamlFormat.js +3 -3
  130. package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
  131. package/dist/formats/yaml/core/CjsYamlReader.js +4 -6
  132. package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
  133. package/dist/formats/yaml/core/helpers.js +27 -1
  134. package/dist/formats/yaml/core/helpers.js.map +1 -1
  135. package/dist/index.js +2 -0
  136. package/dist/index.js.map +1 -1
  137. package/dist/resource/CjsLoadingObject.js +19 -0
  138. package/dist/resource/CjsLoadingObject.js.map +1 -0
  139. package/dist/resource/CjsResource.js +4 -0
  140. package/dist/resource/CjsResource.js.map +1 -1
  141. package/dist/resource/ResourceHandlerMode.js +14 -0
  142. package/dist/resource/ResourceHandlerMode.js.map +1 -0
  143. package/dist/resource/index.js +2 -0
  144. package/dist/resource/index.js.map +1 -1
  145. package/dist/resource/shader/Tr2EffectRes.js +118 -213
  146. package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
  147. package/dist/resource/shader/Tr2Shader.js +37 -15
  148. package/dist/resource/shader/Tr2Shader.js.map +1 -1
  149. package/dist/resource/shader/reflection/Tr2EffectConstant.js +37 -29
  150. package/dist/resource/shader/reflection/Tr2EffectConstant.js.map +1 -1
  151. package/dist/resource/shader/reflection/Tr2EffectDescription.js +39 -34
  152. package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
  153. package/dist/resource/shader/reflection/Tr2EffectLibrary.js +51 -30
  154. package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
  155. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +45 -25
  156. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
  157. package/dist/resource/shader/reflection/Tr2EffectResource.js +51 -17
  158. package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
  159. package/dist/resource/shader/reflection/Tr2EffectStageInput.js +219 -88
  160. package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
  161. package/dist/resource/shader/reflection/Tr2EffectTechnique.js +28 -18
  162. package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
  163. package/dist/resource/shader/reflection/Tr2Pass.js +96 -39
  164. package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
  165. package/dist/resource/shader/reflection/carbonRecordFields.js +159 -0
  166. package/dist/resource/shader/reflection/carbonRecordFields.js.map +1 -0
  167. package/dist/resource/shader/reflection/shaderStage.js +22 -0
  168. package/dist/resource/shader/reflection/shaderStage.js.map +1 -0
  169. package/dist/resource/shader/sampler/Tr2SamplerSetup.js +68 -10
  170. package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
  171. package/dist/worker/CjsResManMainThreadLoader.js +9 -7
  172. package/dist/worker/CjsResManMainThreadLoader.js.map +1 -1
  173. package/dist/worker/CjsResManWorker.js +5 -4
  174. package/dist/worker/CjsResManWorker.js.map +1 -1
  175. package/dist/worker/CjsResManWorkerLoader.js +9 -6
  176. package/dist/worker/CjsResManWorkerLoader.js.map +1 -1
  177. package/docs/README.md +2 -2
  178. package/docs/architecture.md +12 -3
  179. package/docs/concepts/resource-lifecycle.md +9 -8
  180. package/docs/concepts/shader-resource-model.md +14 -17
  181. package/docs/concepts/writing-an-engine-adapter.md +1 -1
  182. package/docs/formats/README.md +4 -2
  183. package/docs/formats/carbon-effect-container.md +127 -26
  184. package/docs/formats/dxbc/architecture.md +1 -1
  185. package/docs/formats/dxbc/reference/api.md +28 -0
  186. package/docs/formats/hlsl/README.md +3 -3
  187. package/docs/formats/hlsl/architecture.md +8 -9
  188. package/docs/formats/hlsl/guides/hydrating-json-output.md +3 -5
  189. package/docs/formats/hlsl/guides/reading-effects.md +5 -1
  190. package/docs/formats/hlsl/reference/advanced-analysis.md +20 -25
  191. package/docs/formats/hlsl/reference/api.md +0 -7
  192. package/docs/formats/hlsl/reference/json-graph.md +1 -4
  193. package/docs/formats/pickle.md +82 -0
  194. package/docs/formats/webgl/README.md +71 -13
  195. package/docs/formats/webgl/architecture.md +16 -17
  196. package/docs/formats/webgl/carbon-constant-layouts.md +3 -3
  197. package/docs/formats/webgl/decl-io.md +3 -3
  198. package/docs/formats/webgl/memory-structured.md +27 -8
  199. package/docs/formats/webgl/texture-sample.md +1 -1
  200. package/docs/formats/webgpu/README.md +3 -3
  201. package/docs/formats/webgpu/architecture.md +5 -6
  202. package/docs/formats/webgpu/formats/{cewgpu.md → carbon-webgpu.md} +10 -11
  203. package/docs/formats/webgpu/guides/effect-packaging.md +6 -8
  204. package/docs/formats/webgpu/reference/api.md +11 -12
  205. package/docs/formats/webgpu/reference/wgsl-compatibility.md +11 -8
  206. package/docs/formats/wwise.md +63 -2
  207. package/docs/reference/classes/core.md +10 -0
  208. package/docs/reference/classes/formats.md +40 -48
  209. package/docs/reference/classes/resources.md +2 -2
  210. package/docs/reference/queues.md +88 -4
  211. package/docs/reference/workers.md +7 -0
  212. package/package.json +61 -61
  213. package/dist/format/carbonEffect/carbonDescriptionFromPortable.js +0 -372
  214. package/dist/format/carbonEffect/carbonDescriptionFromPortable.js.map +0 -1
  215. package/dist/format/effect/effectReflectionPackage.js +0 -636
  216. package/dist/format/effect/effectReflectionPackage.js.map +0 -1
  217. package/dist/formats/hlsl/core/HlslReader.js +0 -16
  218. package/dist/formats/hlsl/core/HlslReader.js.map +0 -1
  219. package/dist/formats/hlsl/core/portableReflection.js +0 -848
  220. package/dist/formats/hlsl/core/portableReflection.js.map +0 -1
  221. package/dist/formats/hlsl/portable.js +0 -2
  222. package/dist/formats/hlsl/portable.js.map +0 -1
  223. package/dist/formats/webgl/core/cewg/CewgPackage.js +0 -340
  224. package/dist/formats/webgl/core/cewg/CewgPackage.js.map +0 -1
  225. package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js +0 -104
  226. package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js.map +0 -1
  227. package/dist/formats/webgl/core/cewg/binary.js +0 -19
  228. package/dist/formats/webgl/core/cewg/binary.js.map +0 -1
  229. package/dist/formats/webgl/core/cewgCompleteness.js.map +0 -1
  230. package/dist/formats/webgl/core/effectPackageValidation.js +0 -331
  231. package/dist/formats/webgl/core/effectPackageValidation.js.map +0 -1
  232. package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js.map +0 -1
  233. package/dist/formats/webgpu/core/cewgpu/containerViews.js.map +0 -1
  234. package/dist/formats/webgpu/core/cewgpu/validateContainer.js.map +0 -1
  235. package/dist/resource/shader/portable.js +0 -33
  236. package/dist/resource/shader/portable.js.map +0 -1
  237. package/docs/formats/hlsl/reference/portable-reflection.md +0 -141
  238. package/docs/formats/webgl/effect-reflection.md +0 -127
@@ -0,0 +1,182 @@
1
+ import { CjsCarbonEffectWriter } from './CjsCarbonEffectWriter.js';
2
+ import { CjsCarbonEffectReader } from './CjsCarbonEffectReader.js';
3
+ import { HlslShaderStageNames } from '../../formats/hlsl/core/tr2/HlslRenderContextEnum.js';
4
+ import { Tr2EffectDescription } from '../../resource/shader/reflection/Tr2EffectDescription.js';
5
+ import { CjsFormatWriteError } from '../CjsFormatError.js';
6
+
7
+ /**
8
+ * Assembles a backend effect container: Carbon's v15 record layout carrying our
9
+ * programs where a shipped file carries DXBC.
10
+ *
11
+ * The Carbon record layout is backend-invariant, and this module is the part
12
+ * that holds it that way. It walks the permutation graph, emits one description
13
+ * per distinct body, and substitutes stage programs and one optional trailing
14
+ * block per pass. What a program *is* and what the block *contains* are the only
15
+ * backend-varying decisions, so those two are the injected seam
16
+ * (`encodeProgram`, `encodeBackendBlock`) and nothing else here varies.
17
+ *
18
+ * Two backends use it. WGSL for WebGPU, GLSL ES 3.00 for WebGL 2. Their blocks
19
+ * are genuinely different documents - bind-group topology on one side, sampler
20
+ * fusion and synthesised bindings on the other - and neither is derivable from
21
+ * Carbon reflection. Which reader parses a given block is decided by the
22
+ * resource path the file came from, the same way the backend itself is chosen,
23
+ * so the two codecs may both start at their own version 1 without ambiguity.
24
+ */
25
+
26
+ /**
27
+ * There is no envelope, no magic and no version of our own. That is deliberate.
28
+ *
29
+ * A twelve-byte prefix (`magic | containerVersion | payloadKind`) was carried
30
+ * here and has been removed, along with a proposed "v16" for this variant.
31
+ * Neither survived the only question worth asking of an addition: what breaks
32
+ * without it?
33
+ *
34
+ * - `payloadKind` is redundant with the directory the file came from. Backend
35
+ * identity belongs to the `effect.webgpu/` or `effect.webgl2/` resource path.
36
+ * - The magic only distinguished our file from a Carbon one, which the same
37
+ * directory already answers, and which the file *name* answers too.
38
+ * - A version of our own would have claimed a number CCP owns, in the one field
39
+ * whose job is telling a reader how to parse. A real v16 from them would then
40
+ * collide with ours.
41
+ *
42
+ * What remains is a bare Carbon v15 record file. The shared record reader
43
+ * detects the per-pass block from the description's declared end.
44
+ *
45
+ * The one addition that does survive the question is the block itself: neither
46
+ * backend's binding topology is derivable from Carbon reflection, so without it
47
+ * there is no way to bind anything and no pipeline.
48
+ */
49
+
50
+ /**
51
+ * Maps one body's translated passes by pass key.
52
+ *
53
+ * @param {object} body Backend body-set record.
54
+ * @param {Map<string, object>} unitsByKey Units indexed by key.
55
+ * @returns {Map<string, object>} Units indexed by pass key.
56
+ */
57
+ function unitsByPassKey(body, unitsByKey) {
58
+ const result = new Map();
59
+ for (const pass of body.passes ?? []) {
60
+ result.set(pass.passKey, unitsByKey.get(pass.unitKey));
61
+ }
62
+ return result;
63
+ }
64
+
65
+ /**
66
+ * Builds one body's Carbon description record tree with backend programs
67
+ * substituted in.
68
+ *
69
+ * A body the translator could not lower retains its representable non-program
70
+ * description fields and carries zero-length programs. Emitting empty
71
+ * `shaderData` says exactly what the wire knows: no backend program was stored.
72
+ * Full portable source reflection remains in the in-memory build result, not
73
+ * in this emitted body.
74
+ *
75
+ * @param {object} effectRes Loaded version-15 `Tr2EffectRes`.
76
+ * @param {number} permutationIndex Representative permutation for this body.
77
+ * @param {Map<string, object>|null} passUnits Units by pass key, or null when unsupported.
78
+ * @param {object} backend Backend encoders.
79
+ * @returns {object} Description record tree.
80
+ */
81
+ function describeBody(reader, permutationIndex, passUnits, backend) {
82
+ // Read the source body once, as the resource layer reads any Carbon body,
83
+ // then substitute on the resulting graph and emit it. The substitution is
84
+ // two edits - a stage's program and a pass's trailing block - so there is
85
+ // nothing here that wants a bespoke mapping of its own.
86
+ const effect = Tr2EffectDescription.fromCarbonBinary(reader.readDescription(permutationIndex));
87
+ for (const technique of effect.techniques) {
88
+ for (const [passIndex, pass] of technique.passes.entries()) {
89
+ const passKey = `${technique.name}.pass${passIndex}`;
90
+ const unit = passUnits ? passUnits.get(passKey) : null;
91
+ for (const stage of pass.stageInputs) {
92
+ if (!stage.exists) continue;
93
+ const stageName = HlslShaderStageNames[stage.stageType];
94
+ const shader = unit?.shaders.find(entry => entry.key === `${passKey}.${stageName}`);
95
+ // A body the translator could not lower keeps its describable
96
+ // fields and carries a zero-length program: the wire then says
97
+ // exactly what is known, which is that no backend program was
98
+ // stored. The source DXBC is never re-emitted.
99
+ const bytes = shader ? backend.encodeProgram(shader) : new Uint8Array(0);
100
+ stage.sourceProgram = {
101
+ ...stage.sourceProgram,
102
+ bytes,
103
+ shaderSize: bytes.byteLength
104
+ };
105
+ }
106
+ const block = unit ? backend.encodeBackendBlock(unit, passKey) : null;
107
+ pass.backendBlock = block ? {
108
+ bytes: block,
109
+ size: block.byteLength
110
+ } : null;
111
+ }
112
+ }
113
+ return effect.toCarbonBinary();
114
+ }
115
+
116
+ /**
117
+ * Builds a complete backend effect container.
118
+ *
119
+ * @param {object} effectRes Loaded version-15 `Tr2EffectRes`.
120
+ * @param {object} permutationGraph Validated `PGRF` document.
121
+ * @param {object} backendBodySet Translated backend bodies.
122
+ * @param {object} backend Backend encoders.
123
+ * @param {(shader:object, stage:object, context:object)=>Uint8Array} backend.encodeProgram Encodes one stage program.
124
+ * @param {(unit:object, passKey:string)=>(Uint8Array|null)} backend.encodeBackendBlock Builds one pass's trailing block.
125
+ * @param {object} [options] Container options.
126
+ * @param {number[]|Uint8Array} [options.compilerVersion] Four version bytes.
127
+ * @param {string} [options.sourceHash] 32 ASCII hash characters.
128
+ * @returns {{bytes:Uint8Array, permutationCount:number, bodyCount:number}} Container and its body accounting.
129
+ */
130
+ function buildCarbonEffectContainer(effectRes, permutationGraph, backendBodySet, backend, options = {}) {
131
+ if (typeof backend?.encodeProgram !== "function" || typeof backend?.encodeBackendBlock !== "function") {
132
+ throw new CjsFormatWriteError("buildCarbonEffectContainer requires a backend with encodeProgram and encodeBackendBlock");
133
+ }
134
+
135
+ // One reader over the source file, shared by every body: the arena and the
136
+ // offset table are read once, and a body is a seek into them. A dx11 effect
137
+ // is a Carbon v15 container, so the same reader serves here and at load.
138
+ const reader = new CjsCarbonEffectReader(effectRes.m_data, {
139
+ source: effectRes.sourcePath || "effect source"
140
+ });
141
+ const unitsByKey = new Map(backendBodySet.passUnits.map(unit => [unit.key, unit]));
142
+ const bodyByKey = new Map(backendBodySet.bodies.map(body => [body.bodyKey, body]));
143
+ const writer = new CjsCarbonEffectWriter({
144
+ backend: true,
145
+ compilerVersion: options.compilerVersion ?? effectRes.m_compilerVersionBytes ?? [0, 0, 0, 0],
146
+ ...(options.sourceHash ? {
147
+ sourceHash: options.sourceHash
148
+ } : {})
149
+ });
150
+ for (const axis of permutationGraph.axes) {
151
+ writer.addPermutation({
152
+ name: axis.name,
153
+ defaultOption: axis.defaultOption,
154
+ description: axis.description,
155
+ type: axis.type,
156
+ options: axis.options
157
+ });
158
+ }
159
+
160
+ // Build one emitted description per source body key and reuse it for each
161
+ // matching permutation. The writer may dedupe additional descriptions when
162
+ // their emitted bytes become identical after source programs are replaced;
163
+ // the offset table remains dense.
164
+ const describedByBodyKey = new Map();
165
+ for (const [permutationIndex, variant] of permutationGraph.variants.entries()) {
166
+ let description = describedByBodyKey.get(variant.bodyKey);
167
+ if (!description) {
168
+ const body = bodyByKey.get(variant.bodyKey);
169
+ description = describeBody(reader, body?.representativePermutationIndex ?? permutationIndex, body?.status === "translated" ? unitsByPassKey(body, unitsByKey) : null, backend);
170
+ describedByBodyKey.set(variant.bodyKey, description);
171
+ }
172
+ writer.addBody(permutationIndex, description);
173
+ }
174
+ return {
175
+ bytes: writer.toBytes(),
176
+ permutationCount: permutationGraph.variants.length,
177
+ bodyCount: describedByBodyKey.size
178
+ };
179
+ }
180
+
181
+ export { buildCarbonEffectContainer };
182
+ //# sourceMappingURL=buildCarbonEffectContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildCarbonEffectContainer.js","sources":["../../../../src/format/carbonEffect/buildCarbonEffectContainer.js"],"sourcesContent":["import { CjsCarbonEffectWriter } from \"./CjsCarbonEffectWriter.js\";\nimport { CjsCarbonEffectReader } from \"./CjsCarbonEffectReader.js\";\nimport { HlslShaderStageNames } from \"../../formats/hlsl/core/tr2/HlslRenderContextEnum.js\";\nimport { Tr2EffectDescription } from \"../../resource/shader/reflection/Tr2EffectDescription.js\";\nimport { CjsFormatWriteError } from \"../CjsFormatError.js\";\n\n/**\n * Assembles a backend effect container: Carbon's v15 record layout carrying our\n * programs where a shipped file carries DXBC.\n *\n * The Carbon record layout is backend-invariant, and this module is the part\n * that holds it that way. It walks the permutation graph, emits one description\n * per distinct body, and substitutes stage programs and one optional trailing\n * block per pass. What a program *is* and what the block *contains* are the only\n * backend-varying decisions, so those two are the injected seam\n * (`encodeProgram`, `encodeBackendBlock`) and nothing else here varies.\n *\n * Two backends use it. WGSL for WebGPU, GLSL ES 3.00 for WebGL 2. Their blocks\n * are genuinely different documents - bind-group topology on one side, sampler\n * fusion and synthesised bindings on the other - and neither is derivable from\n * Carbon reflection. Which reader parses a given block is decided by the\n * resource path the file came from, the same way the backend itself is chosen,\n * so the two codecs may both start at their own version 1 without ambiguity.\n */\n\n/**\n * There is no envelope, no magic and no version of our own. That is deliberate.\n *\n * A twelve-byte prefix (`magic | containerVersion | payloadKind`) was carried\n * here and has been removed, along with a proposed \"v16\" for this variant.\n * Neither survived the only question worth asking of an addition: what breaks\n * without it?\n *\n * - `payloadKind` is redundant with the directory the file came from. Backend\n * identity belongs to the `effect.webgpu/` or `effect.webgl2/` resource path.\n * - The magic only distinguished our file from a Carbon one, which the same\n * directory already answers, and which the file *name* answers too.\n * - A version of our own would have claimed a number CCP owns, in the one field\n * whose job is telling a reader how to parse. A real v16 from them would then\n * collide with ours.\n *\n * What remains is a bare Carbon v15 record file. The shared record reader\n * detects the per-pass block from the description's declared end.\n *\n * The one addition that does survive the question is the block itself: neither\n * backend's binding topology is derivable from Carbon reflection, so without it\n * there is no way to bind anything and no pipeline.\n */\n\n/**\n * Maps one body's translated passes by pass key.\n *\n * @param {object} body Backend body-set record.\n * @param {Map<string, object>} unitsByKey Units indexed by key.\n * @returns {Map<string, object>} Units indexed by pass key.\n */\nfunction unitsByPassKey(body, unitsByKey)\n{\n const result = new Map();\n for (const pass of body.passes ?? [])\n {\n result.set(pass.passKey, unitsByKey.get(pass.unitKey));\n }\n return result;\n}\n\n/**\n * Builds one body's Carbon description record tree with backend programs\n * substituted in.\n *\n * A body the translator could not lower retains its representable non-program\n * description fields and carries zero-length programs. Emitting empty\n * `shaderData` says exactly what the wire knows: no backend program was stored.\n * Full portable source reflection remains in the in-memory build result, not\n * in this emitted body.\n *\n * @param {object} effectRes Loaded version-15 `Tr2EffectRes`.\n * @param {number} permutationIndex Representative permutation for this body.\n * @param {Map<string, object>|null} passUnits Units by pass key, or null when unsupported.\n * @param {object} backend Backend encoders.\n * @returns {object} Description record tree.\n */\nfunction describeBody(reader, permutationIndex, passUnits, backend)\n{\n // Read the source body once, as the resource layer reads any Carbon body,\n // then substitute on the resulting graph and emit it. The substitution is\n // two edits - a stage's program and a pass's trailing block - so there is\n // nothing here that wants a bespoke mapping of its own.\n const effect = Tr2EffectDescription.fromCarbonBinary(\n reader.readDescription(permutationIndex)\n );\n\n for (const technique of effect.techniques)\n {\n for (const [ passIndex, pass ] of technique.passes.entries())\n {\n const passKey = `${technique.name}.pass${passIndex}`;\n const unit = passUnits ? passUnits.get(passKey) : null;\n\n for (const stage of pass.stageInputs)\n {\n if (!stage.exists) continue;\n\n const stageName = HlslShaderStageNames[stage.stageType];\n const shader = unit?.shaders.find(\n (entry) => entry.key === `${passKey}.${stageName}`\n );\n // A body the translator could not lower keeps its describable\n // fields and carries a zero-length program: the wire then says\n // exactly what is known, which is that no backend program was\n // stored. The source DXBC is never re-emitted.\n const bytes = shader\n ? backend.encodeProgram(shader)\n : new Uint8Array(0);\n stage.sourceProgram = {\n ...stage.sourceProgram,\n bytes,\n shaderSize: bytes.byteLength\n };\n }\n\n const block = unit ? backend.encodeBackendBlock(unit, passKey) : null;\n pass.backendBlock = block\n ? { bytes: block, size: block.byteLength }\n : null;\n }\n }\n\n return effect.toCarbonBinary();\n}\n\n/**\n * Builds a complete backend effect container.\n *\n * @param {object} effectRes Loaded version-15 `Tr2EffectRes`.\n * @param {object} permutationGraph Validated `PGRF` document.\n * @param {object} backendBodySet Translated backend bodies.\n * @param {object} backend Backend encoders.\n * @param {(shader:object, stage:object, context:object)=>Uint8Array} backend.encodeProgram Encodes one stage program.\n * @param {(unit:object, passKey:string)=>(Uint8Array|null)} backend.encodeBackendBlock Builds one pass's trailing block.\n * @param {object} [options] Container options.\n * @param {number[]|Uint8Array} [options.compilerVersion] Four version bytes.\n * @param {string} [options.sourceHash] 32 ASCII hash characters.\n * @returns {{bytes:Uint8Array, permutationCount:number, bodyCount:number}} Container and its body accounting.\n */\nexport function buildCarbonEffectContainer(\n effectRes,\n permutationGraph,\n backendBodySet,\n backend,\n options = {}\n)\n{\n if (typeof backend?.encodeProgram !== \"function\"\n || typeof backend?.encodeBackendBlock !== \"function\")\n {\n throw new CjsFormatWriteError(\n \"buildCarbonEffectContainer requires a backend with encodeProgram and encodeBackendBlock\"\n );\n }\n\n // One reader over the source file, shared by every body: the arena and the\n // offset table are read once, and a body is a seek into them. A dx11 effect\n // is a Carbon v15 container, so the same reader serves here and at load.\n const reader = new CjsCarbonEffectReader(effectRes.m_data, {\n source: effectRes.sourcePath || \"effect source\"\n });\n const unitsByKey = new Map(backendBodySet.passUnits.map((unit) => [ unit.key, unit ]));\n const bodyByKey = new Map(backendBodySet.bodies.map((body) => [ body.bodyKey, body ]));\n const writer = new CjsCarbonEffectWriter({\n backend: true,\n compilerVersion: options.compilerVersion ?? effectRes.m_compilerVersionBytes ?? [ 0, 0, 0, 0 ],\n ...(options.sourceHash ? { sourceHash: options.sourceHash } : {})\n });\n\n for (const axis of permutationGraph.axes)\n {\n writer.addPermutation({\n name: axis.name,\n defaultOption: axis.defaultOption,\n description: axis.description,\n type: axis.type,\n options: axis.options\n });\n }\n\n // Build one emitted description per source body key and reuse it for each\n // matching permutation. The writer may dedupe additional descriptions when\n // their emitted bytes become identical after source programs are replaced;\n // the offset table remains dense.\n const describedByBodyKey = new Map();\n\n for (const [ permutationIndex, variant ] of permutationGraph.variants.entries())\n {\n let description = describedByBodyKey.get(variant.bodyKey);\n\n if (!description)\n {\n const body = bodyByKey.get(variant.bodyKey);\n description = describeBody(\n reader,\n body?.representativePermutationIndex ?? permutationIndex,\n body?.status === \"translated\" ? unitsByPassKey(body, unitsByKey) : null,\n backend\n );\n describedByBodyKey.set(variant.bodyKey, description);\n }\n\n writer.addBody(permutationIndex, description);\n }\n\n return {\n bytes: writer.toBytes(),\n permutationCount: permutationGraph.variants.length,\n bodyCount: describedByBodyKey.size\n };\n}\n\nexport default buildCarbonEffectContainer;\n"],"names":["unitsByPassKey","body","unitsByKey","result","Map","pass","passes","set","passKey","get","unitKey","describeBody","reader","permutationIndex","passUnits","backend","effect","Tr2EffectDescription","fromCarbonBinary","readDescription","technique","techniques","passIndex","entries","name","unit","stage","stageInputs","exists","stageName","HlslShaderStageNames","stageType","shader","shaders","find","entry","key","bytes","encodeProgram","Uint8Array","sourceProgram","shaderSize","byteLength","block","encodeBackendBlock","backendBlock","size","toCarbonBinary","buildCarbonEffectContainer","effectRes","permutationGraph","backendBodySet","options","CjsFormatWriteError","CjsCarbonEffectReader","m_data","source","sourcePath","map","bodyByKey","bodies","bodyKey","writer","CjsCarbonEffectWriter","compilerVersion","m_compilerVersionBytes","sourceHash","axis","axes","addPermutation","defaultOption","description","type","describedByBodyKey","variant","variants","representativePermutationIndex","status","addBody","toBytes","permutationCount","length","bodyCount"],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  import { CjsByteWriter } from '../CjsByteWriter.js';
2
2
  import { CjsByteReader } from '../CjsByteReader.js';
3
3
  import { CjsFormatReadError, CjsFormatWriteError } from '../CjsFormatError.js';
4
+ import { readInlineString, readTransformSection, writeInlineString, writeTransformSection } from './carbonEffectResourceTransform.js';
5
+ export { CARBON_BACKEND_TRANSFORM_FAMILY, DETAIL_MAP_ARRAY_DEFAULTS } from './carbonEffectResourceTransform.js';
4
6
 
5
7
  /**
6
- * The one optional trailing block per pass: WebGPU bind-group layouts and
7
- * resource transforms.
8
+ * The WebGPU pass block: bind-group layouts plus the shared resource-transform
9
+ * section.
8
10
  *
9
11
  * Neither is derivable from Carbon reflection. Carbon's `registers[]` is the D3D
10
12
  * binding model, while `(group, binding, visibility, generatedSymbol)` comes from
@@ -48,58 +50,9 @@ const CARBON_BACKEND_RESOURCE_KIND = Object.freeze(["uniform-buffer", "sampled-r
48
50
  /** Shader stages, as a bit position in the visibility mask. */
49
51
  const CARBON_BACKEND_VISIBILITY = Object.freeze(["vertex", "fragment", "compute"]);
50
52
 
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
53
  /** Marks an absent optional `u32`. Carbon's null-reference value. */
71
54
  const ABSENT = 0xffffffff;
72
55
 
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
56
  /**
104
57
  * Encodes a visibility list as a bit mask.
105
58
  *
@@ -259,29 +212,7 @@ function writeBackendBlock(block) {
259
212
  writeInlineString(writer, binding.transformId ?? "");
260
213
  }
261
214
  }
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
- }
215
+ writeTransformSection(writer, transforms);
285
216
  return writer.toBytes();
286
217
  }
287
218
 
@@ -360,44 +291,7 @@ function readBackendBlock(bytes, options = {}) {
360
291
  bindings
361
292
  });
362
293
  }
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
- }
294
+ const transforms = readTransformSection(reader, layoutKey);
401
295
 
402
296
  // A sized record parsed at a known version must land exactly on its declared
403
297
  // end. Trailing bytes mean the writer knew fields this reader does not — the
@@ -423,5 +317,5 @@ function readBackendBlock(bytes, options = {}) {
423
317
  };
424
318
  }
425
319
 
426
- export { CARBON_BACKEND_RESOURCE_KIND, CARBON_BACKEND_TRANSFORM_FAMILY, CARBON_BACKEND_VISIBILITY, CARBON_EFFECT_BACKEND_BLOCK_VERSION, DETAIL_MAP_ARRAY_DEFAULTS, readBackendBlock, writeBackendBlock };
320
+ export { CARBON_BACKEND_RESOURCE_KIND, CARBON_BACKEND_VISIBILITY, CARBON_EFFECT_BACKEND_BLOCK_VERSION, readBackendBlock, writeBackendBlock };
427
321
  //# sourceMappingURL=carbonEffectBackendBlock.js.map
@@ -1 +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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"}
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\";\nimport {\n CARBON_BACKEND_TRANSFORM_FAMILY,\n DETAIL_MAP_ARRAY_DEFAULTS,\n readInlineString,\n readTransformSection,\n writeInlineString,\n writeTransformSection\n} from \"./carbonEffectResourceTransform.js\";\n\n/**\n * The WebGPU pass block: bind-group layouts plus the shared resource-transform\n * section.\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// The transform section is shared with the GLSL block; both re-export the\n// family enum and defaults so a consumer of either codec sees them.\nexport { CARBON_BACKEND_TRANSFORM_FAMILY, DETAIL_MAP_ARRAY_DEFAULTS };\n\n/** Marks an absent optional `u32`. Carbon's null-reference value. */\nconst ABSENT = 0xffffffff;\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 writeTransformSection(writer, transforms);\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 = readTransformSection(reader, layoutKey);\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","ABSENT","packVisibility","visibility","mask","stage","bit","indexOf","CjsFormatWriteError","unpackVisibility","stages","length","push","deriveBindingDescriptor","binding","stride","structureStride","resourceKind","sampler","type","vec4Count","exec","CjsFormatReadError","buffer","hasDynamicOffset","minBindingSize","Number","texture","TEXTURE_DESCRIPTORS","undefined","sampleType","viewDimension","multisampled","writeBackendBlock","block","bindGroups","transforms","writer","CjsByteWriter","u8","group","bindings","kind","registerSpace","u32","registerIndex","arrayLayerCount","writeInlineString","generatedSymbol","transformId","writeTransformSection","toBytes","readBackendBlock","bytes","options","reader","CjsByteReader","source","layoutKey","version","readUint8","unsupported","groupCount","groupIndex","bindingCount","index","readUint32","readInlineString","identity","record","scopeIdentity","readTransformSection","remaining","trailingBytes"],"mappings":"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"}