@carbonenginejs/runtime-resource 0.17.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +16 -4
  2. package/dist/format/carbonEffect/CjsCarbonEffectWriter.js.map +1 -1
  3. package/dist/format/carbonEffect/backendEngineId.js +1 -3
  4. package/dist/format/carbonEffect/backendEngineId.js.map +1 -1
  5. package/dist/format/carbonEffect/buildCarbonEffectContainer.js +11 -1
  6. package/dist/format/carbonEffect/buildCarbonEffectContainer.js.map +1 -1
  7. package/dist/format/carbonEffect/carbonEffectBackendBlock.js +38 -1
  8. package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
  9. package/dist/format/carbonEffect/carbonEffectRecords.js +45 -1
  10. package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -1
  11. package/dist/format/carbonEffect/carbonEffectResourceTransform.js +120 -60
  12. package/dist/format/carbonEffect/carbonEffectResourceTransform.js.map +1 -1
  13. package/dist/format/effect/effectPermutationGraph.js +46 -29
  14. package/dist/format/effect/effectPermutationGraph.js.map +1 -1
  15. package/dist/format/index.js +1 -1
  16. package/dist/formats/dds/core/helpers.js +35 -6
  17. package/dist/formats/dds/core/helpers.js.map +1 -1
  18. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +53 -1
  19. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -1
  20. package/dist/formats/hlsl/core/detailMapFamily.js +1 -1
  21. package/dist/formats/hlsl/core/detailMapFamily.js.map +1 -1
  22. package/dist/formats/hlsl/core/localLightFamily.js +1 -1
  23. package/dist/formats/hlsl/core/localLightFamily.js.map +1 -1
  24. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +10 -1
  25. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -1
  26. package/dist/formats/index.js +3 -0
  27. package/dist/formats/index.js.map +1 -1
  28. package/dist/formats/schemabound/CjsSchemaBoundFormat.js +236 -0
  29. package/dist/formats/schemabound/CjsSchemaBoundFormat.js.map +1 -0
  30. package/dist/formats/schemabound/core/schemaBoundErrors.js +9 -0
  31. package/dist/formats/schemabound/core/schemaBoundErrors.js.map +1 -0
  32. package/dist/formats/schemabound/core/schemaBoundValues.js +307 -0
  33. package/dist/formats/schemabound/core/schemaBoundValues.js.map +1 -0
  34. package/dist/formats/schemabound/index.js +2 -0
  35. package/dist/formats/schemabound/index.js.map +1 -0
  36. package/dist/formats/sqlite/CjsSqliteFormat.js +244 -0
  37. package/dist/formats/sqlite/CjsSqliteFormat.js.map +1 -0
  38. package/dist/formats/sqlite/core/sqlitePages.js +159 -0
  39. package/dist/formats/sqlite/core/sqlitePages.js.map +1 -0
  40. package/dist/formats/sqlite/core/sqliteRecords.js +174 -0
  41. package/dist/formats/sqlite/core/sqliteRecords.js.map +1 -0
  42. package/dist/formats/sqlite/core/sqliteSchema.js +100 -0
  43. package/dist/formats/sqlite/core/sqliteSchema.js.map +1 -0
  44. package/dist/formats/sqlite/index.js +2 -0
  45. package/dist/formats/sqlite/index.js.map +1 -0
  46. package/dist/formats/static/CjsStaticFormat.js +220 -0
  47. package/dist/formats/static/CjsStaticFormat.js.map +1 -0
  48. package/dist/formats/static/index.js +2 -0
  49. package/dist/formats/static/index.js.map +1 -0
  50. package/dist/formats/webgl/core/buildGlslEffectContainer.js +3 -1
  51. package/dist/formats/webgl/core/buildGlslEffectContainer.js.map +1 -1
  52. package/dist/formats/webgl/core/effectPackage.js +13 -5
  53. package/dist/formats/webgl/core/effectPackage.js.map +1 -1
  54. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +10 -2
  55. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
  56. package/dist/formats/webgl/core/glslBackendBlock.js +6 -5
  57. package/dist/formats/webgl/core/glslBackendBlock.js.map +1 -1
  58. package/dist/formats/webgl/core/glslBackendBodySet.js +0 -1
  59. package/dist/formats/webgl/core/glslBackendBodySet.js.map +1 -1
  60. package/dist/formats/webgpu/CjsWebgpuFormat.js +161 -163
  61. package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
  62. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +3 -1
  63. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -1
  64. package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js +179 -131
  65. package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js.map +1 -1
  66. package/dist/formats/webgpu/core/effectBackendBodySet.js +2 -3
  67. package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
  68. package/dist/formats/webgpu/core/helpers.js +111 -99
  69. package/dist/formats/webgpu/core/helpers.js.map +1 -1
  70. package/dist/formats/webgpu/core/packageEffect.js +44 -33
  71. package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
  72. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +9 -1
  73. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -1
  74. package/dist/resource/shader/reflection/Tr2EffectStageInput.js +14 -0
  75. package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
  76. package/docs/concepts/shader-resource-model.md +34 -1
  77. package/docs/formats/README.md +21 -0
  78. package/docs/formats/carbon-effect-container.md +54 -27
  79. package/docs/formats/schemabound.md +112 -0
  80. package/docs/formats/static.md +119 -0
  81. package/docs/formats/webgl/README.md +5 -3
  82. package/docs/formats/webgpu/README.md +2 -2
  83. package/docs/formats/webgpu/architecture.md +2 -2
  84. package/docs/formats/webgpu/formats/carbon-webgpu.md +24 -6
  85. package/docs/formats/webgpu/guides/effect-packaging.md +1 -2
  86. package/docs/formats/webgpu/reference/api.md +7 -6
  87. package/docs/formats/webgpu/reference/wgsl-compatibility.md +2 -2
  88. package/docs/reference/classes/formats.md +33 -0
  89. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"buildResourceTransformPlan.js","sources":["../../../../../../src/formats/webgpu/core/wgsl/buildResourceTransformPlan.js"],"sourcesContent":["import { compareUtf8 } from \"../../../../format/compareUtf8.js\";\r\nimport {\r\n DETAIL_MAP_ARRAY_NAME,\r\n recogniseDetailMapFamily\r\n} from \"../../../hlsl/core/detailMapFamily.js\";\r\n\r\nconst RESOURCE_IDENTITY = /^sampled-resource:(\\d+):(\\d+)$/u;\r\nconst SAMPLE_OPCODES = new Set([ \"sample_b\" ]);\r\n\r\nfunction deepFreeze(value)\r\n{\r\n if (!value || typeof value !== \"object\" || Object.isFrozen(value)) return value;\r\n for (const entry of Object.values(value)) deepFreeze(entry);\r\n return Object.freeze(value);\r\n}\r\n\r\nfunction bindingRegister(binding)\r\n{\r\n return binding.range?.lowerBound ?? binding.registerIndex;\r\n}\r\n\r\nfunction bindingSpace(binding)\r\n{\r\n return binding.range?.registerSpace ?? 0;\r\n}\r\n\r\nfunction bindingIdentity(binding)\r\n{\r\n return `${binding.resourceKind}:${bindingSpace(binding)}:${bindingRegister(binding)}`;\r\n}\r\n\r\nfunction scopeIdentity(identity, stage)\r\n{\r\n return `${identity}@${stage}`;\r\n}\r\n\r\nfunction normalizeInput(input, transformId, index)\r\n{\r\n const parameter = input?.parameter;\r\n const layer = input?.layer;\r\n const identity = input?.identity;\r\n const scoped = input?.scopeIdentity;\r\n if (typeof parameter !== \"string\" || !parameter\r\n || !Number.isInteger(layer) || layer !== index\r\n || typeof identity !== \"string\" || !RESOURCE_IDENTITY.test(identity)\r\n || scoped !== `${identity}@fragment`)\r\n {\r\n throw new Error(`WGSL resource transform ${transformId} has an invalid input at layer ${index}`);\r\n }\r\n return { parameter, layer, identity, scopeIdentity: scoped };\r\n}\r\n\r\nfunction normalizeTransform(transform)\r\n{\r\n const id = transform?.id;\r\n if (typeof id !== \"string\" || !id\r\n || transform.version !== 1\r\n || transform.kind !== \"texture-2d-array\"\r\n || typeof transform.layoutKey !== \"string\" || !transform.layoutKey\r\n || transform.stage !== \"fragment\"\r\n || !Array.isArray(transform.inputs)\r\n || transform.inputs.length < 2)\r\n {\r\n throw new Error(`WGSL resource transform ${id || \"<unknown>\"} has an invalid texture-array contract`);\r\n }\r\n const inputs = transform.inputs.map((input, index) => normalizeInput(input, id, index));\r\n const inputParameters = new Set(inputs.map((input) => input.parameter));\r\n const inputIdentities = new Set(inputs.map((input) => input.identity));\r\n if (inputParameters.size !== inputs.length || inputIdentities.size !== inputs.length)\r\n {\r\n throw new Error(`WGSL resource transform ${id} contains duplicate inputs`);\r\n }\r\n const output = transform.output;\r\n if (typeof output?.name !== \"string\" || !output.name\r\n || output.identity !== inputs[0].identity\r\n || output.scopeIdentity !== inputs[0].scopeIdentity\r\n || output.viewDimension !== \"2d-array\"\r\n || output.layerCount !== inputs.length\r\n || transform.representation !== \"native-or-rgba8\"\r\n || transform.missingLayer !== \"reject\")\r\n {\r\n throw new Error(`WGSL resource transform ${id} has an invalid output contract`);\r\n }\r\n return {\r\n id,\r\n version: 1,\r\n kind: \"texture-2d-array\",\r\n layoutKey: transform.layoutKey,\r\n stage: \"fragment\",\r\n inputs,\r\n output: {\r\n name: output.name,\r\n identity: output.identity,\r\n scopeIdentity: output.scopeIdentity,\r\n viewDimension: \"2d-array\",\r\n layerCount: output.layerCount\r\n },\r\n representation: \"native-or-rgba8\",\r\n missingLayer: \"reject\"\r\n };\r\n}\r\n\r\n/**\r\n * Validates and freezes the compiler-owned resource-transform plan.\r\n *\r\n * @param {object|null|undefined} value Candidate plan.\r\n * @param {string|null} [layoutKey] Optional expected pass layout key.\r\n * @returns {object|null} Canonical frozen plan, or null.\r\n */\r\nexport function normalizeResourceTransformPlan(value, layoutKey = null)\r\n{\r\n if (value === undefined || value === null) return null;\r\n if (value?.format !== \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\"\r\n || value.formatVersion !== 1\r\n || !Array.isArray(value.resourceTransforms)\r\n || !value.resourceTransforms.length)\r\n {\r\n throw new TypeError(\"WGSL resource transform plan must be a non-empty version-1 document\");\r\n }\r\n const resourceTransforms = value.resourceTransforms.map(normalizeTransform)\r\n .sort((left, right) => compareUtf8(left.id, right.id));\r\n const ids = new Set();\r\n for (const transform of resourceTransforms)\r\n {\r\n if (ids.has(transform.id))\r\n {\r\n throw new Error(`WGSL resource transform plan contains duplicate id ${transform.id}`);\r\n }\r\n ids.add(transform.id);\r\n if (layoutKey !== null && transform.layoutKey !== layoutKey)\r\n {\r\n throw new Error(`WGSL resource transform ${transform.id} targets ${transform.layoutKey}, expected ${layoutKey}`);\r\n }\r\n }\r\n return deepFreeze({\r\n format: \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\",\r\n formatVersion: 1,\r\n resourceTransforms\r\n });\r\n}\r\n\r\nfunction bindingMatchesForOperand(program, resourceKind, operand)\r\n{\r\n const candidates = program.bindings.filter((binding) =>\r\n binding.resourceKind === resourceKind);\r\n const rangeId = operand?.resourceReference?.rangeId;\r\n return Number.isInteger(rangeId)\r\n ? candidates.filter((binding) => binding.range?.rangeId === rangeId)\r\n : candidates.filter((binding) => bindingRegister(binding) === operand?.registerIndex);\r\n}\r\n\r\nfunction resolveBindingForOperand(program, resourceKind, operand)\r\n{\r\n const matches = bindingMatchesForOperand(program, resourceKind, operand);\r\n if (matches.length !== 1) return null;\r\n const binding = matches[0];\r\n const absolute = operand?.resourceReference?.absoluteIndex;\r\n if (operand?.typeName !== (resourceKind === \"sampler\" ? \"sampler\" : \"resource\")\r\n || (operand.modifierName ?? \"none\") !== \"none\"\r\n || (operand.minPrecisionName ?? \"default\") !== \"default\"\r\n || operand.nonUniform\r\n || operand.indices?.some((index) => index?.relative)\r\n || operand.resourceReference?.nonUniform\r\n || absolute?.relative\r\n || (absolute !== undefined\r\n && (absolute?.values?.length !== 1\r\n || absolute.values[0] !== bindingRegister(binding))))\r\n {\r\n return null;\r\n }\r\n return binding;\r\n}\r\n\r\nfunction operandFingerprint(operand)\r\n{\r\n return JSON.stringify({\r\n typeName: operand?.typeName ?? null,\r\n selectionModeName: operand?.selectionModeName ?? null,\r\n mask: operand?.mask ?? \"\",\r\n swizzle: operand?.swizzle ?? \"\",\r\n selected: operand?.selected ?? \"\",\r\n modifierName: operand?.modifierName ?? \"none\",\r\n minPrecisionName: operand?.minPrecisionName ?? \"default\",\r\n registerIndex: operand?.registerIndex ?? null,\r\n indices: (operand?.indices || []).map((index) => ({\r\n values: index?.values || [],\r\n relative: index?.relative ?? null\r\n })),\r\n immediateValues: (operand?.immediateValues || []).map((entry) => entry?.uint32)\r\n });\r\n}\r\n\r\nfunction semanticResource(binding)\r\n{\r\n if (binding?.kind !== \"resource\") return null;\r\n const parameter = binding.metadataName ?? binding.carbon?.name;\r\n if (typeof parameter !== \"string\" || !parameter) return null;\r\n return {\r\n parameter,\r\n registerIndex: binding.registerIndex,\r\n registerSpace: binding.registerSpace ?? 0,\r\n arrayElements: binding.arrayCount ?? binding.carbon?.arrayElements,\r\n type: binding.carbon?.type,\r\n isSRGB: binding.carbon?.isSRGB\r\n };\r\n}\r\n\r\nfunction rejectCandidate()\r\n{\r\n return null;\r\n}\r\n\r\n/**\r\n * Recognizes the exact Carbon Detail-map sample family and builds a late\r\n * physical texture-array overlay. The source IR remains unchanged.\r\n *\r\n * @param {Array<{ir: object, semanticBindings: object[]}>} entries Pass stages.\r\n * @param {object} options Planner options.\r\n * @param {string} options.layoutKey Canonical pass key.\r\n * @returns {object|null} Frozen transform plan, or null when proof is absent.\r\n */\r\nexport function buildResourceTransformPlan(entries, options = {})\r\n{\r\n if (!Array.isArray(entries) || !entries.length)\r\n {\r\n throw new TypeError(\"WGSL resource transform planning expects pass stage entries\");\r\n }\r\n const layoutKey = options.layoutKey;\r\n if (typeof layoutKey !== \"string\" || !layoutKey)\r\n {\r\n throw new TypeError(\"WGSL resource transform planning requires a layoutKey\");\r\n }\r\n const fragments = entries.filter((entry) => entry?.ir?.stage === \"pixel\");\r\n if (fragments.length !== 1) return null;\r\n const { ir: program } = fragments[0];\r\n if (program?.format !== \"CJS_SHADER_IR\" || program.formatVersion !== 1\r\n || !Array.isArray(fragments[0].semanticBindings))\r\n {\r\n throw new TypeError(\"WGSL resource transform planning requires version-1 IR and semantic bindings\");\r\n }\r\n const semanticResources = fragments[0].semanticBindings.map(semanticResource).filter(Boolean);\r\n\r\n // Which registers make up the family is a fact about Carbon's resources,\r\n // not about WGSL, so it is decided by the recogniser WebGL uses too. Both\r\n // backends therefore merge the same registers in the same layer order, and a\r\n // change to that rule cannot land on one backend only. Everything below is\r\n // the part WGSL has to prove for itself: that every use of those registers\r\n // is a plain sample this planner can redirect at an array layer.\r\n const family = recogniseDetailMapFamily(semanticResources);\r\n if (!family) return null;\r\n\r\n const sources = [];\r\n for (const { parameter, registerIndex, registerSpace } of family.layers)\r\n {\r\n const semantic = { parameter, registerIndex, registerSpace };\r\n if (!Number.isInteger(registerSpace) || registerSpace < 0) return rejectCandidate();\r\n const matches = program.bindings.filter((binding) =>\r\n binding.resourceKind === \"sampled-resource\"\r\n && bindingSpace(binding) === registerSpace\r\n && bindingRegister(binding) === registerIndex);\r\n if (matches.length !== 1) return rejectCandidate();\r\n const binding = matches[0];\r\n const returns = binding.returnType?.returnTypeNames || [];\r\n if (binding.resourceDimension !== \"texture2d\"\r\n || binding.structureStride !== null\r\n || binding.range?.unbounded\r\n || binding.range?.registerCount !== 1\r\n || returns.length !== 4\r\n || returns.some((entry) => entry !== \"float\"))\r\n {\r\n return rejectCandidate();\r\n }\r\n sources.push({ parameter, semantic, binding, identity: bindingIdentity(binding) });\r\n }\r\n\r\n const sourceByIdentity = new Map(sources.map((source) => [ source.identity, source ]));\r\n const uses = new Map(sources.map((source) => [ source.identity, 0 ]));\r\n let samplerIdentity = null;\r\n let biasFingerprint = null;\r\n for (const instruction of program.instructions)\r\n {\r\n for (let operandIndex = 0; operandIndex < instruction.operands.length; operandIndex += 1)\r\n {\r\n const operand = instruction.operands[operandIndex];\r\n if (operand?.typeName !== \"resource\") continue;\r\n const binding = resolveBindingForOperand(program, \"sampled-resource\", operand);\r\n if (!binding)\r\n {\r\n const unresolvedCandidate = bindingMatchesForOperand(\r\n program,\r\n \"sampled-resource\",\r\n operand\r\n ).some((candidate) =>\r\n sourceByIdentity.has(bindingIdentity(candidate)));\r\n if (unresolvedCandidate) return rejectCandidate();\r\n continue;\r\n }\r\n const identity = bindingIdentity(binding);\r\n if (!sourceByIdentity.has(identity)) continue;\r\n if (!SAMPLE_OPCODES.has(instruction.opcodeName)\r\n || operandIndex !== 2\r\n || instruction.extensions?.some((extension) =>\r\n extension.typeName === \"sample_controls\")\r\n || instruction.operands.length !== 5)\r\n {\r\n return rejectCandidate();\r\n }\r\n const sampler = resolveBindingForOperand(program, \"sampler\", instruction.operands[3]);\r\n if (!sampler) return rejectCandidate();\r\n const currentSamplerIdentity = bindingIdentity(sampler);\r\n const currentBiasFingerprint = operandFingerprint(instruction.operands[4]);\r\n if ((samplerIdentity !== null && samplerIdentity !== currentSamplerIdentity)\r\n || (biasFingerprint !== null && biasFingerprint !== currentBiasFingerprint))\r\n {\r\n return rejectCandidate();\r\n }\r\n samplerIdentity = currentSamplerIdentity;\r\n biasFingerprint = currentBiasFingerprint;\r\n uses.set(identity, uses.get(identity) + 1);\r\n }\r\n }\r\n if (samplerIdentity === null || Array.from(uses.values()).some((count) => count < 1))\r\n {\r\n return rejectCandidate();\r\n }\r\n\r\n const inputs = sources.map((source, layer) => ({\r\n parameter: source.parameter,\r\n layer,\r\n identity: source.identity,\r\n scopeIdentity: scopeIdentity(source.identity, \"fragment\")\r\n }));\r\n const first = inputs[0];\r\n const id = `${layoutKey}:detail-map-array:${first.identity}`;\r\n return normalizeResourceTransformPlan({\r\n format: \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\",\r\n formatVersion: 1,\r\n resourceTransforms: [ {\r\n id,\r\n version: 1,\r\n kind: \"texture-2d-array\",\r\n layoutKey,\r\n stage: \"fragment\",\r\n inputs,\r\n output: {\r\n name: DETAIL_MAP_ARRAY_NAME,\r\n identity: first.identity,\r\n scopeIdentity: first.scopeIdentity,\r\n viewDimension: \"2d-array\",\r\n layerCount: inputs.length\r\n },\r\n representation: \"native-or-rgba8\",\r\n missingLayer: \"reject\"\r\n } ]\r\n }, layoutKey);\r\n}\r\n"],"names":["RESOURCE_IDENTITY","SAMPLE_OPCODES","Set","deepFreeze","value","Object","isFrozen","entry","values","freeze","bindingRegister","binding","range","lowerBound","registerIndex","bindingSpace","registerSpace","bindingIdentity","resourceKind","scopeIdentity","identity","stage","normalizeInput","input","transformId","index","parameter","layer","scoped","Number","isInteger","test","Error","normalizeTransform","transform","id","version","kind","layoutKey","Array","isArray","inputs","length","map","inputParameters","inputIdentities","size","output","name","viewDimension","layerCount","representation","missingLayer","normalizeResourceTransformPlan","undefined","format","formatVersion","resourceTransforms","TypeError","sort","left","right","compareUtf8","ids","has","add","bindingMatchesForOperand","program","operand","candidates","bindings","filter","rangeId","resourceReference","resolveBindingForOperand","matches","absolute","absoluteIndex","typeName","modifierName","minPrecisionName","nonUniform","indices","some","relative","operandFingerprint","JSON","stringify","selectionModeName","mask","swizzle","selected","immediateValues","uint32","semanticResource","metadataName","carbon","arrayElements","arrayCount","type","isSRGB","rejectCandidate","buildResourceTransformPlan","entries","options","fragments","ir","semanticBindings","semanticResources","Boolean","family","recogniseDetailMapFamily","sources","layers","semantic","returns","returnType","returnTypeNames","resourceDimension","structureStride","unbounded","registerCount","push","sourceByIdentity","Map","source","uses","samplerIdentity","biasFingerprint","instruction","instructions","operandIndex","operands","unresolvedCandidate","candidate","opcodeName","extensions","extension","sampler","currentSamplerIdentity","currentBiasFingerprint","set","get","from","count","first","DETAIL_MAP_ARRAY_NAME"],"mappings":"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"}
1
+ {"version":3,"file":"buildResourceTransformPlan.js","sources":["../../../../../../src/formats/webgpu/core/wgsl/buildResourceTransformPlan.js"],"sourcesContent":["import { compareUtf8 } from \"../../../../format/compareUtf8.js\";\r\nimport {\r\n DETAIL_MAP_ARRAY_NAME,\r\n recogniseDetailMapFamily\r\n} from \"../../../hlsl/core/detailMapFamily.js\";\r\n\r\nconst RESOURCE_IDENTITY = /^sampled-resource:(\\d+):(\\d+)$/u;\r\nconst SAMPLE_OPCODES = new Set([ \"sample_b\" ]);\r\n\r\nfunction deepFreeze(value)\r\n{\r\n if (!value || typeof value !== \"object\" || Object.isFrozen(value)) return value;\r\n for (const entry of Object.values(value)) deepFreeze(entry);\r\n return Object.freeze(value);\r\n}\r\n\r\nfunction bindingRegister(binding)\r\n{\r\n return binding.range?.lowerBound ?? binding.registerIndex;\r\n}\r\n\r\nfunction bindingSpace(binding)\r\n{\r\n return binding.range?.registerSpace ?? 0;\r\n}\r\n\r\nfunction bindingIdentity(binding)\r\n{\r\n return `${binding.resourceKind}:${bindingSpace(binding)}:${bindingRegister(binding)}`;\r\n}\r\n\r\nfunction scopeIdentity(identity, stage)\r\n{\r\n return `${identity}@${stage}`;\r\n}\r\n\r\nfunction normalizeInput(input, transformId, index)\r\n{\r\n const parameter = input?.parameter;\r\n const layer = input?.layer;\r\n const identity = input?.identity;\r\n const scoped = input?.scopeIdentity;\r\n const registers = typeof identity === \"string\" ? RESOURCE_IDENTITY.exec(identity) : null;\r\n if (typeof parameter !== \"string\" || !parameter\r\n || !Number.isInteger(layer) || layer !== index\r\n || !registers\r\n || scoped !== `${identity}@fragment`)\r\n {\r\n throw new Error(`WGSL resource transform ${transformId} has an invalid input at layer ${index}`);\r\n }\r\n // The register pair is parsed back out of the identity rather than copied\r\n // from the caller, so it cannot contradict the identity it composes. It has\r\n // to be carried: the container stores the pair and rebuilds the identity\r\n // from it on read, so dropping it here wrote zeroes and every layer of every\r\n // merged detail map came back as `sampled-resource:0:0`.\r\n return {\r\n parameter,\r\n layer,\r\n registerSpace: Number(registers[1]),\r\n registerIndex: Number(registers[2]),\r\n identity,\r\n scopeIdentity: scoped\r\n };\r\n}\r\n\r\nfunction normalizeTransform(transform)\r\n{\r\n const id = transform?.id;\r\n if (typeof id !== \"string\" || !id\r\n || transform.version !== 1\r\n || transform.kind !== \"texture-2d-array\"\r\n || typeof transform.layoutKey !== \"string\" || !transform.layoutKey\r\n || transform.stage !== \"fragment\"\r\n || !Array.isArray(transform.inputs)\r\n || transform.inputs.length < 2)\r\n {\r\n throw new Error(`WGSL resource transform ${id || \"<unknown>\"} has an invalid texture-array contract`);\r\n }\r\n const inputs = transform.inputs.map((input, index) => normalizeInput(input, id, index));\r\n const inputParameters = new Set(inputs.map((input) => input.parameter));\r\n const inputIdentities = new Set(inputs.map((input) => input.identity));\r\n if (inputParameters.size !== inputs.length || inputIdentities.size !== inputs.length)\r\n {\r\n throw new Error(`WGSL resource transform ${id} contains duplicate inputs`);\r\n }\r\n const output = transform.output;\r\n if (typeof output?.name !== \"string\" || !output.name\r\n || output.identity !== inputs[0].identity\r\n || output.scopeIdentity !== inputs[0].scopeIdentity\r\n || output.viewDimension !== \"2d-array\"\r\n || output.layerCount !== inputs.length\r\n || transform.representation !== \"native-or-rgba8\"\r\n || transform.missingLayer !== \"reject\")\r\n {\r\n throw new Error(`WGSL resource transform ${id} has an invalid output contract`);\r\n }\r\n return {\r\n id,\r\n version: 1,\r\n kind: \"texture-2d-array\",\r\n layoutKey: transform.layoutKey,\r\n stage: \"fragment\",\r\n inputs,\r\n output: {\r\n name: output.name,\r\n identity: output.identity,\r\n scopeIdentity: output.scopeIdentity,\r\n viewDimension: \"2d-array\",\r\n layerCount: output.layerCount\r\n },\r\n representation: \"native-or-rgba8\",\r\n missingLayer: \"reject\"\r\n };\r\n}\r\n\r\n/**\r\n * Validates and freezes the compiler-owned resource-transform plan.\r\n *\r\n * @param {object|null|undefined} value Candidate plan.\r\n * @param {string|null} [layoutKey] Optional expected pass layout key.\r\n * @returns {object|null} Canonical frozen plan, or null.\r\n */\r\nexport function normalizeResourceTransformPlan(value, layoutKey = null)\r\n{\r\n if (value === undefined || value === null) return null;\r\n if (value?.format !== \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\"\r\n || value.formatVersion !== 1\r\n || !Array.isArray(value.resourceTransforms)\r\n || !value.resourceTransforms.length)\r\n {\r\n throw new TypeError(\"WGSL resource transform plan must be a non-empty version-1 document\");\r\n }\r\n const resourceTransforms = value.resourceTransforms.map(normalizeTransform)\r\n .sort((left, right) => compareUtf8(left.id, right.id));\r\n const ids = new Set();\r\n for (const transform of resourceTransforms)\r\n {\r\n if (ids.has(transform.id))\r\n {\r\n throw new Error(`WGSL resource transform plan contains duplicate id ${transform.id}`);\r\n }\r\n ids.add(transform.id);\r\n if (layoutKey !== null && transform.layoutKey !== layoutKey)\r\n {\r\n throw new Error(`WGSL resource transform ${transform.id} targets ${transform.layoutKey}, expected ${layoutKey}`);\r\n }\r\n }\r\n return deepFreeze({\r\n format: \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\",\r\n formatVersion: 1,\r\n resourceTransforms\r\n });\r\n}\r\n\r\nfunction bindingMatchesForOperand(program, resourceKind, operand)\r\n{\r\n const candidates = program.bindings.filter((binding) =>\r\n binding.resourceKind === resourceKind);\r\n const rangeId = operand?.resourceReference?.rangeId;\r\n return Number.isInteger(rangeId)\r\n ? candidates.filter((binding) => binding.range?.rangeId === rangeId)\r\n : candidates.filter((binding) => bindingRegister(binding) === operand?.registerIndex);\r\n}\r\n\r\nfunction resolveBindingForOperand(program, resourceKind, operand)\r\n{\r\n const matches = bindingMatchesForOperand(program, resourceKind, operand);\r\n if (matches.length !== 1) return null;\r\n const binding = matches[0];\r\n const absolute = operand?.resourceReference?.absoluteIndex;\r\n if (operand?.typeName !== (resourceKind === \"sampler\" ? \"sampler\" : \"resource\")\r\n || (operand.modifierName ?? \"none\") !== \"none\"\r\n || (operand.minPrecisionName ?? \"default\") !== \"default\"\r\n || operand.nonUniform\r\n || operand.indices?.some((index) => index?.relative)\r\n || operand.resourceReference?.nonUniform\r\n || absolute?.relative\r\n || (absolute !== undefined\r\n && (absolute?.values?.length !== 1\r\n || absolute.values[0] !== bindingRegister(binding))))\r\n {\r\n return null;\r\n }\r\n return binding;\r\n}\r\n\r\nfunction operandFingerprint(operand)\r\n{\r\n return JSON.stringify({\r\n typeName: operand?.typeName ?? null,\r\n selectionModeName: operand?.selectionModeName ?? null,\r\n mask: operand?.mask ?? \"\",\r\n swizzle: operand?.swizzle ?? \"\",\r\n selected: operand?.selected ?? \"\",\r\n modifierName: operand?.modifierName ?? \"none\",\r\n minPrecisionName: operand?.minPrecisionName ?? \"default\",\r\n registerIndex: operand?.registerIndex ?? null,\r\n indices: (operand?.indices || []).map((index) => ({\r\n values: index?.values || [],\r\n relative: index?.relative ?? null\r\n })),\r\n immediateValues: (operand?.immediateValues || []).map((entry) => entry?.uint32)\r\n });\r\n}\r\n\r\nfunction semanticResource(binding)\r\n{\r\n if (binding?.kind !== \"resource\") return null;\r\n const parameter = binding.metadataName ?? binding.carbon?.name;\r\n if (typeof parameter !== \"string\" || !parameter) return null;\r\n return {\r\n parameter,\r\n registerIndex: binding.registerIndex,\r\n registerSpace: binding.registerSpace ?? 0,\r\n arrayElements: binding.arrayCount ?? binding.carbon?.arrayElements,\r\n type: binding.carbon?.type,\r\n isSRGB: binding.carbon?.isSRGB\r\n };\r\n}\r\n\r\nfunction rejectCandidate()\r\n{\r\n return null;\r\n}\r\n\r\n/**\r\n * Recognizes the exact Carbon Detail-map sample family and builds a late\r\n * physical texture-array overlay. The source IR remains unchanged.\r\n *\r\n * @param {Array<{ir: object, semanticBindings: object[]}>} entries Pass stages.\r\n * @param {object} options Planner options.\r\n * @param {string} options.layoutKey Canonical pass key.\r\n * @returns {object|null} Frozen transform plan, or null when proof is absent.\r\n */\r\nexport function buildResourceTransformPlan(entries, options = {})\r\n{\r\n if (!Array.isArray(entries) || !entries.length)\r\n {\r\n throw new TypeError(\"WGSL resource transform planning expects pass stage entries\");\r\n }\r\n const layoutKey = options.layoutKey;\r\n if (typeof layoutKey !== \"string\" || !layoutKey)\r\n {\r\n throw new TypeError(\"WGSL resource transform planning requires a layoutKey\");\r\n }\r\n const fragments = entries.filter((entry) => entry?.ir?.stage === \"pixel\");\r\n if (fragments.length !== 1) return null;\r\n const { ir: program } = fragments[0];\r\n if (program?.format !== \"CJS_SHADER_IR\" || program.formatVersion !== 1\r\n || !Array.isArray(fragments[0].semanticBindings))\r\n {\r\n throw new TypeError(\"WGSL resource transform planning requires version-1 IR and semantic bindings\");\r\n }\r\n const semanticResources = fragments[0].semanticBindings.map(semanticResource).filter(Boolean);\r\n\r\n // Which registers make up the family is a fact about Carbon's resources,\r\n // not about WGSL, so it is decided by the recogniser WebGL uses too. Both\r\n // backends therefore merge the same registers in the same layer order, and a\r\n // change to that rule cannot land on one backend only. Everything below is\r\n // the part WGSL has to prove for itself: that every use of those registers\r\n // is a plain sample this planner can redirect at an array layer.\r\n const family = recogniseDetailMapFamily(semanticResources);\r\n if (!family) return null;\r\n\r\n const sources = [];\r\n for (const { parameter, registerIndex, registerSpace } of family.layers)\r\n {\r\n const semantic = { parameter, registerIndex, registerSpace };\r\n if (!Number.isInteger(registerSpace) || registerSpace < 0) return rejectCandidate();\r\n const matches = program.bindings.filter((binding) =>\r\n binding.resourceKind === \"sampled-resource\"\r\n && bindingSpace(binding) === registerSpace\r\n && bindingRegister(binding) === registerIndex);\r\n if (matches.length !== 1) return rejectCandidate();\r\n const binding = matches[0];\r\n const returns = binding.returnType?.returnTypeNames || [];\r\n if (binding.resourceDimension !== \"texture2d\"\r\n || binding.structureStride !== null\r\n || binding.range?.unbounded\r\n || binding.range?.registerCount !== 1\r\n || returns.length !== 4\r\n || returns.some((entry) => entry !== \"float\"))\r\n {\r\n return rejectCandidate();\r\n }\r\n sources.push({ parameter, semantic, binding, identity: bindingIdentity(binding) });\r\n }\r\n\r\n const sourceByIdentity = new Map(sources.map((source) => [ source.identity, source ]));\r\n const uses = new Map(sources.map((source) => [ source.identity, 0 ]));\r\n let samplerIdentity = null;\r\n let biasFingerprint = null;\r\n for (const instruction of program.instructions)\r\n {\r\n for (let operandIndex = 0; operandIndex < instruction.operands.length; operandIndex += 1)\r\n {\r\n const operand = instruction.operands[operandIndex];\r\n if (operand?.typeName !== \"resource\") continue;\r\n const binding = resolveBindingForOperand(program, \"sampled-resource\", operand);\r\n if (!binding)\r\n {\r\n const unresolvedCandidate = bindingMatchesForOperand(\r\n program,\r\n \"sampled-resource\",\r\n operand\r\n ).some((candidate) =>\r\n sourceByIdentity.has(bindingIdentity(candidate)));\r\n if (unresolvedCandidate) return rejectCandidate();\r\n continue;\r\n }\r\n const identity = bindingIdentity(binding);\r\n if (!sourceByIdentity.has(identity)) continue;\r\n if (!SAMPLE_OPCODES.has(instruction.opcodeName)\r\n || operandIndex !== 2\r\n || instruction.extensions?.some((extension) =>\r\n extension.typeName === \"sample_controls\")\r\n || instruction.operands.length !== 5)\r\n {\r\n return rejectCandidate();\r\n }\r\n const sampler = resolveBindingForOperand(program, \"sampler\", instruction.operands[3]);\r\n if (!sampler) return rejectCandidate();\r\n const currentSamplerIdentity = bindingIdentity(sampler);\r\n const currentBiasFingerprint = operandFingerprint(instruction.operands[4]);\r\n if ((samplerIdentity !== null && samplerIdentity !== currentSamplerIdentity)\r\n || (biasFingerprint !== null && biasFingerprint !== currentBiasFingerprint))\r\n {\r\n return rejectCandidate();\r\n }\r\n samplerIdentity = currentSamplerIdentity;\r\n biasFingerprint = currentBiasFingerprint;\r\n uses.set(identity, uses.get(identity) + 1);\r\n }\r\n }\r\n if (samplerIdentity === null || Array.from(uses.values()).some((count) => count < 1))\r\n {\r\n return rejectCandidate();\r\n }\r\n\r\n const inputs = sources.map((source, layer) => ({\r\n parameter: source.parameter,\r\n layer,\r\n identity: source.identity,\r\n scopeIdentity: scopeIdentity(source.identity, \"fragment\")\r\n }));\r\n const first = inputs[0];\r\n const id = `${layoutKey}:detail-map-array:${first.identity}`;\r\n return normalizeResourceTransformPlan({\r\n format: \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\",\r\n formatVersion: 1,\r\n resourceTransforms: [ {\r\n id,\r\n version: 1,\r\n kind: \"texture-2d-array\",\r\n layoutKey,\r\n stage: \"fragment\",\r\n inputs,\r\n output: {\r\n name: DETAIL_MAP_ARRAY_NAME,\r\n identity: first.identity,\r\n scopeIdentity: first.scopeIdentity,\r\n viewDimension: \"2d-array\",\r\n layerCount: inputs.length\r\n },\r\n representation: \"native-or-rgba8\",\r\n missingLayer: \"reject\"\r\n } ]\r\n }, layoutKey);\r\n}\r\n"],"names":["RESOURCE_IDENTITY","SAMPLE_OPCODES","Set","deepFreeze","value","Object","isFrozen","entry","values","freeze","bindingRegister","binding","range","lowerBound","registerIndex","bindingSpace","registerSpace","bindingIdentity","resourceKind","scopeIdentity","identity","stage","normalizeInput","input","transformId","index","parameter","layer","scoped","registers","exec","Number","isInteger","Error","normalizeTransform","transform","id","version","kind","layoutKey","Array","isArray","inputs","length","map","inputParameters","inputIdentities","size","output","name","viewDimension","layerCount","representation","missingLayer","normalizeResourceTransformPlan","undefined","format","formatVersion","resourceTransforms","TypeError","sort","left","right","compareUtf8","ids","has","add","bindingMatchesForOperand","program","operand","candidates","bindings","filter","rangeId","resourceReference","resolveBindingForOperand","matches","absolute","absoluteIndex","typeName","modifierName","minPrecisionName","nonUniform","indices","some","relative","operandFingerprint","JSON","stringify","selectionModeName","mask","swizzle","selected","immediateValues","uint32","semanticResource","metadataName","carbon","arrayElements","arrayCount","type","isSRGB","rejectCandidate","buildResourceTransformPlan","entries","options","fragments","ir","semanticBindings","semanticResources","Boolean","family","recogniseDetailMapFamily","sources","layers","semantic","returns","returnType","returnTypeNames","resourceDimension","structureStride","unbounded","registerCount","push","sourceByIdentity","Map","source","uses","samplerIdentity","biasFingerprint","instruction","instructions","operandIndex","operands","unresolvedCandidate","candidate","opcodeName","extensions","extension","sampler","currentSamplerIdentity","currentBiasFingerprint","set","get","from","count","first","DETAIL_MAP_ARRAY_NAME"],"mappings":"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"}
@@ -219,6 +219,20 @@ class Tr2EffectStageInput extends CjsModel {
219
219
  registerIndex: entry.registerIndex,
220
220
  registerSpace: entry.registerSpace,
221
221
  descriptor: {
222
+ // Carried so a consumer can answer "may this sampler be overridden?"
223
+ // without inferring it. Carbon's compiler only makes a static sampler
224
+ // out of a non-dynamic one -- `ConvertToStaticSampler` opens
225
+ // `if( sampler.isDynamic ) { return false; }`
226
+ // (shadercompiler/FXAnalyzer.cpp:1727-1731) -- so `false` is
227
+ // guaranteed, not assumed, and there is no wire field to read.
228
+ //
229
+ // The flag is an authorisation, not decoration: dynamic means the
230
+ // sampler may be overridden, non-dynamic means it must not be
231
+ // touched. A reader that treats an absent flag as dynamic, which is
232
+ // Carbon's default for the stage sampler that does carry one, would
233
+ // offer an override on a sampler Carbon forbids overriding. Omitting
234
+ // it therefore fails in the permissive direction.
235
+ isDynamic: false,
222
236
  comparison: !!entry.comparison,
223
237
  minFilter: entry.minFilter,
224
238
  magFilter: entry.magFilter,
@@ -1 +1 @@
1
- {"version":3,"file":"Tr2EffectStageInput.js","sources":["../../../../../src/resource/shader/reflection/Tr2EffectStageInput.js"],"sourcesContent":["// Source: trinity/trinity/Shader/Tr2EffectDescription.h\r\n// Source: trinity/trinity/Shader/Tr2EffectDescription.cpp\r\nimport { CjsSchema, impl, type } from \"@carbonenginejs/runtime-utils/schema\";\r\nimport { CjsModel } from \"@carbonenginejs/runtime-utils/model\";\r\nimport { copyBytes } from \"@carbonenginejs/runtime-utils/bytes\";\r\nimport {\r\n isPlainObject,\r\n isUint32\r\n} from \"@carbonenginejs/runtime-utils/is\";\r\nimport { Tr2SamplerSetup } from \"../sampler/Tr2SamplerSetup.js\";\r\nimport { Tr2EffectConstant } from \"./Tr2EffectConstant.js\";\r\nimport { Tr2EffectParameterAnnotation } from \"./Tr2EffectParameterAnnotation.js\";\r\nimport { Tr2EffectResource } from \"./Tr2EffectResource.js\";\r\nimport {\r\n recordBytes,\r\n recordRawBits,\r\n toRecordBlob,\r\n toRecordFloat,\r\n toRecordText\r\n} from \"./carbonRecordFields.js\";\r\nimport { compareUtf8 } from \"../../../format/compareUtf8.js\";\r\nimport { requireShaderStageType } from \"./shaderStage.js\";\r\n\r\n/**\r\n * The offset word a zero-size blob carries, or the null sentinel.\r\n *\r\n * @param {{size:number,offset:number}} ref Blob reference.\r\n * @returns {number} Offset word worth retaining.\r\n */\r\nfunction unsetOffsetOf(ref)\r\n{\r\n return ref.size === 0 ? ref.offset : 0xffffffff;\r\n}\r\n\r\n/** Complete device-free reflection for one shader stage input. */\r\nexport class Tr2EffectStageInput extends CjsModel\r\n{\r\n\r\n /** Portable stage index; Carbon otherwise implies this from the containing array. */\r\n stageType = -1;\r\n\r\n /** m_exists (bool) */\r\n exists = false;\r\n\r\n /** resources (Tr2EffectResourceMap) */\r\n resources = new Map();\r\n\r\n /** uavs (Tr2EffectResourceMap) */\r\n uavs = new Map();\r\n\r\n /** samplers (Tr2SamplerSetupMap) */\r\n samplers = new Map();\r\n\r\n /** m_shader (unsigned) */\r\n shader = 0xffffffff;\r\n\r\n /** constants (Tr2EffectConstantVector) */\r\n constants = [];\r\n\r\n /** m_constantValueSize (unsigned) */\r\n constantValueSize = 0;\r\n\r\n /** constantValues (char[SHADER_CONSTANTS_MAX]) */\r\n constantValues = new Uint8Array(0);\r\n\r\n /** signature (Tr2ShaderSignatureAL) */\r\n signature = null;\r\n\r\n /** annotation (Tr2EffectParameterAnnotationMap) */\r\n annotation = [];\r\n\r\n /** Exact source program metadata and owned bytes, before backend realization. */\r\n sourceProgram = null;\r\n\r\n // Ported from CarbonEngine (MIT, (c) 2026 CCP Games) - https://github.com/carbonengine/trinity\r\n // trinity/Shader/Tr2Effect.cpp:1799-1821 (the sizing loop and its assertion)\r\n //\r\n // Carbon's comment at the site is the whole rule: \"Figure out how large the\r\n // constant buffer has to be. This has to be done even if the constant isn't\r\n // set, as the shader may still sample it and expect to get some kind of\r\n // default (usually zero).\" So EVERY constant participates, not only the ones\r\n // an effect binds a parameter to.\r\n //\r\n // THIS IS NOT `constantValueSize`, AND THE DIFFERENCE IS EASY TO MISS.\r\n // `constantValueSize` is the length of the authored DEFAULT blob, which\r\n // Carbon separately grows to cover autoregister sampler-index constants\r\n // (Tr2EffectDescription.cpp:629-632). Carbon asserts\r\n // `constantSize >= constantDefaultValueSize` precisely because the two are\r\n // different numbers and the defaults are a PREFIX of the buffer. An effect\r\n // that authors defaults for only some of its constants makes them differ, so\r\n // using the default size as the buffer size is right until it silently is\r\n // not.\r\n //\r\n // It lives here rather than in a consumer because it is arithmetic over this\r\n // object's own constants and gives every backend the same answer. A backend\r\n // then applies its own alignment on top - WebGPU's uniform binding alignment,\r\n // std140 for a WebGL2 block - and that padding is the backend's, not this.\r\n // Decision 4 of the engine backends plan names the alternative as a defect\r\n // worth declining to inherit: Carbon replicates its draw-argument arithmetic\r\n // across ten call sites, and this would replicate the same way once a second\r\n // engine exists.\r\n\r\n /**\r\n * The byte size a constant buffer must have to hold every declared constant.\r\n *\r\n * Always at least `constantValueSize`, because the authored defaults occupy\r\n * the start of the same buffer.\r\n */\r\n GetConstantBufferSize()\r\n {\r\n let size = 0;\r\n\r\n for (const constant of this.constants)\r\n {\r\n size = Math.max(size, (constant?.offset ?? 0) + (constant?.size ?? 0));\r\n }\r\n\r\n return Math.max(size, this.constantValueSize);\r\n }\r\n\r\n /**\r\n * Construct one canonical stage input from JS/JSON model values.\r\n *\r\n * @param {object} values Canonical model values.\r\n * @param {object} options CjsModel import options.\r\n * @returns {Tr2EffectStageInput} Hydrated stage input.\r\n */\r\n static from(values = {}, options = {})\r\n {\r\n let normalized = values;\r\n const maps = new Map();\r\n for (const [ field, Constructor ] of [\r\n [ \"resources\", Tr2EffectResource ],\r\n [ \"uavs\", Tr2EffectResource ],\r\n [ \"samplers\", Tr2SamplerSetup ]\r\n ])\r\n {\r\n if (values && Object.hasOwn(values, field))\r\n {\r\n normalized = normalized === values ? { ...values } : normalized;\r\n normalized[field] = this.readCanonicalRegisterMap(\r\n values[field],\r\n Constructor,\r\n options,\r\n field\r\n );\r\n maps.set(field, normalized[field]);\r\n }\r\n }\r\n const stage = super.from(normalized, options);\r\n for (const [ field, value ] of maps)\r\n {\r\n stage[field] = value;\r\n }\r\n return stage;\r\n }\r\n\r\n /**\r\n * Hydrate one canonical stage input from a decoded Carbon binary record.\r\n *\r\n * @param {object} record Decoded Carbon stage record.\r\n * @returns {Tr2EffectStageInput} Hydrated canonical stage input.\r\n */\r\n static fromCarbonBinary(record)\r\n {\r\n if (!isPlainObject(record))\r\n {\r\n throw new TypeError(\"Carbon effect stage record must be an object\");\r\n }\r\n\r\n const input = this.fromCarbonBinaryInput(record, record.type);\r\n input.signature.pipelineInputCount = record.pipelineInputs.length;\r\n input.signature.pipelineInputs = record.pipelineInputs.map(entry => ({\r\n usage: entry.usage,\r\n registerIndex: entry.registerIndex,\r\n usageIndex: entry.usageIndex,\r\n usedMask: entry.usedMask,\r\n type: entry.type,\r\n dimension: entry.dimension\r\n }));\r\n input.signature.threadGroupSize = {\r\n x: record.threadGroupSize[0],\r\n y: record.threadGroupSize[1],\r\n z: record.threadGroupSize[2]\r\n };\r\n input.sourceProgram = {\r\n kind: \"stage\",\r\n bytes: copyBytes(recordBytes(record.shaderData)),\r\n shaderSize: record.shaderData.size,\r\n // Meaningful only at size zero, where the writer passes the word through\r\n // rather than interning. At any other size it is a live arena offset that\r\n // belongs to the container it was read from, so it is not retained.\r\n unsetOffset: unsetOffsetOf(record.shaderData)\r\n };\r\n return input;\r\n }\r\n\r\n /**\r\n * Build one stage input from a Carbon v15 `StageData` block.\r\n *\r\n * A raytracing library's global and local inputs are the same block without a\r\n * stage wrapper — no stage type, no pipeline inputs, no thread group, no\r\n * program of their own — so this is the half both callers share and\r\n * `fromCarbonBinary` is the stage-only remainder layered on top.\r\n *\r\n * Carbon writes textures, samplers and UAVs in ascending register order because\r\n * they are `std::map`s, and they are re-keyed by register here rather than by\r\n * position, so the map is authoritative and the record's order is not load\r\n * bearing.\r\n *\r\n * @param {object} record Carbon stage-data record.\r\n * @param {number} [stageType] Stage index, or -1 for a library input.\r\n * @returns {Tr2EffectStageInput} Reflected stage input.\r\n */\r\n static fromCarbonBinaryInput(record, stageType = -1)\r\n {\r\n if (!isPlainObject(record))\r\n {\r\n throw new TypeError(\"Carbon effect stage-data record must be an object\");\r\n }\r\n\r\n const constantValues = copyBytes(recordBytes(record.defaultValues));\r\n\r\n const input = new this();\r\n input.stageType = stageType;\r\n input.exists = true;\r\n input.constants = record.constants.map(\r\n entry => Tr2EffectConstant.fromCarbonBinary(entry)\r\n );\r\n input.resources = this.readCarbonBinaryResourceMap(record.textures);\r\n input.uavs = this.readCarbonBinaryResourceMap(record.uavs);\r\n input.samplers = this.readCarbonBinarySamplerMap(record.samplers);\r\n input.constantValueSize = constantValues.byteLength;\r\n input.constantValues = constantValues;\r\n input.constantValuesUnsetOffset = unsetOffsetOf(record.defaultValues);\r\n input.annotation = record.annotations.map(\r\n entry => Tr2EffectParameterAnnotation.fromCarbonBinary(entry)\r\n );\r\n input.signature = {\r\n pipelineInputCount: 0,\r\n pipelineInputs: [],\r\n registerCount: record.registers.length,\r\n // Carbon stores one field its reader calls `arrayCount` and its writer\r\n // calls `registerCount`. Both names are carried forward from the single\r\n // stored value, because the write direction refuses to emit a record whose\r\n // two names disagree.\r\n registers: record.registers.map(entry => ({\r\n registerType: entry.registerType,\r\n registerIndex: entry.registerIndex,\r\n arrayCount: entry.registerCount,\r\n registerCount: entry.registerCount,\r\n registerSpace: entry.registerSpace\r\n })),\r\n staticSamplerCount: record.staticSamplers.length,\r\n staticSamplers: record.staticSamplers.map(entry => ({\r\n registerIndex: entry.registerIndex,\r\n registerSpace: entry.registerSpace,\r\n descriptor: {\r\n comparison: !!entry.comparison,\r\n minFilter: entry.minFilter,\r\n magFilter: entry.magFilter,\r\n mipFilter: entry.mipFilter,\r\n addressU: entry.addressU,\r\n addressV: entry.addressV,\r\n addressW: entry.addressW,\r\n mipLODBiasRaw: recordRawBits(entry.mipLODBias),\r\n maxAnisotropy: entry.maxAnisotropy,\r\n comparisonFunc: entry.comparisonFunc,\r\n // A static sampler's border colour is a one-byte enum, not four\r\n // floats. Sharing the dynamic sampler's mapping here would silently\r\n // reinterpret it.\r\n borderColor: entry.borderColor,\r\n minLODRaw: recordRawBits(entry.minLOD),\r\n maxLODRaw: recordRawBits(entry.maxLOD)\r\n }\r\n })),\r\n threadGroupSize: { x: 0, y: 0, z: 0 }\r\n };\r\n input.sourceProgram = null;\r\n return input;\r\n }\r\n\r\n /**\r\n * Emit this stage as a Carbon v15 stage record.\r\n *\r\n * @returns {object} Carbon stage record.\r\n */\r\n toCarbonBinary()\r\n {\r\n const signature = this.signature ?? {};\r\n const program = this.sourceProgram ?? {};\r\n return {\r\n type: this.stageType,\r\n shaderData: toRecordBlob(\r\n program.bytes,\r\n program.shaderSize,\r\n program.unsetOffset\r\n ),\r\n threadGroupSize: [\r\n signature.threadGroupSize?.x ?? 0,\r\n signature.threadGroupSize?.y ?? 0,\r\n signature.threadGroupSize?.z ?? 0\r\n ],\r\n pipelineInputs: (signature.pipelineInputs ?? []).map(entry => ({\r\n usage: entry.usage,\r\n registerIndex: entry.registerIndex,\r\n usageIndex: entry.usageIndex,\r\n usedMask: entry.usedMask,\r\n type: entry.type,\r\n dimension: entry.dimension\r\n })),\r\n ...this.toCarbonBinaryInput()\r\n };\r\n }\r\n\r\n /**\r\n * Emit this input as a Carbon v15 `StageData` block.\r\n *\r\n * Carbon holds textures, samplers, UAVs and render states in `std::map`s and\r\n * writes them in key order, and it sorts annotation names by `strcmp` before\r\n * writing. Our maps are keyed but not ordered, so every collection is sorted\r\n * explicitly here rather than trusting insertion order — the reader is\r\n * indifferent, but the bytes are not, and a container that disagrees with\r\n * Carbon's ordering is not the file Carbon would have written.\r\n *\r\n * @returns {object} Carbon stage-data record.\r\n */\r\n toCarbonBinaryInput()\r\n {\r\n const byRegister = (left, right) => left.registerIndex - right.registerIndex;\r\n const signature = this.signature ?? {};\r\n return {\r\n registers: (signature.registers ?? []).map(entry => ({\r\n registerType: entry.registerType,\r\n registerIndex: entry.registerIndex,\r\n registerCount: entry.registerCount,\r\n registerSpace: entry.registerSpace\r\n })),\r\n staticSamplers: (signature.staticSamplers ?? []).map(entry =>\r\n {\r\n const descriptor = entry.descriptor ?? {};\r\n return {\r\n registerIndex: entry.registerIndex,\r\n registerSpace: entry.registerSpace,\r\n comparison: descriptor.comparison ? 1 : 0,\r\n minFilter: descriptor.minFilter,\r\n magFilter: descriptor.magFilter,\r\n mipFilter: descriptor.mipFilter,\r\n addressU: descriptor.addressU,\r\n addressV: descriptor.addressV,\r\n addressW: descriptor.addressW,\r\n mipLODBias: toRecordFloat(descriptor.mipLODBiasRaw),\r\n maxAnisotropy: descriptor.maxAnisotropy,\r\n comparisonFunc: descriptor.comparisonFunc,\r\n // One byte here, four floats on a dynamic sampler.\r\n borderColor: descriptor.borderColor,\r\n minLOD: toRecordFloat(descriptor.minLODRaw),\r\n maxLOD: toRecordFloat(descriptor.maxLODRaw)\r\n };\r\n }),\r\n constants: this.constants.map(constant => constant.toCarbonBinary()),\r\n defaultValues: toRecordBlob(\r\n this.constantValues,\r\n this.constantValueSize,\r\n this.constantValuesUnsetOffset\r\n ),\r\n textures: Array.from(this.resources, ([ register, resource ]) =>\r\n resource.toCarbonBinary(register)).sort(byRegister),\r\n samplers: Array.from(this.samplers, ([ register, sampler ]) =>\r\n sampler.toCarbonBinary(register)).sort(byRegister),\r\n uavs: Array.from(this.uavs, ([ register, uav ]) =>\r\n uav.toCarbonBinary(register, true)).sort(byRegister),\r\n annotations: this.annotation\r\n .map(entry => entry.toCarbonBinary())\r\n .sort((left, right) => compareUtf8(left.name.value, right.name.value))\r\n };\r\n }\r\n\r\n /** Build one register-indexed resource map from Carbon texture or UAV records. */\r\n static readCarbonBinaryResourceMap(records)\r\n {\r\n const result = new Map();\r\n for (const record of records)\r\n {\r\n if (result.has(record.registerIndex))\r\n {\r\n throw new Error(\r\n `Carbon effect resource register ${record.registerIndex} is duplicated`\r\n );\r\n }\r\n result.set(\r\n record.registerIndex,\r\n Tr2EffectResource.fromCarbonBinary(record)\r\n );\r\n }\r\n return result;\r\n }\r\n\r\n /** Build one register-indexed sampler map from Carbon sampler records. */\r\n static readCarbonBinarySamplerMap(records)\r\n {\r\n const result = new Map();\r\n for (const record of records)\r\n {\r\n if (result.has(record.registerIndex))\r\n {\r\n throw new Error(\r\n `Carbon effect sampler register ${record.registerIndex} is duplicated`\r\n );\r\n }\r\n result.set(\r\n record.registerIndex,\r\n Tr2SamplerSetup.fromCarbonBinary(record)\r\n );\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Create one explicit absent stage slot.\r\n *\r\n * @param {number} stageType Stage index.\r\n * @returns {Tr2EffectStageInput} Empty stage input.\r\n */\r\n static createEmpty(stageType)\r\n {\r\n const stage = new this();\r\n stage.stageType = requireShaderStageType(stageType);\r\n return stage;\r\n }\r\n\r\n /**\r\n * Normalize one register-indexed collection into its canonical typed map.\r\n *\r\n * @param {Map|object} values Register-indexed source values.\r\n * @param {Function} Constructor Entry constructor exposing `from`.\r\n * @param {object} options Hydration options passed to entry construction.\r\n * @param {string} field Diagnostic field name.\r\n * @returns {Map<number, *>} Canonical register map.\r\n */\r\n static readCanonicalRegisterMap(values, Constructor, options, field)\r\n {\r\n const entries = values instanceof Map\r\n ? values\r\n : Object.entries(values ?? {});\r\n const result = new Map();\r\n for (const [ key, value ] of entries)\r\n {\r\n const registerIndex = Number(key);\r\n if (!isUint32(registerIndex))\r\n {\r\n throw new RangeError(\r\n `Effect ${field} register index must fit uint32`\r\n );\r\n }\r\n if (result.has(registerIndex))\r\n {\r\n throw new Error(\r\n `Effect ${field} register ${registerIndex} is duplicated`\r\n );\r\n }\r\n result.set(\r\n registerIndex,\r\n value instanceof Constructor\r\n ? value\r\n : Constructor.from(value, options)\r\n );\r\n }\r\n return result;\r\n }\r\n\r\n}\r\n\r\n// Declared imperatively rather than with decorators, so this module stays\r\n// plain ESM that loads from source without a transform. The decorator\r\n// expressions are reused verbatim, so the registered metadata is identical.\r\n// Statics belong in `methods`: decorateMethod targets the prototype and\r\n// would register a static as an instance field.\r\nCjsSchema.define(Tr2EffectStageInput, {\r\n className: \"Tr2EffectStageInput\",\r\n family: \"shader\",\r\n fields: {\r\n stageType: [ impl.adapted, impl.reason(\"The source format identifies stage inputs by array index; the device-free graph retains the index explicitly for serialization and engine adapters.\"), type.int32 ],\r\n exists: type.boolean,\r\n resources: type.map(\"Tr2EffectResource\"),\r\n uavs: type.map(\"Tr2EffectResource\"),\r\n samplers: type.map(\"Tr2SamplerSetup\"),\r\n shader: type.uint32,\r\n constants: type.list(\"Tr2EffectConstant\"),\r\n constantValueSize: type.uint32,\r\n constantValues: type.typedArray(\"Uint8Array\"),\r\n constantValuesUnsetOffset: [ impl.custom, impl.reason(\"A zero-size blob's offset word is passed through rather than interned, and the shipped corpus does not always set it to the null sentinel; the graph retains it so a body re-emits as the file that produced it.\"), type.uint32 ],\r\n signature: type.rawStruct(\"Tr2ShaderSignatureAL\"),\r\n annotation: type.list(\"Tr2EffectParameterAnnotation\"),\r\n sourceProgram: [ impl.adapted, impl.reason(\"Carbon replaces source program data with renderer handles while reading; the device-free resource graph must retain the portable source program for later engine realization.\"), type.rawStruct(\"CjsEffectSourceProgram\") ]\r\n }\r\n});\r\n"],"names":["unsetOffsetOf","ref","size","offset","Tr2EffectStageInput","CjsModel","stageType","exists","resources","Map","uavs","samplers","shader","constants","constantValueSize","constantValues","Uint8Array","signature","annotation","sourceProgram","GetConstantBufferSize","constant","Math","max","from","values","options","normalized","maps","field","Constructor","Tr2EffectResource","Tr2SamplerSetup","Object","hasOwn","readCanonicalRegisterMap","set","stage","value","fromCarbonBinary","record","isPlainObject","TypeError","input","fromCarbonBinaryInput","type","pipelineInputCount","pipelineInputs","length","map","entry","usage","registerIndex","usageIndex","usedMask","dimension","threadGroupSize","x","y","z","kind","bytes","copyBytes","recordBytes","shaderData","shaderSize","unsetOffset","defaultValues","Tr2EffectConstant","readCarbonBinaryResourceMap","textures","readCarbonBinarySamplerMap","byteLength","constantValuesUnsetOffset","annotations","Tr2EffectParameterAnnotation","registerCount","registers","registerType","arrayCount","registerSpace","staticSamplerCount","staticSamplers","descriptor","comparison","minFilter","magFilter","mipFilter","addressU","addressV","addressW","mipLODBiasRaw","recordRawBits","mipLODBias","maxAnisotropy","comparisonFunc","borderColor","minLODRaw","minLOD","maxLODRaw","maxLOD","toCarbonBinary","program","toRecordBlob","toCarbonBinaryInput","byRegister","left","right","toRecordFloat","Array","register","resource","sort","sampler","uav","compareUtf8","name","records","result","has","Error","createEmpty","requireShaderStageType","entries","key","Number","isUint32","RangeError","CjsSchema","define","className","family","fields","impl","adapted","reason","int32","boolean","uint32","list","typedArray","custom","rawStruct"],"mappings":"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"}
1
+ {"version":3,"file":"Tr2EffectStageInput.js","sources":["../../../../../src/resource/shader/reflection/Tr2EffectStageInput.js"],"sourcesContent":["// Source: trinity/trinity/Shader/Tr2EffectDescription.h\r\n// Source: trinity/trinity/Shader/Tr2EffectDescription.cpp\r\nimport { CjsSchema, impl, type } from \"@carbonenginejs/runtime-utils/schema\";\r\nimport { CjsModel } from \"@carbonenginejs/runtime-utils/model\";\r\nimport { copyBytes } from \"@carbonenginejs/runtime-utils/bytes\";\r\nimport {\r\n isPlainObject,\r\n isUint32\r\n} from \"@carbonenginejs/runtime-utils/is\";\r\nimport { Tr2SamplerSetup } from \"../sampler/Tr2SamplerSetup.js\";\r\nimport { Tr2EffectConstant } from \"./Tr2EffectConstant.js\";\r\nimport { Tr2EffectParameterAnnotation } from \"./Tr2EffectParameterAnnotation.js\";\r\nimport { Tr2EffectResource } from \"./Tr2EffectResource.js\";\r\nimport {\r\n recordBytes,\r\n recordRawBits,\r\n toRecordBlob,\r\n toRecordFloat,\r\n toRecordText\r\n} from \"./carbonRecordFields.js\";\r\nimport { compareUtf8 } from \"../../../format/compareUtf8.js\";\r\nimport { requireShaderStageType } from \"./shaderStage.js\";\r\n\r\n/**\r\n * The offset word a zero-size blob carries, or the null sentinel.\r\n *\r\n * @param {{size:number,offset:number}} ref Blob reference.\r\n * @returns {number} Offset word worth retaining.\r\n */\r\nfunction unsetOffsetOf(ref)\r\n{\r\n return ref.size === 0 ? ref.offset : 0xffffffff;\r\n}\r\n\r\n/** Complete device-free reflection for one shader stage input. */\r\nexport class Tr2EffectStageInput extends CjsModel\r\n{\r\n\r\n /** Portable stage index; Carbon otherwise implies this from the containing array. */\r\n stageType = -1;\r\n\r\n /** m_exists (bool) */\r\n exists = false;\r\n\r\n /** resources (Tr2EffectResourceMap) */\r\n resources = new Map();\r\n\r\n /** uavs (Tr2EffectResourceMap) */\r\n uavs = new Map();\r\n\r\n /** samplers (Tr2SamplerSetupMap) */\r\n samplers = new Map();\r\n\r\n /** m_shader (unsigned) */\r\n shader = 0xffffffff;\r\n\r\n /** constants (Tr2EffectConstantVector) */\r\n constants = [];\r\n\r\n /** m_constantValueSize (unsigned) */\r\n constantValueSize = 0;\r\n\r\n /** constantValues (char[SHADER_CONSTANTS_MAX]) */\r\n constantValues = new Uint8Array(0);\r\n\r\n /** signature (Tr2ShaderSignatureAL) */\r\n signature = null;\r\n\r\n /** annotation (Tr2EffectParameterAnnotationMap) */\r\n annotation = [];\r\n\r\n /** Exact source program metadata and owned bytes, before backend realization. */\r\n sourceProgram = null;\r\n\r\n // Ported from CarbonEngine (MIT, (c) 2026 CCP Games) - https://github.com/carbonengine/trinity\r\n // trinity/Shader/Tr2Effect.cpp:1799-1821 (the sizing loop and its assertion)\r\n //\r\n // Carbon's comment at the site is the whole rule: \"Figure out how large the\r\n // constant buffer has to be. This has to be done even if the constant isn't\r\n // set, as the shader may still sample it and expect to get some kind of\r\n // default (usually zero).\" So EVERY constant participates, not only the ones\r\n // an effect binds a parameter to.\r\n //\r\n // THIS IS NOT `constantValueSize`, AND THE DIFFERENCE IS EASY TO MISS.\r\n // `constantValueSize` is the length of the authored DEFAULT blob, which\r\n // Carbon separately grows to cover autoregister sampler-index constants\r\n // (Tr2EffectDescription.cpp:629-632). Carbon asserts\r\n // `constantSize >= constantDefaultValueSize` precisely because the two are\r\n // different numbers and the defaults are a PREFIX of the buffer. An effect\r\n // that authors defaults for only some of its constants makes them differ, so\r\n // using the default size as the buffer size is right until it silently is\r\n // not.\r\n //\r\n // It lives here rather than in a consumer because it is arithmetic over this\r\n // object's own constants and gives every backend the same answer. A backend\r\n // then applies its own alignment on top - WebGPU's uniform binding alignment,\r\n // std140 for a WebGL2 block - and that padding is the backend's, not this.\r\n // Decision 4 of the engine backends plan names the alternative as a defect\r\n // worth declining to inherit: Carbon replicates its draw-argument arithmetic\r\n // across ten call sites, and this would replicate the same way once a second\r\n // engine exists.\r\n\r\n /**\r\n * The byte size a constant buffer must have to hold every declared constant.\r\n *\r\n * Always at least `constantValueSize`, because the authored defaults occupy\r\n * the start of the same buffer.\r\n */\r\n GetConstantBufferSize()\r\n {\r\n let size = 0;\r\n\r\n for (const constant of this.constants)\r\n {\r\n size = Math.max(size, (constant?.offset ?? 0) + (constant?.size ?? 0));\r\n }\r\n\r\n return Math.max(size, this.constantValueSize);\r\n }\r\n\r\n /**\r\n * Construct one canonical stage input from JS/JSON model values.\r\n *\r\n * @param {object} values Canonical model values.\r\n * @param {object} options CjsModel import options.\r\n * @returns {Tr2EffectStageInput} Hydrated stage input.\r\n */\r\n static from(values = {}, options = {})\r\n {\r\n let normalized = values;\r\n const maps = new Map();\r\n for (const [ field, Constructor ] of [\r\n [ \"resources\", Tr2EffectResource ],\r\n [ \"uavs\", Tr2EffectResource ],\r\n [ \"samplers\", Tr2SamplerSetup ]\r\n ])\r\n {\r\n if (values && Object.hasOwn(values, field))\r\n {\r\n normalized = normalized === values ? { ...values } : normalized;\r\n normalized[field] = this.readCanonicalRegisterMap(\r\n values[field],\r\n Constructor,\r\n options,\r\n field\r\n );\r\n maps.set(field, normalized[field]);\r\n }\r\n }\r\n const stage = super.from(normalized, options);\r\n for (const [ field, value ] of maps)\r\n {\r\n stage[field] = value;\r\n }\r\n return stage;\r\n }\r\n\r\n /**\r\n * Hydrate one canonical stage input from a decoded Carbon binary record.\r\n *\r\n * @param {object} record Decoded Carbon stage record.\r\n * @returns {Tr2EffectStageInput} Hydrated canonical stage input.\r\n */\r\n static fromCarbonBinary(record)\r\n {\r\n if (!isPlainObject(record))\r\n {\r\n throw new TypeError(\"Carbon effect stage record must be an object\");\r\n }\r\n\r\n const input = this.fromCarbonBinaryInput(record, record.type);\r\n input.signature.pipelineInputCount = record.pipelineInputs.length;\r\n input.signature.pipelineInputs = record.pipelineInputs.map(entry => ({\r\n usage: entry.usage,\r\n registerIndex: entry.registerIndex,\r\n usageIndex: entry.usageIndex,\r\n usedMask: entry.usedMask,\r\n type: entry.type,\r\n dimension: entry.dimension\r\n }));\r\n input.signature.threadGroupSize = {\r\n x: record.threadGroupSize[0],\r\n y: record.threadGroupSize[1],\r\n z: record.threadGroupSize[2]\r\n };\r\n input.sourceProgram = {\r\n kind: \"stage\",\r\n bytes: copyBytes(recordBytes(record.shaderData)),\r\n shaderSize: record.shaderData.size,\r\n // Meaningful only at size zero, where the writer passes the word through\r\n // rather than interning. At any other size it is a live arena offset that\r\n // belongs to the container it was read from, so it is not retained.\r\n unsetOffset: unsetOffsetOf(record.shaderData)\r\n };\r\n return input;\r\n }\r\n\r\n /**\r\n * Build one stage input from a Carbon v15 `StageData` block.\r\n *\r\n * A raytracing library's global and local inputs are the same block without a\r\n * stage wrapper — no stage type, no pipeline inputs, no thread group, no\r\n * program of their own — so this is the half both callers share and\r\n * `fromCarbonBinary` is the stage-only remainder layered on top.\r\n *\r\n * Carbon writes textures, samplers and UAVs in ascending register order because\r\n * they are `std::map`s, and they are re-keyed by register here rather than by\r\n * position, so the map is authoritative and the record's order is not load\r\n * bearing.\r\n *\r\n * @param {object} record Carbon stage-data record.\r\n * @param {number} [stageType] Stage index, or -1 for a library input.\r\n * @returns {Tr2EffectStageInput} Reflected stage input.\r\n */\r\n static fromCarbonBinaryInput(record, stageType = -1)\r\n {\r\n if (!isPlainObject(record))\r\n {\r\n throw new TypeError(\"Carbon effect stage-data record must be an object\");\r\n }\r\n\r\n const constantValues = copyBytes(recordBytes(record.defaultValues));\r\n\r\n const input = new this();\r\n input.stageType = stageType;\r\n input.exists = true;\r\n input.constants = record.constants.map(\r\n entry => Tr2EffectConstant.fromCarbonBinary(entry)\r\n );\r\n input.resources = this.readCarbonBinaryResourceMap(record.textures);\r\n input.uavs = this.readCarbonBinaryResourceMap(record.uavs);\r\n input.samplers = this.readCarbonBinarySamplerMap(record.samplers);\r\n input.constantValueSize = constantValues.byteLength;\r\n input.constantValues = constantValues;\r\n input.constantValuesUnsetOffset = unsetOffsetOf(record.defaultValues);\r\n input.annotation = record.annotations.map(\r\n entry => Tr2EffectParameterAnnotation.fromCarbonBinary(entry)\r\n );\r\n input.signature = {\r\n pipelineInputCount: 0,\r\n pipelineInputs: [],\r\n registerCount: record.registers.length,\r\n // Carbon stores one field its reader calls `arrayCount` and its writer\r\n // calls `registerCount`. Both names are carried forward from the single\r\n // stored value, because the write direction refuses to emit a record whose\r\n // two names disagree.\r\n registers: record.registers.map(entry => ({\r\n registerType: entry.registerType,\r\n registerIndex: entry.registerIndex,\r\n arrayCount: entry.registerCount,\r\n registerCount: entry.registerCount,\r\n registerSpace: entry.registerSpace\r\n })),\r\n staticSamplerCount: record.staticSamplers.length,\r\n staticSamplers: record.staticSamplers.map(entry => ({\r\n registerIndex: entry.registerIndex,\r\n registerSpace: entry.registerSpace,\r\n descriptor: {\r\n // Carried so a consumer can answer \"may this sampler be overridden?\"\r\n // without inferring it. Carbon's compiler only makes a static sampler\r\n // out of a non-dynamic one -- `ConvertToStaticSampler` opens\r\n // `if( sampler.isDynamic ) { return false; }`\r\n // (shadercompiler/FXAnalyzer.cpp:1727-1731) -- so `false` is\r\n // guaranteed, not assumed, and there is no wire field to read.\r\n //\r\n // The flag is an authorisation, not decoration: dynamic means the\r\n // sampler may be overridden, non-dynamic means it must not be\r\n // touched. A reader that treats an absent flag as dynamic, which is\r\n // Carbon's default for the stage sampler that does carry one, would\r\n // offer an override on a sampler Carbon forbids overriding. Omitting\r\n // it therefore fails in the permissive direction.\r\n isDynamic: false,\r\n comparison: !!entry.comparison,\r\n minFilter: entry.minFilter,\r\n magFilter: entry.magFilter,\r\n mipFilter: entry.mipFilter,\r\n addressU: entry.addressU,\r\n addressV: entry.addressV,\r\n addressW: entry.addressW,\r\n mipLODBiasRaw: recordRawBits(entry.mipLODBias),\r\n maxAnisotropy: entry.maxAnisotropy,\r\n comparisonFunc: entry.comparisonFunc,\r\n // A static sampler's border colour is a one-byte enum, not four\r\n // floats. Sharing the dynamic sampler's mapping here would silently\r\n // reinterpret it.\r\n borderColor: entry.borderColor,\r\n minLODRaw: recordRawBits(entry.minLOD),\r\n maxLODRaw: recordRawBits(entry.maxLOD)\r\n }\r\n })),\r\n threadGroupSize: { x: 0, y: 0, z: 0 }\r\n };\r\n input.sourceProgram = null;\r\n return input;\r\n }\r\n\r\n /**\r\n * Emit this stage as a Carbon v15 stage record.\r\n *\r\n * @returns {object} Carbon stage record.\r\n */\r\n toCarbonBinary()\r\n {\r\n const signature = this.signature ?? {};\r\n const program = this.sourceProgram ?? {};\r\n return {\r\n type: this.stageType,\r\n shaderData: toRecordBlob(\r\n program.bytes,\r\n program.shaderSize,\r\n program.unsetOffset\r\n ),\r\n threadGroupSize: [\r\n signature.threadGroupSize?.x ?? 0,\r\n signature.threadGroupSize?.y ?? 0,\r\n signature.threadGroupSize?.z ?? 0\r\n ],\r\n pipelineInputs: (signature.pipelineInputs ?? []).map(entry => ({\r\n usage: entry.usage,\r\n registerIndex: entry.registerIndex,\r\n usageIndex: entry.usageIndex,\r\n usedMask: entry.usedMask,\r\n type: entry.type,\r\n dimension: entry.dimension\r\n })),\r\n ...this.toCarbonBinaryInput()\r\n };\r\n }\r\n\r\n /**\r\n * Emit this input as a Carbon v15 `StageData` block.\r\n *\r\n * Carbon holds textures, samplers, UAVs and render states in `std::map`s and\r\n * writes them in key order, and it sorts annotation names by `strcmp` before\r\n * writing. Our maps are keyed but not ordered, so every collection is sorted\r\n * explicitly here rather than trusting insertion order — the reader is\r\n * indifferent, but the bytes are not, and a container that disagrees with\r\n * Carbon's ordering is not the file Carbon would have written.\r\n *\r\n * @returns {object} Carbon stage-data record.\r\n */\r\n toCarbonBinaryInput()\r\n {\r\n const byRegister = (left, right) => left.registerIndex - right.registerIndex;\r\n const signature = this.signature ?? {};\r\n return {\r\n registers: (signature.registers ?? []).map(entry => ({\r\n registerType: entry.registerType,\r\n registerIndex: entry.registerIndex,\r\n registerCount: entry.registerCount,\r\n registerSpace: entry.registerSpace\r\n })),\r\n staticSamplers: (signature.staticSamplers ?? []).map(entry =>\r\n {\r\n const descriptor = entry.descriptor ?? {};\r\n return {\r\n registerIndex: entry.registerIndex,\r\n registerSpace: entry.registerSpace,\r\n comparison: descriptor.comparison ? 1 : 0,\r\n minFilter: descriptor.minFilter,\r\n magFilter: descriptor.magFilter,\r\n mipFilter: descriptor.mipFilter,\r\n addressU: descriptor.addressU,\r\n addressV: descriptor.addressV,\r\n addressW: descriptor.addressW,\r\n mipLODBias: toRecordFloat(descriptor.mipLODBiasRaw),\r\n maxAnisotropy: descriptor.maxAnisotropy,\r\n comparisonFunc: descriptor.comparisonFunc,\r\n // One byte here, four floats on a dynamic sampler.\r\n borderColor: descriptor.borderColor,\r\n minLOD: toRecordFloat(descriptor.minLODRaw),\r\n maxLOD: toRecordFloat(descriptor.maxLODRaw)\r\n };\r\n }),\r\n constants: this.constants.map(constant => constant.toCarbonBinary()),\r\n defaultValues: toRecordBlob(\r\n this.constantValues,\r\n this.constantValueSize,\r\n this.constantValuesUnsetOffset\r\n ),\r\n textures: Array.from(this.resources, ([ register, resource ]) =>\r\n resource.toCarbonBinary(register)).sort(byRegister),\r\n samplers: Array.from(this.samplers, ([ register, sampler ]) =>\r\n sampler.toCarbonBinary(register)).sort(byRegister),\r\n uavs: Array.from(this.uavs, ([ register, uav ]) =>\r\n uav.toCarbonBinary(register, true)).sort(byRegister),\r\n annotations: this.annotation\r\n .map(entry => entry.toCarbonBinary())\r\n .sort((left, right) => compareUtf8(left.name.value, right.name.value))\r\n };\r\n }\r\n\r\n /** Build one register-indexed resource map from Carbon texture or UAV records. */\r\n static readCarbonBinaryResourceMap(records)\r\n {\r\n const result = new Map();\r\n for (const record of records)\r\n {\r\n if (result.has(record.registerIndex))\r\n {\r\n throw new Error(\r\n `Carbon effect resource register ${record.registerIndex} is duplicated`\r\n );\r\n }\r\n result.set(\r\n record.registerIndex,\r\n Tr2EffectResource.fromCarbonBinary(record)\r\n );\r\n }\r\n return result;\r\n }\r\n\r\n /** Build one register-indexed sampler map from Carbon sampler records. */\r\n static readCarbonBinarySamplerMap(records)\r\n {\r\n const result = new Map();\r\n for (const record of records)\r\n {\r\n if (result.has(record.registerIndex))\r\n {\r\n throw new Error(\r\n `Carbon effect sampler register ${record.registerIndex} is duplicated`\r\n );\r\n }\r\n result.set(\r\n record.registerIndex,\r\n Tr2SamplerSetup.fromCarbonBinary(record)\r\n );\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Create one explicit absent stage slot.\r\n *\r\n * @param {number} stageType Stage index.\r\n * @returns {Tr2EffectStageInput} Empty stage input.\r\n */\r\n static createEmpty(stageType)\r\n {\r\n const stage = new this();\r\n stage.stageType = requireShaderStageType(stageType);\r\n return stage;\r\n }\r\n\r\n /**\r\n * Normalize one register-indexed collection into its canonical typed map.\r\n *\r\n * @param {Map|object} values Register-indexed source values.\r\n * @param {Function} Constructor Entry constructor exposing `from`.\r\n * @param {object} options Hydration options passed to entry construction.\r\n * @param {string} field Diagnostic field name.\r\n * @returns {Map<number, *>} Canonical register map.\r\n */\r\n static readCanonicalRegisterMap(values, Constructor, options, field)\r\n {\r\n const entries = values instanceof Map\r\n ? values\r\n : Object.entries(values ?? {});\r\n const result = new Map();\r\n for (const [ key, value ] of entries)\r\n {\r\n const registerIndex = Number(key);\r\n if (!isUint32(registerIndex))\r\n {\r\n throw new RangeError(\r\n `Effect ${field} register index must fit uint32`\r\n );\r\n }\r\n if (result.has(registerIndex))\r\n {\r\n throw new Error(\r\n `Effect ${field} register ${registerIndex} is duplicated`\r\n );\r\n }\r\n result.set(\r\n registerIndex,\r\n value instanceof Constructor\r\n ? value\r\n : Constructor.from(value, options)\r\n );\r\n }\r\n return result;\r\n }\r\n\r\n}\r\n\r\n// Declared imperatively rather than with decorators, so this module stays\r\n// plain ESM that loads from source without a transform. The decorator\r\n// expressions are reused verbatim, so the registered metadata is identical.\r\n// Statics belong in `methods`: decorateMethod targets the prototype and\r\n// would register a static as an instance field.\r\nCjsSchema.define(Tr2EffectStageInput, {\r\n className: \"Tr2EffectStageInput\",\r\n family: \"shader\",\r\n fields: {\r\n stageType: [ impl.adapted, impl.reason(\"The source format identifies stage inputs by array index; the device-free graph retains the index explicitly for serialization and engine adapters.\"), type.int32 ],\r\n exists: type.boolean,\r\n resources: type.map(\"Tr2EffectResource\"),\r\n uavs: type.map(\"Tr2EffectResource\"),\r\n samplers: type.map(\"Tr2SamplerSetup\"),\r\n shader: type.uint32,\r\n constants: type.list(\"Tr2EffectConstant\"),\r\n constantValueSize: type.uint32,\r\n constantValues: type.typedArray(\"Uint8Array\"),\r\n constantValuesUnsetOffset: [ impl.custom, impl.reason(\"A zero-size blob's offset word is passed through rather than interned, and the shipped corpus does not always set it to the null sentinel; the graph retains it so a body re-emits as the file that produced it.\"), type.uint32 ],\r\n signature: type.rawStruct(\"Tr2ShaderSignatureAL\"),\r\n annotation: type.list(\"Tr2EffectParameterAnnotation\"),\r\n sourceProgram: [ impl.adapted, impl.reason(\"Carbon replaces source program data with renderer handles while reading; the device-free resource graph must retain the portable source program for later engine realization.\"), type.rawStruct(\"CjsEffectSourceProgram\") ]\r\n }\r\n});\r\n"],"names":["unsetOffsetOf","ref","size","offset","Tr2EffectStageInput","CjsModel","stageType","exists","resources","Map","uavs","samplers","shader","constants","constantValueSize","constantValues","Uint8Array","signature","annotation","sourceProgram","GetConstantBufferSize","constant","Math","max","from","values","options","normalized","maps","field","Constructor","Tr2EffectResource","Tr2SamplerSetup","Object","hasOwn","readCanonicalRegisterMap","set","stage","value","fromCarbonBinary","record","isPlainObject","TypeError","input","fromCarbonBinaryInput","type","pipelineInputCount","pipelineInputs","length","map","entry","usage","registerIndex","usageIndex","usedMask","dimension","threadGroupSize","x","y","z","kind","bytes","copyBytes","recordBytes","shaderData","shaderSize","unsetOffset","defaultValues","Tr2EffectConstant","readCarbonBinaryResourceMap","textures","readCarbonBinarySamplerMap","byteLength","constantValuesUnsetOffset","annotations","Tr2EffectParameterAnnotation","registerCount","registers","registerType","arrayCount","registerSpace","staticSamplerCount","staticSamplers","descriptor","isDynamic","comparison","minFilter","magFilter","mipFilter","addressU","addressV","addressW","mipLODBiasRaw","recordRawBits","mipLODBias","maxAnisotropy","comparisonFunc","borderColor","minLODRaw","minLOD","maxLODRaw","maxLOD","toCarbonBinary","program","toRecordBlob","toCarbonBinaryInput","byRegister","left","right","toRecordFloat","Array","register","resource","sort","sampler","uav","compareUtf8","name","records","result","has","Error","createEmpty","requireShaderStageType","entries","key","Number","isUint32","RangeError","CjsSchema","define","className","family","fields","impl","adapted","reason","int32","boolean","uint32","list","typedArray","custom","rawStruct"],"mappings":"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"}
@@ -72,7 +72,9 @@ emitted bytes, so it need not preserve the original source alias partition. `mod
72
72
  WGSL; it does not discard source permutations. `mode: "all"` attempts every
73
73
  distinct body after the resolved selection passes the initial translation gate.
74
74
 
75
- `.carbonwebgl` remains its own Carbon WebGL chunk format. Its current package contract also
75
+ `.carbonwebgl` is the **same** Carbon v15 record container as `.carbonwebgpu`,
76
+ carrying GLSL in the program slots and an optional per-pass backend block.
77
+ Neither has a private magic or chunk layout. Its package contract likewise
76
78
  preserves complete source permutation topology and supports selected versus
77
79
  all backend coverage.
78
80
 
@@ -90,6 +92,37 @@ one description record. No intermediate document sits between them.
90
92
  What remains unproven is execution, not construction. The presence of every
91
93
  permutation proves source preservation; it does not prove a rendered result.
92
94
 
95
+ ## How an option list becomes a permutation index
96
+
97
+ `Tr2EffectRes.GetShader(options, count)` resolves a caller's option list to one
98
+ exact index. The rules are not obvious and each one has a consequence:
99
+
100
+ - **Mixed radix, first axis least significant.** The index accumulates as
101
+ `index += selectedIndex * multiplier`, with `multiplier` starting at 1 and
102
+ multiplying by each axis's option count in turn. An index is therefore only
103
+ meaningful against the axis order of that exact compiled effect.
104
+ - **A global option owns its axis outright.** If a global option matches the
105
+ axis name, the caller's local options for that axis are **not consulted at
106
+ all** — not even as a fallback.
107
+ - **An invalid global keeps the default and still blocks the local.** A global
108
+ naming a value the axis does not offer leaves the axis on `defaultOption`, and
109
+ the local option that *would* have been valid is still skipped. This is the
110
+ rule that surprises people: a typo in a global option silently pins an axis to
111
+ its default rather than erroring or deferring.
112
+ - **Among locals, the last valid one wins.** The scan does not stop at the first
113
+ match, so a later duplicate overrides an earlier one.
114
+ - **An unmatched or invalid value falls back to `defaultOption`**, never to
115
+ option 0 — the default is frequently not 0.
116
+
117
+ `GetShaderByIndex` **returns `null` for an index at or beyond the variant
118
+ count**. It does not clamp and it does not fall back to body 0. A caller that
119
+ treats `null` as "use the first body" reintroduces exactly the bug the null
120
+ exists to expose.
121
+
122
+ Selecting the default is rarely what a caller wants. A compiled axis can default
123
+ to one value while real construction selects another, so a caller qualifying a
124
+ shader should name the option explicitly and record the index it resolved to.
125
+
93
126
  ## Reading the model without inventing gaps
94
127
 
95
128
  Three recurring mistakes explain most false conclusions in this area:
@@ -5,6 +5,22 @@ Scope: `@carbonenginejs/runtime-resource/formats`
5
5
  Audience: Users and integrators
6
6
  Summary: Maps every owned format subpath and records cross-format output conventions.
7
7
 
8
+ ## Formats are decorator free
9
+
10
+ A format may not use a decorator, and may not import a module that does. This
11
+ is enforced by the package linter, not left to review.
12
+
13
+ A decorated module only parses after the build transform, so a format that
14
+ touches one stops being loadable from source. Every consumer reading `src/`
15
+ directly then fails with a bare syntax error pointing at the decorator rather
16
+ than at the import that reached it, which is a long way from the mistake.
17
+
18
+ The practical consequence is that a format reports a **plain probe-shaped
19
+ object** from `isSupported()` and `resolveType()` rather than constructing a
20
+ `CjsResourceProbe`, which is decorated. `CjsResourceProbe.from()` normalizes
21
+ those payloads wherever a real probe instance is wanted. See
22
+ [format type resolution](../concepts/format-type-resolution.md).
23
+
8
24
  ## Import rule
9
25
 
10
26
  Concrete formats are never imported or registered by the package root. Each
@@ -58,6 +74,9 @@ metadata. Worker eligibility never changes the format's direct API; see
58
74
  | Python pickle (`.pickle`, protocol 0 data subset) | `CjsPickleFormat` | `@carbonenginejs/runtime-resource/formats/pickle` |
59
75
  | PNG (`.png`) | `CjsPngFormat` | `@carbonenginejs/runtime-resource/formats/png` |
60
76
  | Red (`.red`) | `CjsRedFormat` | `@carbonenginejs/runtime-resource/formats/red` |
77
+ | Schema-bound containers (layout in a sibling schema) | `CjsSchemaBoundFormat` | `@carbonenginejs/runtime-resource/formats/schemabound` |
78
+ | SQLite 3 (`.sqlite`/`.db`) | `CjsSqliteFormat` | `@carbonenginejs/runtime-resource/formats/sqlite` |
79
+ | Client static data (`.static`, identification) | `CjsStaticFormat` | `@carbonenginejs/runtime-resource/formats/static` |
61
80
  | STL (`.stl`) | `CjsStlFormat` | `@carbonenginejs/runtime-resource/formats/stl` |
62
81
  | TGA (`.tga`) | `CjsTgaFormat` | `@carbonenginejs/runtime-resource/formats/tga` |
63
82
  | WAV (`.wav`) | `CjsWavFormat` | `@carbonenginejs/runtime-resource/formats/wav` |
@@ -68,6 +87,8 @@ metadata. Worker eligibility never changes the format's direct API; see
68
87
 
69
88
  Detailed pages: [Granny GR2 and GSF](gr2.md),
70
89
  [data-only pickle protocol 0](pickle.md),
90
+ [client `.static` container identification](static.md),
91
+ [schema-bound containers](schemabound.md),
71
92
  [Wwise soundbanks and media](wwise.md), and [STL export](stl.md). Ownership
72
93
  history, retained snapshots, and donor licensing are recorded in
73
94
  [provenance.md](provenance.md).
@@ -68,25 +68,40 @@ handles the rest. What emerges carries no version, so consumers above that
68
68
  boundary are version-free. A port that preserves the same separation stays
69
69
  consistent with Carbon.
70
70
 
71
- ### What this reader does: constant-folded to 15
72
-
73
- `readEffectDescription` takes no version parameter. This reader is
74
- constant-folded to version 15 and rejects everything else outright.
75
-
76
- That is a deliberate narrowing, and it is the missing piece if an older version
77
- is ever needed. Supporting v8 does **not** mean writing a second reader; it
78
- means restoring the parameter Carbon always had and implementing the branches
79
- above. The writer is unaffected — reading an old version does not imply emitting
80
- one, and this package emits v15 only.
81
-
82
- Rejecting is the correct failure mode rather than a limitation to route around.
83
- Applying v15 rules to an older layout can misalign fields — the comparisons
84
- above change which fields are present and how their bytes are interpreted — and
85
- must not be attempted. How such a read would fail in practice is not documented
86
- here, because no legacy container has been examined to establish it.
71
+ ### What this reader does: reads 8 through 15, writes 15
72
+
73
+ `readEffectDescription` takes the version as an option and branches on it, the
74
+ way Carbon's own reader always did. The accepted range is
75
+ `CARBON_EFFECT_MIN_DATA_VERSION` = 8 through `CARBON_EFFECT_DATA_VERSION` = 15;
76
+ anything outside it is rejected outright.
77
+
78
+ The reader was briefly constant-folded to 15, and the branches were restored on
79
+ 2026-08-02.
80
+
81
+ Reading a version does not imply emitting it. The two ranges are independent and
82
+ deliberately so: reading a version needs a branch that interprets bytes, while
83
+ emitting one needs a branch that produces them.
84
+
85
+ **The emitted version is a parameter, not a constant.** `CjsCarbonEffectWriter`,
86
+ `writeCarbonEffectFile`, the shared container builder and both backend packagers
87
+ all take a `version` option, defaulting to the current version.
88
+ `CARBON_EFFECT_WRITE_VERSIONS` declares what the writer can actually produce —
89
+ today `[15]`, because the v15 shape is the only one we have writer branches for.
90
+ A version outside that set is **refused**, never emitted as v15 bytes under
91
+ another number, which would produce a file that lies about itself.
92
+
93
+ This is the shape that lets a future version land: add the branches, add the
94
+ entry, and every caller already passes the parameter. The source effect's
95
+ version never selects the emitted one — a package built from a v8 file is still
96
+ emitted at the version you asked for.
97
+
98
+ Rejecting outside the range is the correct failure mode rather than a limitation
99
+ to route around. Applying v15 rules to a version below 8 can misalign fields —
100
+ the comparisons above change which fields are present and how their bytes are
101
+ interpreted — and must not be attempted.
87
102
 
88
103
  The reader rejects with the version it read, and does not classify it further.
89
- A leading dword of 2..14 is a *recognized legacy version number*, not evidence
104
+ A leading dword below 8 is a *recognized legacy version number*, not evidence
90
105
  that the bytes are an effect container: arbitrary data can begin with a small
91
106
  integer, and the version dword alone carries no magic or checksum to confirm it.
92
107
  Anything that reaches this rejection needs identifying by other means before it
@@ -205,17 +220,28 @@ carries inline length-prefixed strings instead of references. A test pins the
205
220
  property directly — the block's bytes must be identical whichever arena it is
206
221
  interned into. Any future arena entry must satisfy the same rule.
207
222
 
208
- ### One field the container cannot round-trip
223
+ ### The non-dynamic sampler name is kept, though Carbon's runtime drops it
224
+
225
+ Carbon's *runtime* nulls a non-dynamic sampler's name while reading, precisely
226
+ because such a sampler is never looked up by name — `FindSamplerByName` only
227
+ matters for the dynamic case. **The file carries the string regardless, and this
228
+ reader keeps it**: `readSampler` and `writeSampler` handle `name` unconditionally,
229
+ whatever `isDynamic` says.
230
+
231
+ That is the rule, and it generalises: we re-emit the *file*, not Carbon's
232
+ in-memory view of it. Discarding what the runtime happens not to need is how a
233
+ byte-exact round trip stops being byte-exact. This field was one of **three**
234
+ such losses found together — the others being the authored stage order (21
235
+ files) and the offset word behind a zero-size blob (150 files) — and it was the
236
+ widest, affecting 1,631 files. All three are closed.
209
237
 
210
- For a **non-dynamic sampler, the name is not preserved.** The file stores one, but
211
- Carbon's reader nulls it before any producer sees it, so a package built from
212
- our reflection carries the empty string.
238
+ Each was invisible to a record-level comparison, because a record rebuilt from a
239
+ lossy class matches the lossy class it came from. Byte equality is the assertion
240
+ for that reason.
213
241
 
214
- This is a property of the input, not a bug in the mapping: the name is unrecoverable
215
- by the time we receive the data, rather than dropped on the way out. Carbon nulls it
216
- precisely because a non-dynamic sampler is never looked up by name — `FindSamplerByName`
217
- only matters for the dynamic case. Recorded here because it will otherwise be
218
- rediscovered as a bug: a diff against the source effect will always show it.
242
+ This section previously said the opposite, describing the name as unrecoverable.
243
+ It was wrong, and it is the kind of wrong that gets rediscovered as a bug in the
244
+ other direction, so it is corrected here rather than deleted.
219
245
 
220
246
  **Corollary: the container admits all six of Carbon's stage types.** `stages` is
221
247
  capped at `SHADER_TYPE_COUNT` = 6, and the stage-type byte uses Carbon's
@@ -436,7 +462,8 @@ longer part of the package.
436
462
  **Current WebGPU wire.** Carbon WebGPU bytes have no envelope, magic, `payloadKind`,
437
463
  or independent container version. They are bare Carbon v15 records resolved
438
464
  from `effect.webgpu/`, with one optional per-pass backend block. `.carbonwebgl`
439
- remains a separate Carbon WebGL chunk format rather than this Carbon-record wire.
465
+ is this same wire the same records, the same reader, GLSL in the program slots
466
+ — and not a separate chunk format.
440
467
 
441
468
  `CarbonWebgpuContainer` reads the optional blocks, and the shared record reader can
442
469
  auto-detect them from a description's declared size. There is no adapter