@carbonenginejs/runtime-resource 0.16.0 → 0.18.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 (54) hide show
  1. package/dist/format/CjsFormat.js +84 -83
  2. package/dist/format/CjsFormat.js.map +1 -1
  3. package/dist/format/CjsResourceProbe.js +87 -86
  4. package/dist/format/CjsResourceProbe.js.map +1 -1
  5. package/dist/format/carbonEffect/backendEngineId.js +98 -0
  6. package/dist/format/carbonEffect/backendEngineId.js.map +1 -0
  7. package/dist/format/carbonEffect/carbonEffectBackendBlock.js +24 -23
  8. package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
  9. package/dist/format/carbonEffect/carbonEffectResourceTransform.js +1 -1
  10. package/dist/format/carbonEffect/carbonEffectResourceTransform.js.map +1 -1
  11. package/dist/format/effect/effectPermutationGraph.js +46 -29
  12. package/dist/format/effect/effectPermutationGraph.js.map +1 -1
  13. package/dist/format/index.js +1 -1
  14. package/dist/formats/hlsl/core/detailMapFamily.js +1 -1
  15. package/dist/formats/hlsl/core/detailMapFamily.js.map +1 -1
  16. package/dist/formats/hlsl/core/localLightFamily.js +1 -1
  17. package/dist/formats/hlsl/core/localLightFamily.js.map +1 -1
  18. package/dist/formats/png/core/helpers.js +27 -8
  19. package/dist/formats/png/core/helpers.js.map +1 -1
  20. package/dist/formats/webgl/core/effectPackage.js +143 -56
  21. package/dist/formats/webgl/core/effectPackage.js.map +1 -1
  22. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +799 -456
  23. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
  24. package/dist/formats/webgl/core/glslBackendBlock.js +74 -30
  25. package/dist/formats/webgl/core/glslBackendBlock.js.map +1 -1
  26. package/dist/formats/webgl/core/glslBackendBodySet.js +0 -1
  27. package/dist/formats/webgl/core/glslBackendBodySet.js.map +1 -1
  28. package/dist/formats/webgl/core/helpers.js +53 -53
  29. package/dist/formats/webgl/core/helpers.js.map +1 -1
  30. package/dist/formats/webgl/core/readGlslEffectContainer.js +82 -67
  31. package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -1
  32. package/dist/formats/webgpu/CjsWebgpuFormat.js +161 -163
  33. package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
  34. package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js +10 -1
  35. package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js.map +1 -1
  36. package/dist/formats/webgpu/core/effectBackendBodySet.js +21 -22
  37. package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
  38. package/dist/formats/webgpu/core/helpers.js +111 -99
  39. package/dist/formats/webgpu/core/helpers.js.map +1 -1
  40. package/dist/formats/webgpu/core/packageEffect.js +30 -32
  41. package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
  42. package/dist/formats/wem/CjsWemFormat.js +121 -121
  43. package/dist/formats/wem/CjsWemFormat.js.map +1 -1
  44. package/dist/formats/wem/core/resolve.js +8 -8
  45. package/dist/formats/wem/core/resolve.js.map +1 -1
  46. package/dist/resource/shader/reflection/Tr2EffectStageInput.js +102 -60
  47. package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
  48. package/docs/concepts/format-type-resolution.md +79 -0
  49. package/docs/formats/README.md +11 -0
  50. package/docs/formats/webgpu/formats/carbon-webgpu.md +11 -4
  51. package/docs/formats/webgpu/reference/api.md +7 -6
  52. package/docs/formats/wwise.md +25 -0
  53. package/docs/roadmap.md +19 -0
  54. package/package.json +2 -2
@@ -2,6 +2,7 @@ import { CjsByteWriter } from '../../../format/CjsByteWriter.js';
2
2
  import { CjsByteReader } from '../../../format/CjsByteReader.js';
3
3
  import { CjsFormatReadError, CjsFormatWriteError } from '../../../format/CjsFormatError.js';
4
4
  import { readInlineString, readTransformSection, writeInlineString, writeTransformSection } from '../../../format/carbonEffect/carbonEffectResourceTransform.js';
5
+ import { readBackendEngineId, CARBON_BACKEND_ENGINE_ID } from '../../../format/carbonEffect/backendEngineId.js';
5
6
  import { DxbcComponentTypeNames } from '../../dxbc/core/signature.js';
6
7
  import { DxbcResourceDimensionNames } from '../../dxbc/core/decoder.js';
7
8
 
@@ -17,15 +18,16 @@ import { DxbcResourceDimensionNames } from '../../dxbc/core/decoder.js';
17
18
  * synthesised data textures and UBOs, the vertex attribute ABI, and the recipe
18
19
  * for running a compute shader as a fragment pass.
19
20
  *
20
- * Both codecs start at their own version 1, and that is safe: which one parses a
21
- * given block is decided by the resource path the file came from, the same way
22
- * the backend itself is chosen. Nothing has to sniff.
21
+ * Which one parses a given block is decided by the resource path the file came
22
+ * from, the same way the backend itself is chosen so nothing has to sniff.
23
+ * The leading engine identifier then confirms that decision rather than
24
+ * replacing it, and disagreement is a hard error.
23
25
  *
24
26
  * ## Why identifiers are on the wire
25
27
  *
26
- * `docs/contracts/constant-buffer-slots.md` establishes that a constant buffer's
27
- * register index is its meaning, and that identifiers are positional. That is
28
- * true of the *contract* but not sufficient to derive a name here: the pixel
28
+ * A constant buffer's register index is its meaning, and identifiers are
29
+ * positional. That is true of the *contract* but not sufficient to derive a
30
+ * name here: the pixel
29
31
  * stage remaps slot 0 to `cb7` (`DxbcGlslEmitter.js`, `pixelConstantBufferRemap`),
30
32
  * so an identifier is a function of register **and stage**, through a profile
31
33
  * table. A reader deriving names would be re-implementing the emitter's naming
@@ -51,8 +53,39 @@ import { DxbcResourceDimensionNames } from '../../dxbc/core/decoder.js';
51
53
  * container the transform is the single source of truth for what merged.
52
54
  */
53
55
 
54
- /** Current block version. Bump when a field is added; readers may skip unknown. */
55
- const GLSL_BACKEND_BLOCK_VERSION = 1;
56
+ /**
57
+ * ## This block identifies itself, and carries no version of its own
58
+ *
59
+ * The first byte is `CARBON_BACKEND_ENGINE_ID.webgl2`. Until it existed, this
60
+ * writer and the WebGPU one both led with a `1` meaning unrelated things, so a
61
+ * block could not say what it was and identification relied on the caller
62
+ * already knowing.
63
+ *
64
+ * **Carbon's container version is the only version.** An independent counter
65
+ * here would be a second versioning axis over the same bytes, and the two would
66
+ * have to be reasoned about together at every change — while describing a block
67
+ * that is only ever written and read by the same build, because every consumer
68
+ * calls `buildEffect` and then `read` on its result in-process.
69
+ *
70
+ * A shape change is therefore not a compatibility event, it is a rebuild. Stale
71
+ * artifacts are deleted and regenerated rather than parsed by an older path, and
72
+ * the trailing-byte check at the end of the read is what catches a mismatch: a
73
+ * record that does not land exactly on its declared size is a hard error, not a
74
+ * degraded read.
75
+ *
76
+ * This replaced a private version byte whose v1 wrote sampler registers only for
77
+ * comparison sampling and recovered `comparison` as "that list is non-empty".
78
+ * Carrying the texture-to-sampler pairing for ordinary textures under that
79
+ * encoding would have marked every one of them a shadow sampler, so the two are
80
+ * now independent fields — as they always were independent facts.
81
+ *
82
+ * Why the pairing is here at all: D3D pairs a texture with a sampler at each
83
+ * sample site, GLSL merges the two into one uniform, and Carbon's reflection
84
+ * relates them nowhere. A consumer without this field can only match `t#`
85
+ * against `s#` by number, which is coincidence: with two pattern samplers
86
+ * declared, `NormalMap` at t3 collides with the clamp sampler at s3 and every
87
+ * hull reads its normal map clamped instead of wrapped.
88
+ */
56
89
 
57
90
  /**
58
91
  * Stage names, as a wire index.
@@ -210,6 +243,12 @@ function writeBindingBody(writer, binding) {
210
243
  const samplers = binding.comparison ? binding.samplerRegisterIndices ?? [] : [];
211
244
  writer.u8(samplers.length);
212
245
  for (const register of samplers) writer.u8(register);
246
+ // v2: comparison is its own fact, not "the list above is non-empty",
247
+ // so the pairing below can be written for ordinary textures too.
248
+ writer.u8(binding.comparison ? 1 : 0);
249
+ const paired = binding.pairedSamplerRegisters ?? [];
250
+ writer.u8(paired.length);
251
+ for (const register of paired) writer.u8(register);
213
252
  break;
214
253
  }
215
254
  case "bufferTexture":
@@ -266,7 +305,15 @@ function readBindingBody(reader, kind) {
266
305
  for (let index = 0; index < samplerCount; index += 1) {
267
306
  samplerRegisterIndices.push(reader.readUint8());
268
307
  }
269
- const comparison = samplerCount > 0;
308
+ // Comparison is its own fact rather than "the register list above is
309
+ // non-empty", which is what frees the pairing below to be written
310
+ // for ordinary textures too.
311
+ const comparison = reader.readUint8() === 1;
312
+ const pairedSamplerRegisters = [];
313
+ const pairedCount = reader.readUint8();
314
+ for (let index = 0; index < pairedCount; index += 1) {
315
+ pairedSamplerRegisters.push(reader.readUint8());
316
+ }
270
317
  const samplerType = comparison ? SHADOW_SAMPLER_TYPE_BY_DIMENSION[dimension] : SAMPLER_TYPE_BY_DIMENSION[dimension];
271
318
  if (!samplerType) {
272
319
  throw new CjsFormatReadError(`Resource dimension ${dimension} has no ${comparison ? "shadow " : ""}sampler type`, {
@@ -277,6 +324,9 @@ function readBindingBody(reader, kind) {
277
324
  return {
278
325
  samplerType,
279
326
  dimensionName: DxbcResourceDimensionNames[dimension] ?? `dimension_${dimension}`,
327
+ ...(pairedSamplerRegisters.length ? {
328
+ pairedSamplerRegisters
329
+ } : {}),
280
330
  ...(comparison ? {
281
331
  comparison: true,
282
332
  samplerRegisterIndices
@@ -415,7 +465,7 @@ function readComputeFragment(reader) {
415
465
  function writeGlslBackendBlock(block) {
416
466
  const stages = block.stages ?? {};
417
467
  const writer = new CjsByteWriter(256);
418
- writer.u8(GLSL_BACKEND_BLOCK_VERSION);
468
+ writer.u8(CARBON_BACKEND_ENGINE_ID.webgl2);
419
469
 
420
470
  // Canonical stage order, not object insertion order: two passes with the
421
471
  // same lowering must produce the same bytes so the arena dedupes them.
@@ -474,18 +524,13 @@ function readGlslBackendBlock(bytes, options = {}) {
474
524
  source: options.source ?? "glsl backend block"
475
525
  });
476
526
  const layoutKey = options.layoutKey ?? null;
477
- const version = reader.readUint8();
478
- if (version > GLSL_BACKEND_BLOCK_VERSION) {
479
- // Forward compatibility: an unknown block version means a newer writer
480
- // added fields. Report the pass as having no backend data rather than
481
- // misparsing it; the enclosing `{size, offset}` pair makes it skippable.
482
- return {
483
- version,
484
- unsupported: true,
485
- stages: {},
486
- transforms: []
487
- };
488
- }
527
+
528
+ // Identity, then straight into the payload: no version byte is read because
529
+ // none is written. Carbon's container version is the only version, and a
530
+ // block whose shape does not match this build fails on the trailing-byte
531
+ // check below - the fix for which is to rebuild the package, never to add a
532
+ // branch.
533
+ readBackendEngineId(reader, CARBON_BACKEND_ENGINE_ID.webgl2, options.source ?? "glsl backend block");
489
534
  const stages = {};
490
535
  const stageCount = reader.readUint8();
491
536
  for (let index = 0; index < stageCount; index += 1) {
@@ -528,19 +573,18 @@ function readGlslBackendBlock(bytes, options = {}) {
528
573
  }
529
574
  const transforms = readTransformSection(reader, layoutKey);
530
575
 
531
- // A sized record parsed at a known version must land exactly on its declared
532
- // end. Trailing bytes mean the writer knew fields this reader does not - the
533
- // same skew an unknown version reports, arriving without a version bump.
576
+ // A sized record must land exactly on its declared end. Trailing bytes mean
577
+ // the writer knew fields this reader does not, which without a version byte
578
+ // is the ONLY signal that a block came from a different build - so this is
579
+ // load-bearing rather than defensive, and it is why removing the version is
580
+ // safe. The fix is always to rebuild the package.
534
581
  if (reader.remaining !== 0) {
535
- throw new CjsFormatReadError(`GLSL backend block has ${reader.remaining} unparsed trailing byte(s) at version ${version}`, {
582
+ throw new CjsFormatReadError(`GLSL backend block has ${reader.remaining} unparsed trailing byte(s); rebuild the effect package`, {
536
583
  source: options.source ?? "glsl backend block",
537
- version,
538
584
  trailingBytes: reader.remaining
539
585
  });
540
586
  }
541
587
  return {
542
- version,
543
- unsupported: false,
544
588
  layoutKey,
545
589
  stages,
546
590
  transforms,
@@ -548,5 +592,5 @@ function readGlslBackendBlock(bytes, options = {}) {
548
592
  };
549
593
  }
550
594
 
551
- export { GLSL_BACKEND_BINDING_KIND, GLSL_BACKEND_BLOCK_VERSION, GLSL_BACKEND_CONSTANT_BUFFER_STYLE, GLSL_BACKEND_STAGE, GLSL_LOCAL_LIGHT_ROLE, readGlslBackendBlock, writeGlslBackendBlock };
595
+ export { GLSL_BACKEND_BINDING_KIND, GLSL_BACKEND_CONSTANT_BUFFER_STYLE, GLSL_BACKEND_STAGE, GLSL_LOCAL_LIGHT_ROLE, readGlslBackendBlock, writeGlslBackendBlock };
552
596
  //# sourceMappingURL=glslBackendBlock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"glslBackendBlock.js","sources":["../../../../../src/formats/webgl/core/glslBackendBlock.js"],"sourcesContent":["import { CjsByteWriter } from \"../../../format/CjsByteWriter.js\";\nimport { CjsByteReader } from \"../../../format/CjsByteReader.js\";\nimport { CjsFormatReadError, CjsFormatWriteError } from \"../../../format/CjsFormatError.js\";\nimport {\n readInlineString,\n readTransformSection,\n writeInlineString,\n writeTransformSection\n} from \"../../../format/carbonEffect/carbonEffectResourceTransform.js\";\nimport { DxbcComponentTypeNames } from \"../../dxbc/core/signature.js\";\nimport { DxbcResourceDimensionNames } from \"../../dxbc/core/decoder.js\";\n\n/**\n * The WebGL 2 pass block: what the GLSL text declares but cannot say how to\n * build or bind.\n *\n * This is the GLSL counterpart of `carbonEffectBackendBlock.js`, occupying the\n * same one optional trailing block per pass, and it shares that file's\n * resource-transform section verbatim. Everything else differs, because the two\n * backends' lowering decisions are genuinely different documents: WebGPU records\n * bind-group topology, while WebGL 2 records sampler and uniform declarations,\n * synthesised data textures and UBOs, the vertex attribute ABI, and the recipe\n * for running a compute shader as a fragment pass.\n *\n * Both codecs start at their own version 1, and that is safe: which one parses a\n * given block is decided by the resource path the file came from, the same way\n * the backend itself is chosen. Nothing has to sniff.\n *\n * ## Why identifiers are on the wire\n *\n * `docs/contracts/constant-buffer-slots.md` establishes that a constant buffer's\n * register index is its meaning, and that identifiers are positional. That is\n * true of the *contract* but not sufficient to derive a name here: the pixel\n * stage remaps slot 0 to `cb7` (`DxbcGlslEmitter.js`, `pixelConstantBufferRemap`),\n * so an identifier is a function of register **and stage**, through a profile\n * table. A reader deriving names would be re-implementing the emitter's naming\n * policy, and a divergence would surface as a uniform that silently never binds\n * rather than as an error. The name is the actual link between this block and\n * the GLSL text, so it is stored and the text stays checkable against it.\n *\n * What is genuinely derived: the sampler type (a total function of the DXBC\n * resource dimension and whether comparison sampling is used) and the data\n * texture formats (constant per binding kind).\n *\n * ## What this block deliberately does not carry\n *\n * **Resource names.** The enclosing Carbon description already lists every\n * texture with its name and register, interned in the string table exactly as a\n * shipped Carbon file does. That is the name authority, and duplicating it here\n * would create two places to disagree.\n *\n * **Merge layer counts.** A merged detail-map array's layer count is the number\n * of inputs on its transform in the section below. The emitter also reports\n * `arrayLayerCount` and `mergedFrom` on the binding for standalone callers with\n * no container around them, and those are intentionally not stored: inside a\n * container the transform is the single source of truth for what merged.\n */\n\n/** Current block version. Bump when a field is added; readers may skip unknown. */\nexport const GLSL_BACKEND_BLOCK_VERSION = 1;\n\n/**\n * Stage names, as a wire index.\n *\n * These are the emitter's own names, which are Carbon's and D3D's: the pixel\n * stage is `pixel`, not `fragment`. The WebGPU block's visibility enum says\n * `fragment` because that is WGSL's word. Neither is translated into the other -\n * each block speaks its own backend's vocabulary, and the stage a record belongs\n * to is never inferred across the two.\n */\nexport const GLSL_BACKEND_STAGE = Object.freeze([ \"vertex\", \"pixel\", \"compute\" ]);\n\n/**\n * Binding kinds, ordered so the wire value is stable. These are the emitter's\n * own `binding.kind` values (`DxbcGlslEmitter.js`).\n */\nexport const GLSL_BACKEND_BINDING_KIND = Object.freeze([\n \"constantBuffer\",\n \"resource\",\n \"bufferTexture\",\n \"structuredTexture\",\n \"structuredUbo\",\n \"uavTexture\",\n \"dispatchUniform\"\n]);\n\n/** Constant-buffer declaration styles. */\nexport const GLSL_BACKEND_CONSTANT_BUFFER_STYLE = Object.freeze([ \"array\", \"std140\" ]);\n\n/** Sampler type per WebGL2-supported DXBC resource dimension. */\nconst SAMPLER_TYPE_BY_DIMENSION = Object.freeze({\n 2: \"sampler2D\",\n 3: \"sampler2D\",\n 5: \"sampler3D\",\n 6: \"samplerCube\",\n 8: \"sampler2DArray\"\n});\n\n/** Shadow-sampler type per WebGL2-supported DXBC resource dimension. */\nconst SHADOW_SAMPLER_TYPE_BY_DIMENSION = Object.freeze({\n 3: \"sampler2DShadow\",\n 6: \"samplerCubeShadow\",\n 8: \"sampler2DArrayShadow\"\n});\n\n/** Texel formats a synthesised data texture always uses, by binding kind. */\nconst DATA_TEXTURE_FORMAT = Object.freeze({\n bufferTexture: \"RGBA32F\",\n structuredTexture: \"RGBA32UI\"\n});\n\n/** Marks an absent optional `u8`. */\nconst ABSENT_U8 = 0xff;\n\n/**\n * Local-light lowering roles, as a wire index.\n *\n * Carbon puts local lights in two structured buffers plus a profile texture.\n * WebGL 2 has no structured buffers at all, so they have to be re-expressed —\n * this is a *storage* change, not a shading one, and without it the affected\n * shaders cannot bind their lights.\n *\n * The emitter still spells the role `cjsSemantic` on its binding records. That\n * name is not carried onto the wire: it names a defunct package format rather\n * than the thing it describes. Renaming it at the emitter is a separate change.\n */\nexport const GLSL_LOCAL_LIGHT_ROLE = Object.freeze([ \"packed-texture\", \"constant-buffer\" ]);\n\n/** Emitter `cjsSemantic` values, in the same order as the roles above. */\nconst EMITTER_LIGHT_SEMANTIC = Object.freeze([ \"packedLocalLights\", \"localLights\" ]);\n\n/**\n * Writes the optional local-light lowering record.\n *\n * Carries the source registers so a consumer can tie the synthesised resource\n * back to the Carbon resources it replaced, which is otherwise unrecoverable:\n * the shader no longer declares them.\n *\n * @param {CjsByteWriter} writer Target writer.\n * @param {object} binding Emitter binding record.\n */\nfunction writeLocalLightRecord(writer, binding)\n{\n const role = EMITTER_LIGHT_SEMANTIC.indexOf(binding.cjsSemantic);\n\n if (!binding.cjsSemantic)\n {\n writer.u8(0);\n return;\n }\n\n if (role < 0)\n {\n throw new CjsFormatWriteError(\n `Binding \"${binding.name}\" carries unknown local-light role \"${binding.cjsSemantic}\"`,\n { name: binding.name, semantic: binding.cjsSemantic }\n );\n }\n\n writer.u8(1);\n writer.u8(role);\n writer.u8(binding.lightIndexRegister);\n writer.u8(binding.lightDataRegister);\n // The profile array is optional: some permutations never sample it, and the\n // lowering replaces it with neutral attenuation when it is absent.\n writer.u8(binding.lightProfileRegister ?? ABSENT_U8);\n writer.u32(binding.dataTexelBase ?? 0);\n writer.u16(binding.capacityLights ?? 0);\n}\n\n/**\n * Reads the optional local-light lowering record.\n *\n * @param {CjsByteReader} reader Source reader.\n * @returns {object|null} Local-light fields, or null when the binding is ordinary.\n */\nfunction readLocalLightRecord(reader)\n{\n if (!reader.readUint8()) return null;\n\n const role = GLSL_LOCAL_LIGHT_ROLE[reader.readUint8()];\n const lightIndexRegister = reader.readUint8();\n const lightDataRegister = reader.readUint8();\n const profile = reader.readUint8();\n const dataTexelBase = reader.readUint32();\n const capacityLights = reader.readUint16();\n\n return {\n localLightRole: role,\n lightIndexRegister,\n lightDataRegister,\n lightProfileRegister: profile === ABSENT_U8 ? null : profile,\n ...(role === \"packed-texture\" ? { dataTexelBase } : {}),\n ...(role === \"constant-buffer\" ? { capacityLights } : {})\n };\n}\n\n/**\n * Writes one binding's kind-specific payload.\n *\n * @param {CjsByteWriter} writer Target writer.\n * @param {object} binding Emitter binding record.\n */\nfunction writeBindingBody(writer, binding)\n{\n switch (binding.kind)\n {\n case \"constantBuffer\": {\n const style = GLSL_BACKEND_CONSTANT_BUFFER_STYLE.indexOf(binding.style ?? \"array\");\n if (style < 0)\n {\n throw new CjsFormatWriteError(\n `Unknown constant-buffer style \"${binding.style}\"`, { style: binding.style }\n );\n }\n writer.u16(binding.sizeInVec4);\n writer.u8(style);\n writeLocalLightRecord(writer, binding);\n break;\n }\n case \"resource\": {\n const dimension = DxbcResourceDimensionNames.indexOf(binding.dimensionName);\n if (dimension < 0)\n {\n throw new CjsFormatWriteError(\n `Unknown resource dimension \"${binding.dimensionName}\"`,\n { dimensionName: binding.dimensionName }\n );\n }\n writer.u8(dimension);\n const samplers = binding.comparison ? binding.samplerRegisterIndices ?? [] : [];\n writer.u8(samplers.length);\n for (const register of samplers) writer.u8(register);\n break;\n }\n case \"bufferTexture\":\n writer.u16(binding.width);\n writeStringList(writer, binding.returnTypes);\n break;\n case \"structuredTexture\":\n writer.u32(binding.strideBytes ?? 0);\n writer.u16(binding.width);\n writeLocalLightRecord(writer, binding);\n break;\n case \"structuredUbo\":\n writer.u32(binding.strideBytes ?? 0);\n writer.u16(binding.capacityElements);\n break;\n case \"uavTexture\":\n writer.u8(binding.slice ?? ABSENT_U8);\n writer.u8(binding.location);\n writeStringList(writer, binding.returnTypes);\n break;\n case \"dispatchUniform\":\n break;\n default:\n throw new CjsFormatWriteError(`Unknown binding kind \"${binding.kind}\"`, {\n kind: binding.kind\n });\n }\n}\n\n/**\n * Reads one binding's kind-specific payload, restoring derived fields.\n *\n * @param {CjsByteReader} reader Source reader.\n * @param {string} kind Binding kind.\n * @returns {object} Kind-specific fields.\n */\nfunction readBindingBody(reader, kind)\n{\n switch (kind)\n {\n case \"constantBuffer\": {\n const sizeInVec4 = reader.readUint16();\n const style = GLSL_BACKEND_CONSTANT_BUFFER_STYLE[reader.readUint8()];\n return { sizeInVec4, style, ...(readLocalLightRecord(reader) ?? {}) };\n }\n case \"resource\": {\n const dimension = reader.readUint8();\n const samplerCount = reader.readUint8();\n const samplerRegisterIndices = [];\n for (let index = 0; index < samplerCount; index += 1)\n {\n samplerRegisterIndices.push(reader.readUint8());\n }\n const comparison = samplerCount > 0;\n const samplerType = comparison\n ? SHADOW_SAMPLER_TYPE_BY_DIMENSION[dimension]\n : SAMPLER_TYPE_BY_DIMENSION[dimension];\n\n if (!samplerType)\n {\n throw new CjsFormatReadError(\n `Resource dimension ${dimension} has no ${comparison ? \"shadow \" : \"\"}sampler type`,\n { dimension, comparison }\n );\n }\n\n return {\n samplerType,\n dimensionName: DxbcResourceDimensionNames[dimension] ?? `dimension_${dimension}`,\n ...(comparison ? { comparison: true, samplerRegisterIndices } : {})\n };\n }\n case \"bufferTexture\":\n return {\n format: DATA_TEXTURE_FORMAT.bufferTexture,\n width: reader.readUint16(),\n returnTypes: readStringList(reader)\n };\n case \"structuredTexture\": {\n const strideBytes = reader.readUint32();\n const width = reader.readUint16();\n return {\n strideBytes,\n format: DATA_TEXTURE_FORMAT.structuredTexture,\n width,\n ...(readLocalLightRecord(reader) ?? {})\n };\n }\n case \"structuredUbo\":\n return {\n strideBytes: reader.readUint32(),\n capacityElements: reader.readUint16()\n };\n case \"uavTexture\": {\n const slice = reader.readUint8();\n return {\n slice: slice === ABSENT_U8 ? null : slice,\n location: reader.readUint8(),\n returnTypes: readStringList(reader)\n };\n }\n case \"dispatchUniform\":\n return {};\n default:\n throw new CjsFormatReadError(`Unknown binding kind \"${kind}\"`, { kind });\n }\n}\n\n/**\n * Writes an optional count-prefixed string list.\n *\n * @param {CjsByteWriter} writer Target writer.\n * @param {string[]|null} values String list, or null.\n */\nfunction writeStringList(writer, values)\n{\n const list = Array.isArray(values) ? values : [];\n writer.u8(list.length);\n for (const value of list) writeInlineString(writer, value);\n}\n\n/**\n * Reads an optional count-prefixed string list.\n *\n * @param {CjsByteReader} reader Source reader.\n * @returns {string[]|null} String list, or null when empty.\n */\nfunction readStringList(reader)\n{\n const count = reader.readUint8();\n if (!count) return null;\n\n const values = [];\n for (let index = 0; index < count; index += 1) values.push(readInlineString(reader));\n return values;\n}\n\n/**\n * Writes the compute-as-fragment section.\n *\n * @param {CjsByteWriter} writer Target writer.\n * @param {object|null} computeFragment Compute-fragment contract, or null.\n */\nfunction writeComputeFragment(writer, computeFragment)\n{\n if (!computeFragment)\n {\n writer.u8(0);\n return;\n }\n\n writer.u8(1);\n const threadGroup = computeFragment.threadGroup;\n writer.u8(threadGroup ? 1 : 0);\n if (threadGroup) for (const extent of threadGroup) writer.u16(extent);\n writeInlineString(writer, computeFragment.dispatchOriginUniform ?? \"\");\n\n const outputs = computeFragment.uavOutputs ?? [];\n writer.u8(outputs.length);\n for (const output of outputs)\n {\n writer.u8(output.register);\n writer.u8(output.slice ?? ABSENT_U8);\n writer.u8(output.location);\n writeInlineString(writer, output.glslName);\n }\n}\n\n/**\n * Reads the compute-as-fragment section.\n *\n * @param {CjsByteReader} reader Source reader.\n * @returns {object|null} Compute-fragment contract, or null.\n */\nfunction readComputeFragment(reader)\n{\n if (!reader.readUint8()) return null;\n\n const threadGroup = reader.readUint8()\n ? [ reader.readUint16(), reader.readUint16(), reader.readUint16() ]\n : null;\n const dispatchOriginUniform = readInlineString(reader);\n\n const uavOutputs = [];\n const outputCount = reader.readUint8();\n for (let index = 0; index < outputCount; index += 1)\n {\n const register = reader.readUint8();\n const slice = reader.readUint8();\n uavOutputs.push({\n register,\n slice: slice === ABSENT_U8 ? null : slice,\n location: reader.readUint8(),\n glslName: readInlineString(reader)\n });\n }\n\n return {\n threadGroup,\n dispatchOriginUniform: dispatchOriginUniform === \"\" ? null : dispatchOriginUniform,\n uavOutputs\n };\n}\n\n/**\n * Serialises one pass's GLSL backend block.\n *\n * @param {object} block Block contents.\n * @param {object} [block.stages] Per-stage lowering data, keyed by stage name.\n * @param {object[]} [block.transforms] Resource transforms.\n * @returns {Uint8Array} Self-contained block bytes.\n */\nexport function writeGlslBackendBlock(block)\n{\n const stages = block.stages ?? {};\n const writer = new CjsByteWriter(256);\n\n writer.u8(GLSL_BACKEND_BLOCK_VERSION);\n\n // Canonical stage order, not object insertion order: two passes with the\n // same lowering must produce the same bytes so the arena dedupes them.\n const present = GLSL_BACKEND_STAGE.filter((name) => stages[name]);\n writer.u8(present.length);\n\n for (const stageName of present)\n {\n const stage = stages[stageName];\n writer.u8(GLSL_BACKEND_STAGE.indexOf(stageName));\n\n const bindings = stage.bindings ?? [];\n writer.u8(bindings.length);\n for (const binding of bindings)\n {\n const kind = GLSL_BACKEND_BINDING_KIND.indexOf(binding.kind);\n if (kind < 0)\n {\n throw new CjsFormatWriteError(`Unknown binding kind \"${binding.kind}\"`, {\n kind: binding.kind\n });\n }\n writer.u8(kind);\n writer.u8(binding.registerIndex ?? ABSENT_U8);\n writeInlineString(writer, binding.name);\n writeBindingBody(writer, binding);\n }\n\n const stageInputs = stage.stageInputs ?? [];\n writer.u8(stageInputs.length);\n for (const input of stageInputs)\n {\n const componentType = DxbcComponentTypeNames.indexOf(input.componentTypeName);\n if (componentType < 0)\n {\n throw new CjsFormatWriteError(\n `Unknown component type \"${input.componentTypeName}\"`,\n { componentTypeName: input.componentTypeName }\n );\n }\n writer.u8(input.register);\n writeInlineString(writer, input.name);\n writeInlineString(writer, input.semanticName);\n writer.u8(input.semanticIndex);\n writer.u8(componentType);\n writer.u8(input.mask);\n }\n\n writeComputeFragment(writer, stage.computeFragment ?? null);\n }\n\n writeTransformSection(writer, block.transforms ?? []);\n\n return writer.toBytes();\n}\n\n/**\n * Parses one pass's GLSL 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 readGlslBackendBlock(bytes, options = {})\n{\n const reader = new CjsByteReader(bytes, { source: options.source ?? \"glsl backend block\" });\n const layoutKey = options.layoutKey ?? null;\n\n const version = reader.readUint8();\n if (version > GLSL_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, stages: {}, transforms: [] };\n }\n\n const stages = {};\n const stageCount = reader.readUint8();\n\n for (let index = 0; index < stageCount; index += 1)\n {\n const stageName = GLSL_BACKEND_STAGE[reader.readUint8()];\n\n const bindings = [];\n const bindingCount = reader.readUint8();\n for (let bindingIndex = 0; bindingIndex < bindingCount; bindingIndex += 1)\n {\n const kind = GLSL_BACKEND_BINDING_KIND[reader.readUint8()];\n const registerIndex = reader.readUint8();\n const name = readInlineString(reader);\n bindings.push({\n kind,\n ...(registerIndex === ABSENT_U8 ? {} : { registerIndex }),\n name,\n ...readBindingBody(reader, kind)\n });\n }\n\n const stageInputs = [];\n const stageInputCount = reader.readUint8();\n for (let inputIndex = 0; inputIndex < stageInputCount; inputIndex += 1)\n {\n stageInputs.push({\n register: reader.readUint8(),\n name: readInlineString(reader),\n semanticName: readInlineString(reader),\n semanticIndex: reader.readUint8(),\n componentTypeName: DxbcComponentTypeNames[reader.readUint8()],\n mask: reader.readUint8()\n });\n }\n\n const computeFragment = readComputeFragment(reader);\n\n stages[stageName] = {\n bindings,\n stageInputs,\n ...(computeFragment ? { computeFragment } : {})\n };\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 version reports, arriving without a version bump.\n if (reader.remaining !== 0)\n {\n throw new CjsFormatReadError(\n `GLSL backend block has ${reader.remaining} unparsed trailing byte(s) at version ${version}`,\n {\n source: options.source ?? \"glsl backend block\",\n version,\n trailingBytes: reader.remaining\n }\n );\n }\n\n return { version, unsupported: false, layoutKey, stages, transforms, trailingBytes: 0 };\n}\n"],"names":["GLSL_BACKEND_BLOCK_VERSION","GLSL_BACKEND_STAGE","Object","freeze","GLSL_BACKEND_BINDING_KIND","GLSL_BACKEND_CONSTANT_BUFFER_STYLE","SAMPLER_TYPE_BY_DIMENSION","SHADOW_SAMPLER_TYPE_BY_DIMENSION","DATA_TEXTURE_FORMAT","bufferTexture","structuredTexture","ABSENT_U8","GLSL_LOCAL_LIGHT_ROLE","EMITTER_LIGHT_SEMANTIC","writeLocalLightRecord","writer","binding","role","indexOf","cjsSemantic","u8","CjsFormatWriteError","name","semantic","lightIndexRegister","lightDataRegister","lightProfileRegister","u32","dataTexelBase","u16","capacityLights","readLocalLightRecord","reader","readUint8","profile","readUint32","readUint16","localLightRole","writeBindingBody","kind","style","sizeInVec4","dimension","DxbcResourceDimensionNames","dimensionName","samplers","comparison","samplerRegisterIndices","length","register","width","writeStringList","returnTypes","strideBytes","capacityElements","slice","location","readBindingBody","samplerCount","index","push","samplerType","CjsFormatReadError","format","readStringList","values","list","Array","isArray","value","writeInlineString","count","readInlineString","writeComputeFragment","computeFragment","threadGroup","extent","dispatchOriginUniform","outputs","uavOutputs","output","glslName","readComputeFragment","outputCount","writeGlslBackendBlock","block","stages","CjsByteWriter","present","filter","stageName","stage","bindings","registerIndex","stageInputs","input","componentType","DxbcComponentTypeNames","componentTypeName","semanticName","semanticIndex","mask","writeTransformSection","transforms","toBytes","readGlslBackendBlock","bytes","options","CjsByteReader","source","layoutKey","version","unsupported","stageCount","bindingCount","bindingIndex","stageInputCount","inputIndex","readTransformSection","remaining","trailingBytes"],"mappings":"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"}
1
+ {"version":3,"file":"glslBackendBlock.js","sources":["../../../../../src/formats/webgl/core/glslBackendBlock.js"],"sourcesContent":["import { CjsByteWriter } from \"../../../format/CjsByteWriter.js\";\nimport { CjsByteReader } from \"../../../format/CjsByteReader.js\";\nimport { CjsFormatReadError, CjsFormatWriteError } from \"../../../format/CjsFormatError.js\";\nimport {\n readInlineString,\n readTransformSection,\n writeInlineString,\n writeTransformSection\n} from \"../../../format/carbonEffect/carbonEffectResourceTransform.js\";\nimport {\n CARBON_BACKEND_ENGINE_ID,\n readBackendEngineId\n} from \"../../../format/carbonEffect/backendEngineId.js\";\nimport { DxbcComponentTypeNames } from \"../../dxbc/core/signature.js\";\nimport { DxbcResourceDimensionNames } from \"../../dxbc/core/decoder.js\";\n\n/**\n * The WebGL 2 pass block: what the GLSL text declares but cannot say how to\n * build or bind.\n *\n * This is the GLSL counterpart of `carbonEffectBackendBlock.js`, occupying the\n * same one optional trailing block per pass, and it shares that file's\n * resource-transform section verbatim. Everything else differs, because the two\n * backends' lowering decisions are genuinely different documents: WebGPU records\n * bind-group topology, while WebGL 2 records sampler and uniform declarations,\n * synthesised data textures and UBOs, the vertex attribute ABI, and the recipe\n * for running a compute shader as a fragment pass.\n *\n * Which one parses a given block is decided by the resource path the file came\n * from, the same way the backend itself is chosen — so nothing has to sniff.\n * The leading engine identifier then confirms that decision rather than\n * replacing it, and disagreement is a hard error.\n *\n * ## Why identifiers are on the wire\n *\n * A constant buffer's register index is its meaning, and identifiers are\n * positional. That is true of the *contract* but not sufficient to derive a\n * name here: the pixel\n * stage remaps slot 0 to `cb7` (`DxbcGlslEmitter.js`, `pixelConstantBufferRemap`),\n * so an identifier is a function of register **and stage**, through a profile\n * table. A reader deriving names would be re-implementing the emitter's naming\n * policy, and a divergence would surface as a uniform that silently never binds\n * rather than as an error. The name is the actual link between this block and\n * the GLSL text, so it is stored and the text stays checkable against it.\n *\n * What is genuinely derived: the sampler type (a total function of the DXBC\n * resource dimension and whether comparison sampling is used) and the data\n * texture formats (constant per binding kind).\n *\n * ## What this block deliberately does not carry\n *\n * **Resource names.** The enclosing Carbon description already lists every\n * texture with its name and register, interned in the string table exactly as a\n * shipped Carbon file does. That is the name authority, and duplicating it here\n * would create two places to disagree.\n *\n * **Merge layer counts.** A merged detail-map array's layer count is the number\n * of inputs on its transform in the section below. The emitter also reports\n * `arrayLayerCount` and `mergedFrom` on the binding for standalone callers with\n * no container around them, and those are intentionally not stored: inside a\n * container the transform is the single source of truth for what merged.\n */\n\n/**\n * ## This block identifies itself, and carries no version of its own\n *\n * The first byte is `CARBON_BACKEND_ENGINE_ID.webgl2`. Until it existed, this\n * writer and the WebGPU one both led with a `1` meaning unrelated things, so a\n * block could not say what it was and identification relied on the caller\n * already knowing.\n *\n * **Carbon's container version is the only version.** An independent counter\n * here would be a second versioning axis over the same bytes, and the two would\n * have to be reasoned about together at every change — while describing a block\n * that is only ever written and read by the same build, because every consumer\n * calls `buildEffect` and then `read` on its result in-process.\n *\n * A shape change is therefore not a compatibility event, it is a rebuild. Stale\n * artifacts are deleted and regenerated rather than parsed by an older path, and\n * the trailing-byte check at the end of the read is what catches a mismatch: a\n * record that does not land exactly on its declared size is a hard error, not a\n * degraded read.\n *\n * This replaced a private version byte whose v1 wrote sampler registers only for\n * comparison sampling and recovered `comparison` as \"that list is non-empty\".\n * Carrying the texture-to-sampler pairing for ordinary textures under that\n * encoding would have marked every one of them a shadow sampler, so the two are\n * now independent fields — as they always were independent facts.\n *\n * Why the pairing is here at all: D3D pairs a texture with a sampler at each\n * sample site, GLSL merges the two into one uniform, and Carbon's reflection\n * relates them nowhere. A consumer without this field can only match `t#`\n * against `s#` by number, which is coincidence: with two pattern samplers\n * declared, `NormalMap` at t3 collides with the clamp sampler at s3 and every\n * hull reads its normal map clamped instead of wrapped.\n */\n\n/**\n * Stage names, as a wire index.\n *\n * These are the emitter's own names, which are Carbon's and D3D's: the pixel\n * stage is `pixel`, not `fragment`. The WebGPU block's visibility enum says\n * `fragment` because that is WGSL's word. Neither is translated into the other -\n * each block speaks its own backend's vocabulary, and the stage a record belongs\n * to is never inferred across the two.\n */\nexport const GLSL_BACKEND_STAGE = Object.freeze([ \"vertex\", \"pixel\", \"compute\" ]);\n\n/**\n * Binding kinds, ordered so the wire value is stable. These are the emitter's\n * own `binding.kind` values (`DxbcGlslEmitter.js`).\n */\nexport const GLSL_BACKEND_BINDING_KIND = Object.freeze([\n \"constantBuffer\",\n \"resource\",\n \"bufferTexture\",\n \"structuredTexture\",\n \"structuredUbo\",\n \"uavTexture\",\n \"dispatchUniform\"\n]);\n\n/** Constant-buffer declaration styles. */\nexport const GLSL_BACKEND_CONSTANT_BUFFER_STYLE = Object.freeze([ \"array\", \"std140\" ]);\n\n/** Sampler type per WebGL2-supported DXBC resource dimension. */\nconst SAMPLER_TYPE_BY_DIMENSION = Object.freeze({\n 2: \"sampler2D\",\n 3: \"sampler2D\",\n 5: \"sampler3D\",\n 6: \"samplerCube\",\n 8: \"sampler2DArray\"\n});\n\n/** Shadow-sampler type per WebGL2-supported DXBC resource dimension. */\nconst SHADOW_SAMPLER_TYPE_BY_DIMENSION = Object.freeze({\n 3: \"sampler2DShadow\",\n 6: \"samplerCubeShadow\",\n 8: \"sampler2DArrayShadow\"\n});\n\n/** Texel formats a synthesised data texture always uses, by binding kind. */\nconst DATA_TEXTURE_FORMAT = Object.freeze({\n bufferTexture: \"RGBA32F\",\n structuredTexture: \"RGBA32UI\"\n});\n\n/** Marks an absent optional `u8`. */\nconst ABSENT_U8 = 0xff;\n\n/**\n * Local-light lowering roles, as a wire index.\n *\n * Carbon puts local lights in two structured buffers plus a profile texture.\n * WebGL 2 has no structured buffers at all, so they have to be re-expressed —\n * this is a *storage* change, not a shading one, and without it the affected\n * shaders cannot bind their lights.\n *\n * The emitter still spells the role `cjsSemantic` on its binding records. That\n * name is not carried onto the wire: it names a defunct package format rather\n * than the thing it describes. Renaming it at the emitter is a separate change.\n */\nexport const GLSL_LOCAL_LIGHT_ROLE = Object.freeze([ \"packed-texture\", \"constant-buffer\" ]);\n\n/** Emitter `cjsSemantic` values, in the same order as the roles above. */\nconst EMITTER_LIGHT_SEMANTIC = Object.freeze([ \"packedLocalLights\", \"localLights\" ]);\n\n/**\n * Writes the optional local-light lowering record.\n *\n * Carries the source registers so a consumer can tie the synthesised resource\n * back to the Carbon resources it replaced, which is otherwise unrecoverable:\n * the shader no longer declares them.\n *\n * @param {CjsByteWriter} writer Target writer.\n * @param {object} binding Emitter binding record.\n */\nfunction writeLocalLightRecord(writer, binding)\n{\n const role = EMITTER_LIGHT_SEMANTIC.indexOf(binding.cjsSemantic);\n\n if (!binding.cjsSemantic)\n {\n writer.u8(0);\n return;\n }\n\n if (role < 0)\n {\n throw new CjsFormatWriteError(\n `Binding \"${binding.name}\" carries unknown local-light role \"${binding.cjsSemantic}\"`,\n { name: binding.name, semantic: binding.cjsSemantic }\n );\n }\n\n writer.u8(1);\n writer.u8(role);\n writer.u8(binding.lightIndexRegister);\n writer.u8(binding.lightDataRegister);\n // The profile array is optional: some permutations never sample it, and the\n // lowering replaces it with neutral attenuation when it is absent.\n writer.u8(binding.lightProfileRegister ?? ABSENT_U8);\n writer.u32(binding.dataTexelBase ?? 0);\n writer.u16(binding.capacityLights ?? 0);\n}\n\n/**\n * Reads the optional local-light lowering record.\n *\n * @param {CjsByteReader} reader Source reader.\n * @returns {object|null} Local-light fields, or null when the binding is ordinary.\n */\nfunction readLocalLightRecord(reader)\n{\n if (!reader.readUint8()) return null;\n\n const role = GLSL_LOCAL_LIGHT_ROLE[reader.readUint8()];\n const lightIndexRegister = reader.readUint8();\n const lightDataRegister = reader.readUint8();\n const profile = reader.readUint8();\n const dataTexelBase = reader.readUint32();\n const capacityLights = reader.readUint16();\n\n return {\n localLightRole: role,\n lightIndexRegister,\n lightDataRegister,\n lightProfileRegister: profile === ABSENT_U8 ? null : profile,\n ...(role === \"packed-texture\" ? { dataTexelBase } : {}),\n ...(role === \"constant-buffer\" ? { capacityLights } : {})\n };\n}\n\n/**\n * Writes one binding's kind-specific payload.\n *\n * @param {CjsByteWriter} writer Target writer.\n * @param {object} binding Emitter binding record.\n */\nfunction writeBindingBody(writer, binding)\n{\n switch (binding.kind)\n {\n case \"constantBuffer\": {\n const style = GLSL_BACKEND_CONSTANT_BUFFER_STYLE.indexOf(binding.style ?? \"array\");\n if (style < 0)\n {\n throw new CjsFormatWriteError(\n `Unknown constant-buffer style \"${binding.style}\"`, { style: binding.style }\n );\n }\n writer.u16(binding.sizeInVec4);\n writer.u8(style);\n writeLocalLightRecord(writer, binding);\n break;\n }\n case \"resource\": {\n const dimension = DxbcResourceDimensionNames.indexOf(binding.dimensionName);\n if (dimension < 0)\n {\n throw new CjsFormatWriteError(\n `Unknown resource dimension \"${binding.dimensionName}\"`,\n { dimensionName: binding.dimensionName }\n );\n }\n writer.u8(dimension);\n const samplers = binding.comparison ? binding.samplerRegisterIndices ?? [] : [];\n writer.u8(samplers.length);\n for (const register of samplers) writer.u8(register);\n // v2: comparison is its own fact, not \"the list above is non-empty\",\n // so the pairing below can be written for ordinary textures too.\n writer.u8(binding.comparison ? 1 : 0);\n const paired = binding.pairedSamplerRegisters ?? [];\n writer.u8(paired.length);\n for (const register of paired) writer.u8(register);\n break;\n }\n case \"bufferTexture\":\n writer.u16(binding.width);\n writeStringList(writer, binding.returnTypes);\n break;\n case \"structuredTexture\":\n writer.u32(binding.strideBytes ?? 0);\n writer.u16(binding.width);\n writeLocalLightRecord(writer, binding);\n break;\n case \"structuredUbo\":\n writer.u32(binding.strideBytes ?? 0);\n writer.u16(binding.capacityElements);\n break;\n case \"uavTexture\":\n writer.u8(binding.slice ?? ABSENT_U8);\n writer.u8(binding.location);\n writeStringList(writer, binding.returnTypes);\n break;\n case \"dispatchUniform\":\n break;\n default:\n throw new CjsFormatWriteError(`Unknown binding kind \"${binding.kind}\"`, {\n kind: binding.kind\n });\n }\n}\n\n/**\n * Reads one binding's kind-specific payload, restoring derived fields.\n *\n * @param {CjsByteReader} reader Source reader.\n * @param {string} kind Binding kind.\n * @returns {object} Kind-specific fields.\n */\nfunction readBindingBody(reader, kind)\n{\n switch (kind)\n {\n case \"constantBuffer\": {\n const sizeInVec4 = reader.readUint16();\n const style = GLSL_BACKEND_CONSTANT_BUFFER_STYLE[reader.readUint8()];\n return { sizeInVec4, style, ...(readLocalLightRecord(reader) ?? {}) };\n }\n case \"resource\": {\n const dimension = reader.readUint8();\n const samplerCount = reader.readUint8();\n const samplerRegisterIndices = [];\n for (let index = 0; index < samplerCount; index += 1)\n {\n samplerRegisterIndices.push(reader.readUint8());\n }\n // Comparison is its own fact rather than \"the register list above is\n // non-empty\", which is what frees the pairing below to be written\n // for ordinary textures too.\n const comparison = reader.readUint8() === 1;\n const pairedSamplerRegisters = [];\n const pairedCount = reader.readUint8();\n for (let index = 0; index < pairedCount; index += 1)\n {\n pairedSamplerRegisters.push(reader.readUint8());\n }\n const samplerType = comparison\n ? SHADOW_SAMPLER_TYPE_BY_DIMENSION[dimension]\n : SAMPLER_TYPE_BY_DIMENSION[dimension];\n\n if (!samplerType)\n {\n throw new CjsFormatReadError(\n `Resource dimension ${dimension} has no ${comparison ? \"shadow \" : \"\"}sampler type`,\n { dimension, comparison }\n );\n }\n\n return {\n samplerType,\n dimensionName: DxbcResourceDimensionNames[dimension] ?? `dimension_${dimension}`,\n ...(pairedSamplerRegisters.length ? { pairedSamplerRegisters } : {}),\n ...(comparison ? { comparison: true, samplerRegisterIndices } : {})\n };\n }\n case \"bufferTexture\":\n return {\n format: DATA_TEXTURE_FORMAT.bufferTexture,\n width: reader.readUint16(),\n returnTypes: readStringList(reader)\n };\n case \"structuredTexture\": {\n const strideBytes = reader.readUint32();\n const width = reader.readUint16();\n return {\n strideBytes,\n format: DATA_TEXTURE_FORMAT.structuredTexture,\n width,\n ...(readLocalLightRecord(reader) ?? {})\n };\n }\n case \"structuredUbo\":\n return {\n strideBytes: reader.readUint32(),\n capacityElements: reader.readUint16()\n };\n case \"uavTexture\": {\n const slice = reader.readUint8();\n return {\n slice: slice === ABSENT_U8 ? null : slice,\n location: reader.readUint8(),\n returnTypes: readStringList(reader)\n };\n }\n case \"dispatchUniform\":\n return {};\n default:\n throw new CjsFormatReadError(`Unknown binding kind \"${kind}\"`, { kind });\n }\n}\n\n/**\n * Writes an optional count-prefixed string list.\n *\n * @param {CjsByteWriter} writer Target writer.\n * @param {string[]|null} values String list, or null.\n */\nfunction writeStringList(writer, values)\n{\n const list = Array.isArray(values) ? values : [];\n writer.u8(list.length);\n for (const value of list) writeInlineString(writer, value);\n}\n\n/**\n * Reads an optional count-prefixed string list.\n *\n * @param {CjsByteReader} reader Source reader.\n * @returns {string[]|null} String list, or null when empty.\n */\nfunction readStringList(reader)\n{\n const count = reader.readUint8();\n if (!count) return null;\n\n const values = [];\n for (let index = 0; index < count; index += 1) values.push(readInlineString(reader));\n return values;\n}\n\n/**\n * Writes the compute-as-fragment section.\n *\n * @param {CjsByteWriter} writer Target writer.\n * @param {object|null} computeFragment Compute-fragment contract, or null.\n */\nfunction writeComputeFragment(writer, computeFragment)\n{\n if (!computeFragment)\n {\n writer.u8(0);\n return;\n }\n\n writer.u8(1);\n const threadGroup = computeFragment.threadGroup;\n writer.u8(threadGroup ? 1 : 0);\n if (threadGroup) for (const extent of threadGroup) writer.u16(extent);\n writeInlineString(writer, computeFragment.dispatchOriginUniform ?? \"\");\n\n const outputs = computeFragment.uavOutputs ?? [];\n writer.u8(outputs.length);\n for (const output of outputs)\n {\n writer.u8(output.register);\n writer.u8(output.slice ?? ABSENT_U8);\n writer.u8(output.location);\n writeInlineString(writer, output.glslName);\n }\n}\n\n/**\n * Reads the compute-as-fragment section.\n *\n * @param {CjsByteReader} reader Source reader.\n * @returns {object|null} Compute-fragment contract, or null.\n */\nfunction readComputeFragment(reader)\n{\n if (!reader.readUint8()) return null;\n\n const threadGroup = reader.readUint8()\n ? [ reader.readUint16(), reader.readUint16(), reader.readUint16() ]\n : null;\n const dispatchOriginUniform = readInlineString(reader);\n\n const uavOutputs = [];\n const outputCount = reader.readUint8();\n for (let index = 0; index < outputCount; index += 1)\n {\n const register = reader.readUint8();\n const slice = reader.readUint8();\n uavOutputs.push({\n register,\n slice: slice === ABSENT_U8 ? null : slice,\n location: reader.readUint8(),\n glslName: readInlineString(reader)\n });\n }\n\n return {\n threadGroup,\n dispatchOriginUniform: dispatchOriginUniform === \"\" ? null : dispatchOriginUniform,\n uavOutputs\n };\n}\n\n/**\n * Serialises one pass's GLSL backend block.\n *\n * @param {object} block Block contents.\n * @param {object} [block.stages] Per-stage lowering data, keyed by stage name.\n * @param {object[]} [block.transforms] Resource transforms.\n * @returns {Uint8Array} Self-contained block bytes.\n */\nexport function writeGlslBackendBlock(block)\n{\n const stages = block.stages ?? {};\n const writer = new CjsByteWriter(256);\n\n writer.u8(CARBON_BACKEND_ENGINE_ID.webgl2);\n\n // Canonical stage order, not object insertion order: two passes with the\n // same lowering must produce the same bytes so the arena dedupes them.\n const present = GLSL_BACKEND_STAGE.filter((name) => stages[name]);\n writer.u8(present.length);\n\n for (const stageName of present)\n {\n const stage = stages[stageName];\n writer.u8(GLSL_BACKEND_STAGE.indexOf(stageName));\n\n const bindings = stage.bindings ?? [];\n writer.u8(bindings.length);\n for (const binding of bindings)\n {\n const kind = GLSL_BACKEND_BINDING_KIND.indexOf(binding.kind);\n if (kind < 0)\n {\n throw new CjsFormatWriteError(`Unknown binding kind \"${binding.kind}\"`, {\n kind: binding.kind\n });\n }\n writer.u8(kind);\n writer.u8(binding.registerIndex ?? ABSENT_U8);\n writeInlineString(writer, binding.name);\n writeBindingBody(writer, binding);\n }\n\n const stageInputs = stage.stageInputs ?? [];\n writer.u8(stageInputs.length);\n for (const input of stageInputs)\n {\n const componentType = DxbcComponentTypeNames.indexOf(input.componentTypeName);\n if (componentType < 0)\n {\n throw new CjsFormatWriteError(\n `Unknown component type \"${input.componentTypeName}\"`,\n { componentTypeName: input.componentTypeName }\n );\n }\n writer.u8(input.register);\n writeInlineString(writer, input.name);\n writeInlineString(writer, input.semanticName);\n writer.u8(input.semanticIndex);\n writer.u8(componentType);\n writer.u8(input.mask);\n }\n\n writeComputeFragment(writer, stage.computeFragment ?? null);\n }\n\n writeTransformSection(writer, block.transforms ?? []);\n\n return writer.toBytes();\n}\n\n/**\n * Parses one pass's GLSL 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 readGlslBackendBlock(bytes, options = {})\n{\n const reader = new CjsByteReader(bytes, { source: options.source ?? \"glsl backend block\" });\n const layoutKey = options.layoutKey ?? null;\n\n // Identity, then straight into the payload: no version byte is read because\n // none is written. Carbon's container version is the only version, and a\n // block whose shape does not match this build fails on the trailing-byte\n // check below - the fix for which is to rebuild the package, never to add a\n // branch.\n readBackendEngineId(reader, CARBON_BACKEND_ENGINE_ID.webgl2, options.source ?? \"glsl backend block\");\n\n const stages = {};\n const stageCount = reader.readUint8();\n\n for (let index = 0; index < stageCount; index += 1)\n {\n const stageName = GLSL_BACKEND_STAGE[reader.readUint8()];\n\n const bindings = [];\n const bindingCount = reader.readUint8();\n for (let bindingIndex = 0; bindingIndex < bindingCount; bindingIndex += 1)\n {\n const kind = GLSL_BACKEND_BINDING_KIND[reader.readUint8()];\n const registerIndex = reader.readUint8();\n const name = readInlineString(reader);\n bindings.push({\n kind,\n ...(registerIndex === ABSENT_U8 ? {} : { registerIndex }),\n name,\n ...readBindingBody(reader, kind)\n });\n }\n\n const stageInputs = [];\n const stageInputCount = reader.readUint8();\n for (let inputIndex = 0; inputIndex < stageInputCount; inputIndex += 1)\n {\n stageInputs.push({\n register: reader.readUint8(),\n name: readInlineString(reader),\n semanticName: readInlineString(reader),\n semanticIndex: reader.readUint8(),\n componentTypeName: DxbcComponentTypeNames[reader.readUint8()],\n mask: reader.readUint8()\n });\n }\n\n const computeFragment = readComputeFragment(reader);\n\n stages[stageName] = {\n bindings,\n stageInputs,\n ...(computeFragment ? { computeFragment } : {})\n };\n }\n\n const transforms = readTransformSection(reader, layoutKey);\n\n // A sized record must land exactly on its declared end. Trailing bytes mean\n // the writer knew fields this reader does not, which without a version byte\n // is the ONLY signal that a block came from a different build - so this is\n // load-bearing rather than defensive, and it is why removing the version is\n // safe. The fix is always to rebuild the package.\n if (reader.remaining !== 0)\n {\n throw new CjsFormatReadError(\n `GLSL backend block has ${reader.remaining} unparsed trailing byte(s); rebuild the effect package`,\n {\n source: options.source ?? \"glsl backend block\",\n trailingBytes: reader.remaining\n }\n );\n }\n\n return { layoutKey, stages, transforms, trailingBytes: 0 };\n}\n"],"names":["GLSL_BACKEND_STAGE","Object","freeze","GLSL_BACKEND_BINDING_KIND","GLSL_BACKEND_CONSTANT_BUFFER_STYLE","SAMPLER_TYPE_BY_DIMENSION","SHADOW_SAMPLER_TYPE_BY_DIMENSION","DATA_TEXTURE_FORMAT","bufferTexture","structuredTexture","ABSENT_U8","GLSL_LOCAL_LIGHT_ROLE","EMITTER_LIGHT_SEMANTIC","writeLocalLightRecord","writer","binding","role","indexOf","cjsSemantic","u8","CjsFormatWriteError","name","semantic","lightIndexRegister","lightDataRegister","lightProfileRegister","u32","dataTexelBase","u16","capacityLights","readLocalLightRecord","reader","readUint8","profile","readUint32","readUint16","localLightRole","writeBindingBody","kind","style","sizeInVec4","dimension","DxbcResourceDimensionNames","dimensionName","samplers","comparison","samplerRegisterIndices","length","register","paired","pairedSamplerRegisters","width","writeStringList","returnTypes","strideBytes","capacityElements","slice","location","readBindingBody","samplerCount","index","push","pairedCount","samplerType","CjsFormatReadError","format","readStringList","values","list","Array","isArray","value","writeInlineString","count","readInlineString","writeComputeFragment","computeFragment","threadGroup","extent","dispatchOriginUniform","outputs","uavOutputs","output","glslName","readComputeFragment","outputCount","writeGlslBackendBlock","block","stages","CjsByteWriter","CARBON_BACKEND_ENGINE_ID","webgl2","present","filter","stageName","stage","bindings","registerIndex","stageInputs","input","componentType","DxbcComponentTypeNames","componentTypeName","semanticName","semanticIndex","mask","writeTransformSection","transforms","toBytes","readGlslBackendBlock","bytes","options","CjsByteReader","source","layoutKey","readBackendEngineId","stageCount","bindingCount","bindingIndex","stageInputCount","inputIndex","readTransformSection","remaining","trailingBytes"],"mappings":";;;;;;;;AAgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,kBAAkB,GAAGC,MAAM,CAACC,MAAM,CAAC,CAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAE;;AAEhF;AACA;AACA;AACA;AACO,MAAMC,yBAAyB,GAAGF,MAAM,CAACC,MAAM,CAAC,CACnD,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,iBAAiB,CACpB;;AAED;AACO,MAAME,kCAAkC,GAAGH,MAAM,CAACC,MAAM,CAAC,CAAE,OAAO,EAAE,QAAQ,CAAE;;AAErF;AACA,MAAMG,yBAAyB,GAAGJ,MAAM,CAACC,MAAM,CAAC;AAC5C,EAAA,CAAC,EAAE,WAAW;AACd,EAAA,CAAC,EAAE,WAAW;AACd,EAAA,CAAC,EAAE,WAAW;AACd,EAAA,CAAC,EAAE,aAAa;AAChB,EAAA,CAAC,EAAE;AACP,CAAC,CAAC;;AAEF;AACA,MAAMI,gCAAgC,GAAGL,MAAM,CAACC,MAAM,CAAC;AACnD,EAAA,CAAC,EAAE,iBAAiB;AACpB,EAAA,CAAC,EAAE,mBAAmB;AACtB,EAAA,CAAC,EAAE;AACP,CAAC,CAAC;;AAEF;AACA,MAAMK,mBAAmB,GAAGN,MAAM,CAACC,MAAM,CAAC;AACtCM,EAAAA,aAAa,EAAE,SAAS;AACxBC,EAAAA,iBAAiB,EAAE;AACvB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"}
@@ -74,7 +74,6 @@ function unitSignature(unit) {
74
74
  * depends on the register *and* the stage, through a profile table. Deriving it
75
75
  * downstream would re-implement that policy, and a divergence would show up as a
76
76
  * uniform that never binds rather than as an error.
77
- * See docs/contracts/constant-buffer-slots.md.
78
77
  *
79
78
  * @param {object} shader Translated shader record.
80
79
  * @returns {object|null} Stage block data, or null when the stage adds nothing.
@@ -1 +1 @@
1
- {"version":3,"file":"glslBackendBodySet.js","sources":["../../../../../src/formats/webgl/core/glslBackendBodySet.js"],"sourcesContent":["import { detailMapTransformFor } from \"../../hlsl/core/detailMapFamily.js\";\nimport { localLightProfileNeutralTransformFor } from \"../../hlsl/core/localLightFamily.js\";\n\n/**\n * Reshapes translated GLSL into the backend body set the Carbon container\n * writer consumes.\n *\n * This is the WebGL counterpart of `formats/webgpu/core/effectBackendBodySet.js`\n * and deliberately emits the same envelope, because `buildCarbonEffectContainer`\n * is backend-neutral and should stay that way: it wants bodies, passes and\n * translation units, and does not care what language the programs are in.\n *\n * Two facts drive the shape here, and neither is obvious:\n *\n * 1. **Body keys must be the permutation graph's, not this package's.** The\n * effect walk mints `body_${offset}_${size}` while the graph mints\n * `body${N}`. The container writer drives off graph variants, so a package\n * key reaching it would silently match nothing. The bridge is the\n * permutation index, not string surgery on either spelling.\n *\n * 2. **A translation unit is per pass, never per shader.** One DXBC vertex body\n * can lower to several different GLSL programs, because `pairVaryings`\n * zero-fills the varyings a paired pixel stage reads but the vertex stage\n * never writes - and that set differs per pass. Deduplicating programs by\n * bytecode would therefore collapse two genuinely different programs into\n * one. The unit signature includes the pass key for exactly this reason.\n */\n\n/**\n * Carbon's pass identity, matching the WebGPU emitter so both backends key\n * passes identically.\n *\n * @param {string} techniqueName Technique name.\n * @param {number} passIndex Pass index within the technique.\n * @returns {string} Pass key.\n */\nfunction passKeyFor(techniqueName, passIndex)\n{\n return `${techniqueName}.pass${passIndex}`;\n}\n\n/**\n * Stable signature for one pass translation unit.\n *\n * Includes `passKey` because pass-scoped varying pairing can make two units\n * differ while their source bytecode is identical. Excludes diagnostics\n * (`emitWarnings`, `hlsl2webgl`) because they describe the build, not the\n * program, and would split otherwise-identical units.\n *\n * @param {object} unit Candidate unit.\n * @returns {string} Signature.\n */\nfunction unitSignature(unit)\n{\n return JSON.stringify({\n passKey: unit.passKey,\n shaders: unit.shaders,\n block: unit.block,\n resourceTransforms: unit.resourceTransforms\n });\n}\n\n/**\n * Collect the per-stage data that has no home in Carbon reflection.\n *\n * Carbon records the logical resource and its register; these are the lowering\n * decisions taken on top of that - fused sampler pairs, synthesised data\n * textures and UBOs, dropped stub registers, and integer attributes lowered to\n * float. The GLSL text declares them but does not say how to build or bind\n * them, and reflection does not know they happened.\n *\n * Identifiers are kept. An earlier version of this comment claimed `cb{n}`,\n * `s{n}` and `attr{n}` are functions of the register index alone and so need not\n * be stored. They are not: the pixel stage remaps constant-buffer slot 0 to\n * `cb7` (`DxbcGlslEmitter.js`, `pixelConstantBufferRemap`), so an identifier\n * depends on the register *and* the stage, through a profile table. Deriving it\n * downstream would re-implement that policy, and a divergence would show up as a\n * uniform that never binds rather than as an error.\n * See docs/contracts/constant-buffer-slots.md.\n *\n * @param {object} shader Translated shader record.\n * @returns {object|null} Stage block data, or null when the stage adds nothing.\n */\nfunction stageBlockFor(shader)\n{\n const block = {};\n\n if (Array.isArray(shader.bindings) && shader.bindings.length)\n {\n block.bindings = shader.bindings;\n }\n if (Array.isArray(shader.stageInputs) && shader.stageInputs.length)\n {\n block.stageInputs = shader.stageInputs;\n }\n if (shader.computeFragment)\n {\n block.computeFragment = shader.computeFragment;\n }\n\n return Object.keys(block).length ? block : null;\n}\n\n/**\n * Build the backend body set for a translated WebGL effect.\n *\n * @param {object} input Translation results.\n * @param {Array<object>} input.bodies Body records from the effect walk.\n * @param {Array<object>} input.stages Stage records from the effect walk.\n * @param {Array<object>} input.shaders Translated shader records.\n * @param {Array<object>} input.variants Export variants, carrying permutation indices.\n * @param {object} input.permutationGraph Validated permutation graph.\n * @returns {object} Backend body set in the container writer's shape.\n */\nexport function buildGlslBackendBodySet(input)\n{\n const { bodies, stages, shaders, variants, permutationGraph } = input;\n\n const shadersByKey = new Map(shaders.map((shader) => [ shader.key, shader ]));\n const stagesByBody = new Map();\n for (const stage of stages)\n {\n if (!stagesByBody.has(stage.bodyKey)) stagesByBody.set(stage.bodyKey, []);\n stagesByBody.get(stage.bodyKey).push(stage);\n }\n\n // Package body key -> the graph's own key, bridged through the permutation\n // index rather than by reformatting either spelling.\n const graphKeyByPackageKey = new Map();\n const permutationIndexByPackageKey = new Map();\n for (const variant of variants)\n {\n if (graphKeyByPackageKey.has(variant.bodyKey)) continue;\n const graphVariant = permutationGraph.variants[variant.permutationIndex];\n if (!graphVariant) continue;\n graphKeyByPackageKey.set(variant.bodyKey, graphVariant.bodyKey);\n permutationIndexByPackageKey.set(variant.bodyKey, variant.permutationIndex);\n }\n\n const passUnits = [];\n const unitKeyBySignature = new Map();\n const emittedBodies = [];\n\n for (const body of bodies)\n {\n const graphBodyKey = graphKeyByPackageKey.get(body.key);\n if (!graphBodyKey) continue;\n\n const representativePermutationIndex =\n permutationIndexByPackageKey.get(body.key) ?? 0;\n\n if (body.error)\n {\n emittedBodies.push(Object.freeze({\n bodyKey: graphBodyKey,\n representativePermutationIndex,\n status: \"unsupported\",\n error: body.error,\n passes: Object.freeze([])\n }));\n continue;\n }\n\n const passes = new Map();\n for (const stage of stagesByBody.get(body.key) ?? [])\n {\n const key = passKeyFor(stage.techniqueName, stage.passIndex);\n if (!passes.has(key))\n {\n passes.set(key, { passKey: key, shaders: [], block: {}, transforms: [] });\n }\n\n const shader = shadersByKey.get(stage.shaderKey);\n // A stage the translator could not lower carries no program. The\n // body still emits, with reflection intact and an empty slot, so\n // the offset table stays dense and the failure is visible rather\n // than absent.\n if (!shader?.source) continue;\n\n const entry = passes.get(key);\n\n // The merge is a property of the pass, not of one stage: the block's\n // transform section says how to build the array the GLSL samples.\n // Built here rather than at translation time because the transform's\n // identity includes the pass key, which the translator does not know.\n if (shader.detailMapArray && !entry.hasDetailMapTransform)\n {\n entry.hasDetailMapTransform = true;\n entry.transforms.push(detailMapTransformFor(shader.detailMapArray, key));\n }\n\n // Same reasoning, different statement: this one records that the\n // light profile array was dropped for a constant, so the resource\n // the description still lists is accounted for rather than missing.\n if (shader.lightProfileNeutral && !entry.hasLightProfileTransform)\n {\n const transform = localLightProfileNeutralTransformFor(shader.lightProfileNeutral, key);\n if (transform)\n {\n entry.hasLightProfileTransform = true;\n entry.transforms.push(transform);\n }\n }\n\n entry.shaders.push({\n key: `${key}.${stage.stageName}`,\n stageName: stage.stageName,\n stageType: stage.stageType,\n code: shader.source\n });\n\n const stageBlock = stageBlockFor(shader);\n if (stageBlock) entry.block[stage.stageName] = stageBlock;\n }\n\n const bodyPasses = [];\n let translatedPassCount = 0;\n\n for (const pass of passes.values())\n {\n if (!pass.shaders.length) continue;\n translatedPassCount += 1;\n\n const unit = {\n passKey: pass.passKey,\n shaders: pass.shaders,\n block: Object.keys(pass.block).length ? pass.block : null,\n resourceTransforms: pass.transforms\n };\n const signature = unitSignature(unit);\n let unitKey = unitKeyBySignature.get(signature);\n\n if (!unitKey)\n {\n unitKey = `unit${passUnits.length}`;\n unitKeyBySignature.set(signature, unitKey);\n passUnits.push(Object.freeze({ key: unitKey, ...unit }));\n }\n\n bodyPasses.push(Object.freeze({ passKey: pass.passKey, unitKey }));\n }\n\n emittedBodies.push(Object.freeze({\n bodyKey: graphBodyKey,\n representativePermutationIndex,\n status: translatedPassCount ? \"translated\" : \"unsupported\",\n error: translatedPassCount ? null : \"no pass produced a translated program\",\n passes: Object.freeze(bodyPasses)\n }));\n }\n\n return Object.freeze({\n format: \"CJS_GLSL_BODY_SET\",\n formatVersion: 1,\n bodyCount: emittedBodies.length,\n translatedBodyCount: emittedBodies.filter((body) => body.status === \"translated\").length,\n passUnitCount: passUnits.length,\n passUnits: Object.freeze(passUnits),\n bodies: Object.freeze(emittedBodies)\n });\n}\n\nexport default buildGlslBackendBodySet;\n"],"names":["passKeyFor","techniqueName","passIndex","unitSignature","unit","JSON","stringify","passKey","shaders","block","resourceTransforms","stageBlockFor","shader","Array","isArray","bindings","length","stageInputs","computeFragment","Object","keys","buildGlslBackendBodySet","input","bodies","stages","variants","permutationGraph","shadersByKey","Map","map","key","stagesByBody","stage","has","bodyKey","set","get","push","graphKeyByPackageKey","permutationIndexByPackageKey","variant","graphVariant","permutationIndex","passUnits","unitKeyBySignature","emittedBodies","body","graphBodyKey","representativePermutationIndex","error","freeze","status","passes","transforms","shaderKey","source","entry","detailMapArray","hasDetailMapTransform","detailMapTransformFor","lightProfileNeutral","hasLightProfileTransform","transform","localLightProfileNeutralTransformFor","stageName","stageType","code","stageBlock","bodyPasses","translatedPassCount","pass","values","signature","unitKey","format","formatVersion","bodyCount","translatedBodyCount","filter","passUnitCount"],"mappings":"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"}
1
+ {"version":3,"file":"glslBackendBodySet.js","sources":["../../../../../src/formats/webgl/core/glslBackendBodySet.js"],"sourcesContent":["import { detailMapTransformFor } from \"../../hlsl/core/detailMapFamily.js\";\nimport { localLightProfileNeutralTransformFor } from \"../../hlsl/core/localLightFamily.js\";\n\n/**\n * Reshapes translated GLSL into the backend body set the Carbon container\n * writer consumes.\n *\n * This is the WebGL counterpart of `formats/webgpu/core/effectBackendBodySet.js`\n * and deliberately emits the same envelope, because `buildCarbonEffectContainer`\n * is backend-neutral and should stay that way: it wants bodies, passes and\n * translation units, and does not care what language the programs are in.\n *\n * Two facts drive the shape here, and neither is obvious:\n *\n * 1. **Body keys must be the permutation graph's, not this package's.** The\n * effect walk mints `body_${offset}_${size}` while the graph mints\n * `body${N}`. The container writer drives off graph variants, so a package\n * key reaching it would silently match nothing. The bridge is the\n * permutation index, not string surgery on either spelling.\n *\n * 2. **A translation unit is per pass, never per shader.** One DXBC vertex body\n * can lower to several different GLSL programs, because `pairVaryings`\n * zero-fills the varyings a paired pixel stage reads but the vertex stage\n * never writes - and that set differs per pass. Deduplicating programs by\n * bytecode would therefore collapse two genuinely different programs into\n * one. The unit signature includes the pass key for exactly this reason.\n */\n\n/**\n * Carbon's pass identity, matching the WebGPU emitter so both backends key\n * passes identically.\n *\n * @param {string} techniqueName Technique name.\n * @param {number} passIndex Pass index within the technique.\n * @returns {string} Pass key.\n */\nfunction passKeyFor(techniqueName, passIndex)\n{\n return `${techniqueName}.pass${passIndex}`;\n}\n\n/**\n * Stable signature for one pass translation unit.\n *\n * Includes `passKey` because pass-scoped varying pairing can make two units\n * differ while their source bytecode is identical. Excludes diagnostics\n * (`emitWarnings`, `hlsl2webgl`) because they describe the build, not the\n * program, and would split otherwise-identical units.\n *\n * @param {object} unit Candidate unit.\n * @returns {string} Signature.\n */\nfunction unitSignature(unit)\n{\n return JSON.stringify({\n passKey: unit.passKey,\n shaders: unit.shaders,\n block: unit.block,\n resourceTransforms: unit.resourceTransforms\n });\n}\n\n/**\n * Collect the per-stage data that has no home in Carbon reflection.\n *\n * Carbon records the logical resource and its register; these are the lowering\n * decisions taken on top of that - fused sampler pairs, synthesised data\n * textures and UBOs, dropped stub registers, and integer attributes lowered to\n * float. The GLSL text declares them but does not say how to build or bind\n * them, and reflection does not know they happened.\n *\n * Identifiers are kept. An earlier version of this comment claimed `cb{n}`,\n * `s{n}` and `attr{n}` are functions of the register index alone and so need not\n * be stored. They are not: the pixel stage remaps constant-buffer slot 0 to\n * `cb7` (`DxbcGlslEmitter.js`, `pixelConstantBufferRemap`), so an identifier\n * depends on the register *and* the stage, through a profile table. Deriving it\n * downstream would re-implement that policy, and a divergence would show up as a\n * uniform that never binds rather than as an error.\n *\n * @param {object} shader Translated shader record.\n * @returns {object|null} Stage block data, or null when the stage adds nothing.\n */\nfunction stageBlockFor(shader)\n{\n const block = {};\n\n if (Array.isArray(shader.bindings) && shader.bindings.length)\n {\n block.bindings = shader.bindings;\n }\n if (Array.isArray(shader.stageInputs) && shader.stageInputs.length)\n {\n block.stageInputs = shader.stageInputs;\n }\n if (shader.computeFragment)\n {\n block.computeFragment = shader.computeFragment;\n }\n\n return Object.keys(block).length ? block : null;\n}\n\n/**\n * Build the backend body set for a translated WebGL effect.\n *\n * @param {object} input Translation results.\n * @param {Array<object>} input.bodies Body records from the effect walk.\n * @param {Array<object>} input.stages Stage records from the effect walk.\n * @param {Array<object>} input.shaders Translated shader records.\n * @param {Array<object>} input.variants Export variants, carrying permutation indices.\n * @param {object} input.permutationGraph Validated permutation graph.\n * @returns {object} Backend body set in the container writer's shape.\n */\nexport function buildGlslBackendBodySet(input)\n{\n const { bodies, stages, shaders, variants, permutationGraph } = input;\n\n const shadersByKey = new Map(shaders.map((shader) => [ shader.key, shader ]));\n const stagesByBody = new Map();\n for (const stage of stages)\n {\n if (!stagesByBody.has(stage.bodyKey)) stagesByBody.set(stage.bodyKey, []);\n stagesByBody.get(stage.bodyKey).push(stage);\n }\n\n // Package body key -> the graph's own key, bridged through the permutation\n // index rather than by reformatting either spelling.\n const graphKeyByPackageKey = new Map();\n const permutationIndexByPackageKey = new Map();\n for (const variant of variants)\n {\n if (graphKeyByPackageKey.has(variant.bodyKey)) continue;\n const graphVariant = permutationGraph.variants[variant.permutationIndex];\n if (!graphVariant) continue;\n graphKeyByPackageKey.set(variant.bodyKey, graphVariant.bodyKey);\n permutationIndexByPackageKey.set(variant.bodyKey, variant.permutationIndex);\n }\n\n const passUnits = [];\n const unitKeyBySignature = new Map();\n const emittedBodies = [];\n\n for (const body of bodies)\n {\n const graphBodyKey = graphKeyByPackageKey.get(body.key);\n if (!graphBodyKey) continue;\n\n const representativePermutationIndex =\n permutationIndexByPackageKey.get(body.key) ?? 0;\n\n if (body.error)\n {\n emittedBodies.push(Object.freeze({\n bodyKey: graphBodyKey,\n representativePermutationIndex,\n status: \"unsupported\",\n error: body.error,\n passes: Object.freeze([])\n }));\n continue;\n }\n\n const passes = new Map();\n for (const stage of stagesByBody.get(body.key) ?? [])\n {\n const key = passKeyFor(stage.techniqueName, stage.passIndex);\n if (!passes.has(key))\n {\n passes.set(key, { passKey: key, shaders: [], block: {}, transforms: [] });\n }\n\n const shader = shadersByKey.get(stage.shaderKey);\n // A stage the translator could not lower carries no program. The\n // body still emits, with reflection intact and an empty slot, so\n // the offset table stays dense and the failure is visible rather\n // than absent.\n if (!shader?.source) continue;\n\n const entry = passes.get(key);\n\n // The merge is a property of the pass, not of one stage: the block's\n // transform section says how to build the array the GLSL samples.\n // Built here rather than at translation time because the transform's\n // identity includes the pass key, which the translator does not know.\n if (shader.detailMapArray && !entry.hasDetailMapTransform)\n {\n entry.hasDetailMapTransform = true;\n entry.transforms.push(detailMapTransformFor(shader.detailMapArray, key));\n }\n\n // Same reasoning, different statement: this one records that the\n // light profile array was dropped for a constant, so the resource\n // the description still lists is accounted for rather than missing.\n if (shader.lightProfileNeutral && !entry.hasLightProfileTransform)\n {\n const transform = localLightProfileNeutralTransformFor(shader.lightProfileNeutral, key);\n if (transform)\n {\n entry.hasLightProfileTransform = true;\n entry.transforms.push(transform);\n }\n }\n\n entry.shaders.push({\n key: `${key}.${stage.stageName}`,\n stageName: stage.stageName,\n stageType: stage.stageType,\n code: shader.source\n });\n\n const stageBlock = stageBlockFor(shader);\n if (stageBlock) entry.block[stage.stageName] = stageBlock;\n }\n\n const bodyPasses = [];\n let translatedPassCount = 0;\n\n for (const pass of passes.values())\n {\n if (!pass.shaders.length) continue;\n translatedPassCount += 1;\n\n const unit = {\n passKey: pass.passKey,\n shaders: pass.shaders,\n block: Object.keys(pass.block).length ? pass.block : null,\n resourceTransforms: pass.transforms\n };\n const signature = unitSignature(unit);\n let unitKey = unitKeyBySignature.get(signature);\n\n if (!unitKey)\n {\n unitKey = `unit${passUnits.length}`;\n unitKeyBySignature.set(signature, unitKey);\n passUnits.push(Object.freeze({ key: unitKey, ...unit }));\n }\n\n bodyPasses.push(Object.freeze({ passKey: pass.passKey, unitKey }));\n }\n\n emittedBodies.push(Object.freeze({\n bodyKey: graphBodyKey,\n representativePermutationIndex,\n status: translatedPassCount ? \"translated\" : \"unsupported\",\n error: translatedPassCount ? null : \"no pass produced a translated program\",\n passes: Object.freeze(bodyPasses)\n }));\n }\n\n return Object.freeze({\n format: \"CJS_GLSL_BODY_SET\",\n formatVersion: 1,\n bodyCount: emittedBodies.length,\n translatedBodyCount: emittedBodies.filter((body) => body.status === \"translated\").length,\n passUnitCount: passUnits.length,\n passUnits: Object.freeze(passUnits),\n bodies: Object.freeze(emittedBodies)\n });\n}\n\nexport default buildGlslBackendBodySet;\n"],"names":["passKeyFor","techniqueName","passIndex","unitSignature","unit","JSON","stringify","passKey","shaders","block","resourceTransforms","stageBlockFor","shader","Array","isArray","bindings","length","stageInputs","computeFragment","Object","keys","buildGlslBackendBodySet","input","bodies","stages","variants","permutationGraph","shadersByKey","Map","map","key","stagesByBody","stage","has","bodyKey","set","get","push","graphKeyByPackageKey","permutationIndexByPackageKey","variant","graphVariant","permutationIndex","passUnits","unitKeyBySignature","emittedBodies","body","graphBodyKey","representativePermutationIndex","error","freeze","status","passes","transforms","shaderKey","source","entry","detailMapArray","hasDetailMapTransform","detailMapTransformFor","lightProfileNeutral","hasLightProfileTransform","transform","localLightProfileNeutralTransformFor","stageName","stageType","code","stageBlock","bodyPasses","translatedPassCount","pass","values","signature","unitKey","format","formatVersion","bodyCount","translatedBodyCount","filter","passUnitCount"],"mappings":"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"}