@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.
- package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +16 -4
- package/dist/format/carbonEffect/CjsCarbonEffectWriter.js.map +1 -1
- package/dist/format/carbonEffect/backendEngineId.js +1 -3
- package/dist/format/carbonEffect/backendEngineId.js.map +1 -1
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js +11 -1
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js +38 -1
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectRecords.js +45 -1
- package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js +120 -60
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js.map +1 -1
- package/dist/format/effect/effectPermutationGraph.js +46 -29
- package/dist/format/effect/effectPermutationGraph.js.map +1 -1
- package/dist/format/index.js +1 -1
- package/dist/formats/dds/core/helpers.js +35 -6
- package/dist/formats/dds/core/helpers.js.map +1 -1
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +53 -1
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -1
- package/dist/formats/hlsl/core/detailMapFamily.js +1 -1
- package/dist/formats/hlsl/core/detailMapFamily.js.map +1 -1
- package/dist/formats/hlsl/core/localLightFamily.js +1 -1
- package/dist/formats/hlsl/core/localLightFamily.js.map +1 -1
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +10 -1
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -1
- package/dist/formats/index.js +3 -0
- package/dist/formats/index.js.map +1 -1
- package/dist/formats/schemabound/CjsSchemaBoundFormat.js +236 -0
- package/dist/formats/schemabound/CjsSchemaBoundFormat.js.map +1 -0
- package/dist/formats/schemabound/core/schemaBoundErrors.js +9 -0
- package/dist/formats/schemabound/core/schemaBoundErrors.js.map +1 -0
- package/dist/formats/schemabound/core/schemaBoundValues.js +307 -0
- package/dist/formats/schemabound/core/schemaBoundValues.js.map +1 -0
- package/dist/formats/schemabound/index.js +2 -0
- package/dist/formats/schemabound/index.js.map +1 -0
- package/dist/formats/sqlite/CjsSqliteFormat.js +244 -0
- package/dist/formats/sqlite/CjsSqliteFormat.js.map +1 -0
- package/dist/formats/sqlite/core/sqlitePages.js +159 -0
- package/dist/formats/sqlite/core/sqlitePages.js.map +1 -0
- package/dist/formats/sqlite/core/sqliteRecords.js +174 -0
- package/dist/formats/sqlite/core/sqliteRecords.js.map +1 -0
- package/dist/formats/sqlite/core/sqliteSchema.js +100 -0
- package/dist/formats/sqlite/core/sqliteSchema.js.map +1 -0
- package/dist/formats/sqlite/index.js +2 -0
- package/dist/formats/sqlite/index.js.map +1 -0
- package/dist/formats/static/CjsStaticFormat.js +220 -0
- package/dist/formats/static/CjsStaticFormat.js.map +1 -0
- package/dist/formats/static/index.js +2 -0
- package/dist/formats/static/index.js.map +1 -0
- package/dist/formats/webgl/core/buildGlslEffectContainer.js +3 -1
- package/dist/formats/webgl/core/buildGlslEffectContainer.js.map +1 -1
- package/dist/formats/webgl/core/effectPackage.js +13 -5
- package/dist/formats/webgl/core/effectPackage.js.map +1 -1
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +10 -2
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
- package/dist/formats/webgl/core/glslBackendBlock.js +6 -5
- package/dist/formats/webgl/core/glslBackendBlock.js.map +1 -1
- package/dist/formats/webgl/core/glslBackendBodySet.js +0 -1
- package/dist/formats/webgl/core/glslBackendBodySet.js.map +1 -1
- package/dist/formats/webgpu/CjsWebgpuFormat.js +161 -163
- package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +3 -1
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -1
- package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js +179 -131
- package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js.map +1 -1
- package/dist/formats/webgpu/core/effectBackendBodySet.js +2 -3
- package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
- package/dist/formats/webgpu/core/helpers.js +111 -99
- package/dist/formats/webgpu/core/helpers.js.map +1 -1
- package/dist/formats/webgpu/core/packageEffect.js +44 -33
- package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +9 -1
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js +14 -0
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
- package/docs/concepts/shader-resource-model.md +34 -1
- package/docs/formats/README.md +21 -0
- package/docs/formats/carbon-effect-container.md +54 -27
- package/docs/formats/schemabound.md +112 -0
- package/docs/formats/static.md +119 -0
- package/docs/formats/webgl/README.md +5 -3
- package/docs/formats/webgpu/README.md +2 -2
- package/docs/formats/webgpu/architecture.md +2 -2
- package/docs/formats/webgpu/formats/carbon-webgpu.md +24 -6
- package/docs/formats/webgpu/guides/effect-packaging.md +1 -2
- package/docs/formats/webgpu/reference/api.md +7 -6
- package/docs/formats/webgpu/reference/wgsl-compatibility.md +2 -2
- package/docs/reference/classes/formats.md +33 -0
- 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`
|
|
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:
|
package/docs/formats/README.md
CHANGED
|
@@ -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:
|
|
72
|
-
|
|
73
|
-
`readEffectDescription` takes
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
|
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
|
-
###
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
|
|
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
|