@carbonenginejs/runtime 0.1.0-alpha.6 → 0.1.0-alpha.7

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.

Potentially problematic release.


This version of @carbonenginejs/runtime might be problematic. Click here for more details.

Files changed (92) hide show
  1. package/dist/global/consts/effectPaths.js +4 -1
  2. package/dist/global/consts/effectPaths.js.map +1 -1
  3. package/dist/global/consts/index.js +1 -1
  4. package/dist/global/index.js +1 -1
  5. package/dist/index.js +3 -3
  6. package/dist/resource/format/carbonEffect/carbonEffectBackendBlock.js +19 -2
  7. package/dist/resource/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
  8. package/dist/resource/format/index.js +1 -1
  9. package/dist/resource/formats/hlsl/core/carbonTypedViews.js +121 -65
  10. package/dist/resource/formats/hlsl/core/carbonTypedViews.js.map +1 -1
  11. package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js +10 -7
  12. package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
  13. package/dist/resource/formats/webgpu/core/effectBackendBodySet.js +3 -1
  14. package/dist/resource/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
  15. package/dist/resource/formats/webgpu/core/packageEffect.js +5 -0
  16. package/dist/resource/formats/webgpu/core/packageEffect.js.map +1 -1
  17. package/dist/resource/formats/webgpu/core/wgsl/emitWgsl.js +20 -0
  18. package/dist/resource/formats/webgpu/core/wgsl/emitWgsl.js.map +1 -1
  19. package/dist/resource/formats/webgpu/core/wgsl/emulatedAddressing.js +93 -4
  20. package/dist/resource/formats/webgpu/core/wgsl/emulatedAddressing.js.map +1 -1
  21. package/dist/resource/formats/webgpu/core/wgsl/lowerBindingLayout.js +74 -64
  22. package/dist/resource/formats/webgpu/core/wgsl/lowerBindingLayout.js.map +1 -1
  23. package/dist/resource/formats/webgpu/core/wgsl/lowerFragmentProgram.js +16 -7
  24. package/dist/resource/formats/webgpu/core/wgsl/lowerFragmentProgram.js.map +1 -1
  25. package/dist/resource/formats/webgpu/core/wgsl/wgslTypedViews.js +69 -27
  26. package/dist/resource/formats/webgpu/core/wgsl/wgslTypedViews.js.map +1 -1
  27. package/dist/resource/geometry/registerGeometryResources.js +10 -1
  28. package/dist/resource/geometry/registerGeometryResources.js.map +1 -1
  29. package/dist/sof/EveSOFDNA.js +4 -2
  30. package/dist/sof/EveSOFDNA.js.map +1 -1
  31. package/dist/sof/EveSOFDataMgr.js +83 -69
  32. package/dist/sof/EveSOFDataMgr.js.map +1 -1
  33. package/dist/trinity/core/Tr2Denoiser.js +6 -1
  34. package/dist/trinity/core/Tr2Denoiser.js.map +1 -1
  35. package/dist/trinity/core/Tr2ShadowMap.js +7 -2
  36. package/dist/trinity/core/Tr2ShadowMap.js.map +1 -1
  37. package/dist/trinity/core/context/Tr2RenderContext.js +43 -0
  38. package/dist/trinity/core/context/Tr2RenderContext.js.map +1 -1
  39. package/dist/trinity/core/device/Tr2GpuStructuredBuffer.js +134 -0
  40. package/dist/trinity/core/device/Tr2GpuStructuredBuffer.js.map +1 -0
  41. package/dist/trinity/core/index.js +1 -0
  42. package/dist/trinity/core/index.js.map +1 -1
  43. package/dist/trinity/core/lighting/Tr2LightManager.js +410 -124
  44. package/dist/trinity/core/lighting/Tr2LightManager.js.map +1 -1
  45. package/dist/trinity/eve/effect/lensflare/EveLensflare.js +303 -312
  46. package/dist/trinity/eve/effect/lensflare/EveLensflare.js.map +1 -1
  47. package/dist/trinity/eve/effect/lensflare/EveOccluder.js +117 -0
  48. package/dist/trinity/eve/effect/lensflare/EveOccluder.js.map +1 -0
  49. package/dist/trinity/eve/index.js +1 -0
  50. package/dist/trinity/eve/index.js.map +1 -1
  51. package/dist/trinity/eve/scene/EveSpaceScene.js +286 -6
  52. package/dist/trinity/eve/scene/EveSpaceScene.js.map +1 -1
  53. package/dist/trinity/eve/scene/EveSpaceSceneRenderDriver.js +212 -32
  54. package/dist/trinity/eve/scene/EveSpaceSceneRenderDriver.js.map +1 -1
  55. package/dist/trinity/generated/eve/effect/index.js +0 -1
  56. package/dist/trinity/generated/eve/effect/index.js.map +1 -1
  57. package/dist/trinity/generated/eve/index.js +0 -1
  58. package/dist/trinity/generated/eve/index.js.map +1 -1
  59. package/dist/trinity/generated/index.js +0 -2
  60. package/dist/trinity/generated/index.js.map +1 -1
  61. package/dist/trinity/generated/trinityCore/index.js +0 -1
  62. package/dist/trinity/generated/trinityCore/index.js.map +1 -1
  63. package/dist/trinity/index.js +2 -2
  64. package/dist/trinity/postProcess/Tr2PostProcessRenderer.js +4 -1
  65. package/dist/trinity/postProcess/Tr2PostProcessRenderer.js.map +1 -1
  66. package/dist/trinity/postProcess/Tr2SSAO.js +282 -21
  67. package/dist/trinity/postProcess/Tr2SSAO.js.map +1 -1
  68. package/dist/trinity/shader/parameter/Tr2RuntimeTextureParameter.js +71 -53
  69. package/dist/trinity/shader/parameter/Tr2RuntimeTextureParameter.js.map +1 -1
  70. package/dist/trinityal/webgpu/CjsWebgpuRenderContextAL.js +81 -18
  71. package/dist/trinityal/webgpu/CjsWebgpuRenderContextAL.js.map +1 -1
  72. package/dist/trinityal/webgpu/CjsWebgpuResourceSetAL.js +46 -4
  73. package/dist/trinityal/webgpu/CjsWebgpuResourceSetAL.js.map +1 -1
  74. package/dist/trinityal/webgpu/CjsWebgpuShaderAL.js +32 -1
  75. package/dist/trinityal/webgpu/CjsWebgpuShaderAL.js.map +1 -1
  76. package/dist/trinityal/webgpu/CjsWebgpuShaderProgramAL.js +27 -0
  77. package/dist/trinityal/webgpu/CjsWebgpuShaderProgramAL.js.map +1 -1
  78. package/dist/trinityal/webgpu/CjsWebgpuTextureAL.js +29 -4
  79. package/dist/trinityal/webgpu/CjsWebgpuTextureAL.js.map +1 -1
  80. package/dist/trinityal/webgpu/core/CjsWebgpuPsoDescription.js +32 -2
  81. package/dist/trinityal/webgpu/core/CjsWebgpuPsoDescription.js.map +1 -1
  82. package/dist/trinityal/webgpu/core/CjsWebgpuUtils.js +57 -5
  83. package/dist/trinityal/webgpu/core/CjsWebgpuUtils.js.map +1 -1
  84. package/dist/trinityal/webgpu/core/CjsWebgpuWorkQueue.js +111 -5
  85. package/dist/trinityal/webgpu/core/CjsWebgpuWorkQueue.js.map +1 -1
  86. package/docs/trinity/reference/classes/generated.md +20 -20
  87. package/docs/trinity/reference/classes/post-process.md +1 -1
  88. package/package.json +1 -1
  89. package/dist/trinity/generated/eve/effect/EveOccluder.js +0 -38
  90. package/dist/trinity/generated/eve/effect/EveOccluder.js.map +0 -1
  91. package/dist/trinity/generated/trinityCore/Tr2GpuStructuredBuffer.js +0 -48
  92. package/dist/trinity/generated/trinityCore/Tr2GpuStructuredBuffer.js.map +0 -1
@@ -6,6 +6,8 @@ import { lowerDxbcToIr } from './ir/lowerDxbcToIr.js';
6
6
  import { buildWgslBindingPlan } from './wgsl/buildWgslBindingPlan.js';
7
7
  import { typedViewsFor } from '../../hlsl/core/carbonTypedViews.js';
8
8
  import { buildWgsl } from './wgsl/emitWgsl.js';
9
+ import { withoutUnboundUavs } from './wgsl/wgslTypedViews.js';
10
+ import { withEmulatedAddressing } from './wgsl/emulatedAddressing.js';
9
11
  import { buildWgslSet } from './wgsl/buildWgslSet.js';
10
12
  import { buildResourceTransformPlan } from './wgsl/buildResourceTransformPlan.js';
11
13
  import { sha256Utf8, sha256Bytes } from '../../../format/effect/sha256.js';
@@ -123,7 +125,7 @@ function buildPassEntries(analysis, resolved, selection, effectProfileContext) {
123
125
  function translatePassUnit(pass, programForKey, source, bindingPolicy) {
124
126
  const irEntries = pass.stages.map(stage => ({
125
127
  key: stage.key,
126
- ir: programForKey(stage.bytecodeKey),
128
+ ir: withEmulatedAddressing(withoutUnboundUavs(programForKey(stage.bytecodeKey), stage.semanticBindings), stage.semanticBindings),
127
129
  semanticBindings: stage.semanticBindings,
128
130
  effectProfileProof: stage.effectProfileProof
129
131
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"effectBackendBodySet.js","sources":["../../../../../../src/resource/formats/webgpu/core/effectBackendBodySet.js"],"sourcesContent":["import { HlslEffectBindingManifest } from \"../../hlsl/core/tr2/shader/HlslEffectBindingManifest.js\";\nimport { enumerateUniqueEffectBodies } from \"../../../format/effect/effectBodyInventory.js\";\nimport { buildEffectAnalysis } from \"./helpers.js\";\nimport { normalizeBytecodeBytes } from \"./effectAnalysis.js\";\nimport { lowerDxbcToIr } from \"./ir/lowerDxbcToIr.js\";\nimport { buildWgslBindingPlan } from \"./wgsl/buildWgslBindingPlan.js\";\nimport { typedViewsFor } from \"../../hlsl/core/carbonTypedViews.js\";\nimport { buildWgsl } from \"./wgsl/emitWgsl.js\";\nimport { buildWgslSet } from \"./wgsl/buildWgslSet.js\";\nimport { buildResourceTransformPlan } from \"./wgsl/buildResourceTransformPlan.js\";\nimport { sha256Bytes, sha256Utf8 } from \"../../../format/effect/sha256.js\";\nimport { selectEffectStages } from \"./packageEffectSelection.js\";\nimport { compareUtf8 } from \"../../../format/compareUtf8.js\";\nimport {\n isParticleClearEffectCandidate,\n particleClearEffectProofFor,\n preflightParticleClearEffectProfile\n} from \"./wgsl/lowerParticleClearComputePrograms.js\";\n\nexport const EFFECT_BACKEND_BODY_SET_FORMAT = \"CJS_WGSL_BODY_SET\";\nexport const EFFECT_BACKEND_BODY_SET_VERSION = 1;\n\n/**\n * One translation unit is exactly one pass of one body: the binding plan, the\n * resource-transform plan, and every stage's emitted WGSL are derived together.\n * Bodies that share an identical pass signature therefore share one unit.\n *\n * @param {object} pass Pass entry carrying its ordered stage records.\n * @returns {string} Stable signature for the pass translation unit.\n */\nfunction passUnitSignature(pass)\n{\n return JSON.stringify({\n passKey: pass.passKey,\n stages: pass.stages\n .map((stage) => ({\n stageName: stage.stageName,\n bytecode: stage.bytecodeDigest,\n semanticBindings: stage.semanticBindings,\n // An effect profile changes emission, so two otherwise identical\n // passes must not share one unit when their proofs differ.\n effectProfileProof: stage.effectProfileProof\n ? sha256Utf8(JSON.stringify(stage.effectProfileProof))\n : null\n }))\n .sort((left, right) => compareUtf8(left.stageName, right.stageName))\n });\n}\n\nfunction collectBodyStageBytecode(effectDescription)\n{\n const bytecodeByKey = new Map();\n\n for (const technique of effectDescription?.techniques ?? [])\n {\n for (let passIndex = 0; passIndex < technique.passes.length; passIndex++)\n {\n const stageInputs = technique.passes[passIndex].stageInputs;\n\n for (let stageType = 0; stageType < stageInputs.length; stageType++)\n {\n const stage = stageInputs[stageType];\n if (!stage?.m_exists) continue;\n\n const stageName = stage.cjsShaderBytecode?.stageName;\n const value = stage.cjsShaderBytecode?.bytes;\n if (!stageName || value === undefined || value === null) continue;\n\n const key = `${technique.name}.pass${passIndex}.${stageName}`;\n const bytes = normalizeBytecodeBytes(value, `${key} stage bytecode`);\n\n if (!bytes?.length)\n {\n throw new TypeError(`${key} stage bytecode must be a non-empty byte view`);\n }\n\n bytecodeByKey.set(key, {\n techniqueName: technique.name,\n passIndex,\n stageType,\n stageName,\n bytes\n });\n }\n }\n }\n\n return bytecodeByKey;\n}\n\nfunction resolveBody(effectRes, permutationIndex, source)\n{\n const shader = effectRes.GetShaderByIndex(permutationIndex);\n\n if (!shader)\n {\n throw new Error(\n `Effect body at permutation ${permutationIndex} could not be decoded`\n );\n }\n\n const effectDescription = shader.GetEffectDescription();\n\n if (!effectDescription)\n {\n throw new Error(\n `Effect body at permutation ${permutationIndex} has no effect description`\n );\n }\n\n const resolved = {\n effectRes,\n shader,\n selection: { bodyIndex: permutationIndex, selectedOptions: [] },\n effectDescription,\n bindingManifest: HlslEffectBindingManifest.fromEffectDescription(effectDescription),\n stageBytecodeByKey: collectBodyStageBytecode(effectDescription)\n };\n\n return {\n resolved,\n analysis: buildEffectAnalysis(resolved, {\n source,\n decodeBytecode: false,\n decodeInstructions: false\n })\n };\n}\n\nfunction buildPassEntries(analysis, resolved, selection, effectProfileContext)\n{\n const selectedStages = selectEffectStages(analysis.stages, selection);\n const passes = new Map();\n\n for (const stage of selectedStages)\n {\n const passKey = `${stage.techniqueName}.pass${stage.passIndex}`;\n\n if (!passes.has(passKey))\n {\n passes.set(passKey, { passKey, stages: [] });\n }\n\n const bytecode = resolved.stageBytecodeByKey.get(stage.key)?.bytes;\n\n if (!bytecode?.length)\n {\n throw new Error(`${stage.key} has no shader bytecode`);\n }\n\n passes.get(passKey).stages.push({\n key: stage.key,\n stageName: stage.stageName,\n bytecodeKey: stage.key,\n bytecodeDigest: sha256Bytes(bytecode),\n semanticBindings: analysis.stages.find((candidate) =>\n candidate.techniqueName === stage.techniqueName\n && candidate.passIndex === stage.passIndex\n && candidate.stageName === stage.stageName)?.bindings || [],\n effectProfileProof: particleClearEffectProofFor(\n effectProfileContext,\n stage.key\n )\n });\n }\n\n return Array.from(passes.values());\n}\n\nfunction translatePassUnit(pass, programForKey, source, bindingPolicy)\n{\n const irEntries = pass.stages.map((stage) => ({\n key: stage.key,\n ir: programForKey(stage.bytecodeKey),\n semanticBindings: stage.semanticBindings,\n effectProfileProof: stage.effectProfileProof\n }));\n const resourceTransformPlan = buildResourceTransformPlan(\n irEntries.map((entry) => ({\n ir: entry.ir,\n semanticBindings: entry.semanticBindings\n })),\n { layoutKey: pass.passKey }\n );\n const proof = irEntries.find((entry) => entry.effectProfileProof)\n ?.effectProfileProof ?? null;\n const typedViews = Object.assign({}, ...irEntries.map((entry) => typedViewsFor(entry.semanticBindings)));\n const plan = buildWgslBindingPlan(\n irEntries.map((entry) => entry.ir),\n {\n ...(bindingPolicy ?? {}),\n ...(proof ? { effectProfileProof: proof } : {}),\n ...(resourceTransformPlan ? { resourceTransformPlan } : {}),\n ...(Object.keys(typedViews).length ? { typedViews } : {})\n }\n );\n\n return buildWgslSet(irEntries.map((entry) => ({\n key: entry.key,\n shader: buildWgsl(entry.ir, {\n bindingPlan: plan,\n ...(resourceTransformPlan ? { resourceTransformPlan } : {}),\n ...(entry.effectProfileProof\n ? { effectProfileProof: entry.effectProfileProof }\n : {})\n })\n })));\n}\n\n/**\n * Translate every unique source body into backend programs, layouts, and\n * resource transforms, sharing one translation unit between bodies whose pass\n * is byte-for-byte identical.\n *\n * A body that cannot be lowered is retained as an explicitly unsupported\n * in-memory record carrying its reason. Portable source reflection is built\n * separately from the same effect; this body-set document does not store it.\n * Any unsupported body makes `coverage.bodies` `\"partial\"`. The emitted\n * container keeps that body's non-program fields with zero-length programs, so\n * a reread can report only that it carries no translated programs, not why.\n * The caller (`buildEffectPackage`, mode `\"all\"`) has already required the\n * resolved selection to translate before this runs.\n *\n * @param {object} effectRes Loaded version-15 `Tr2EffectRes`.\n * @param {object} permutationGraph Validated derived `CJS_EFFECT_PERMUTATION_GRAPH` document (no chunk is stored).\n * @param {object} [options] Source label, stage selection, and binding policy.\n * @returns {object} Frozen `CJS_WGSL_BODY_SET` document.\n */\nexport function buildEffectBackendBodySet(effectRes, permutationGraph, options = {})\n{\n const source = options.source || \"memory\";\n const selection = options.selection ?? null;\n const bindingPolicy = options.bindingPolicy ?? null;\n const groups = enumerateUniqueEffectBodies(effectRes);\n\n if (groups.length !== permutationGraph.bodies.length)\n {\n throw new Error(\n \"Effect backend body set requires one unique body per permutation-graph body\"\n );\n }\n\n const unitsBySignature = new Map();\n const graphBodiesByKey = new Map(permutationGraph.bodies.map((body) => [ body.key, body ]));\n const passUnits = [];\n const bodies = [];\n const seenBodyKeys = new Set();\n\n for (const group of groups)\n {\n const variant = permutationGraph.variants[group.permutationIndex];\n const graphBody = variant ? graphBodiesByKey.get(variant.bodyKey) : null;\n\n if (!graphBody)\n {\n throw new Error(\n `Effect backend body ${group.permutationIndex} does not reconcile with its permutation graph record`\n );\n }\n\n if (seenBodyKeys.has(graphBody.key))\n {\n throw new Error(\n `Effect backend body ${graphBody.key} was enumerated more than once`\n );\n }\n\n seenBodyKeys.add(graphBody.key);\n\n let resolvedBody = null;\n let passes = null;\n let programForKey = null;\n\n try\n {\n resolvedBody = resolveBody(effectRes, group.permutationIndex, source);\n\n // One IR cache per body, so a stage shared by two passes lowers once\n // and the effect-profile preflight can seed it exactly as the\n // selected-body path does.\n const programsByKey = new Map();\n programForKey = (key) =>\n {\n if (programsByKey.has(key)) return programsByKey.get(key);\n\n const bytecode = resolvedBody.resolved.stageBytecodeByKey.get(key)?.bytes;\n\n if (!bytecode?.length)\n {\n throw new Error(`${key} has no shader bytecode`);\n }\n\n const program = lowerDxbcToIr(bytecode, { source: `${source}#${key}` });\n programsByKey.set(key, program);\n return program;\n };\n\n let effectProfileContext = null;\n\n if (isParticleClearEffectCandidate(resolvedBody.resolved.effectDescription))\n {\n programForKey(\"Main.pass0.compute\");\n programForKey(\"Main.pass1.compute\");\n effectProfileContext = preflightParticleClearEffectProfile(\n resolvedBody.resolved.effectDescription,\n programsByKey\n );\n }\n\n passes = buildPassEntries(\n resolvedBody.analysis,\n resolvedBody.resolved,\n selection,\n effectProfileContext\n );\n }\n catch (error)\n {\n // Stage selection and profile preflight fail closed per body: an\n // unsupported stage kind in one body must not fail the package.\n bodies.push({\n bodyKey: graphBody.key,\n representativePermutationIndex: group.permutationIndex,\n status: \"unsupported\",\n error: String(error?.message ?? error),\n passCount: 0,\n passes: []\n });\n continue;\n }\n\n const bodyPasses = [];\n let failure = null;\n\n for (const pass of passes)\n {\n const signature = passUnitSignature(pass);\n let unit = unitsBySignature.get(signature);\n\n if (!unit)\n {\n let wgsl = null;\n\n try\n {\n wgsl = translatePassUnit(\n pass,\n programForKey,\n source,\n bindingPolicy\n );\n }\n catch (error)\n {\n failure = String(error?.message ?? error);\n break;\n }\n\n unit = {\n key: `unit${passUnits.length}`,\n sha256: sha256Utf8(`${JSON.stringify(wgsl)}\\n`),\n wgslSetVersion: wgsl.formatVersion,\n shaders: wgsl.shaders,\n layouts: wgsl.layouts,\n ...(wgsl.resourceTransforms\n ? { resourceTransforms: wgsl.resourceTransforms }\n : {})\n };\n unitsBySignature.set(signature, unit);\n passUnits.push(unit);\n }\n\n bodyPasses.push({ passKey: pass.passKey, unitKey: unit.key });\n }\n\n bodies.push(failure\n ? {\n bodyKey: graphBody.key,\n representativePermutationIndex: group.permutationIndex,\n status: \"unsupported\",\n error: failure,\n passCount: 0,\n passes: []\n }\n : {\n bodyKey: graphBody.key,\n representativePermutationIndex: group.permutationIndex,\n status: \"translated\",\n error: null,\n passCount: bodyPasses.length,\n passes: bodyPasses\n });\n }\n\n const translatedCount = bodies.filter((body) => body.status === \"translated\").length;\n\n if (!translatedCount)\n {\n throw new Error(\n \"Effect backend body set requires at least one translated body\"\n );\n }\n\n return {\n format: EFFECT_BACKEND_BODY_SET_FORMAT,\n formatVersion: EFFECT_BACKEND_BODY_SET_VERSION,\n coverage: {\n bodies: translatedCount === bodies.length ? \"all-unique\" : \"partial\",\n programs: \"complete-for-translated\"\n },\n bodyCount: bodies.length,\n translatedBodyCount: translatedCount,\n passUnitCount: passUnits.length,\n passUnits: passUnits.map((unit) => unit),\n bodies: bodies\n };\n}\n"],"names":["EFFECT_BACKEND_BODY_SET_FORMAT","EFFECT_BACKEND_BODY_SET_VERSION","passUnitSignature","pass","JSON","stringify","passKey","stages","map","stage","stageName","bytecode","bytecodeDigest","semanticBindings","effectProfileProof","sha256Utf8","sort","left","right","compareUtf8","collectBodyStageBytecode","effectDescription","bytecodeByKey","Map","technique","techniques","passIndex","passes","length","stageInputs","stageType","m_exists","cjsShaderBytecode","value","bytes","undefined","key","name","normalizeBytecodeBytes","TypeError","set","techniqueName","resolveBody","effectRes","permutationIndex","source","shader","GetShaderByIndex","Error","GetEffectDescription","resolved","selection","bodyIndex","selectedOptions","bindingManifest","HlslEffectBindingManifest","fromEffectDescription","stageBytecodeByKey","analysis","buildEffectAnalysis","decodeBytecode","decodeInstructions","buildPassEntries","effectProfileContext","selectedStages","selectEffectStages","has","get","push","bytecodeKey","sha256Bytes","find","candidate","bindings","particleClearEffectProofFor","Array","from","values","translatePassUnit","programForKey","bindingPolicy","irEntries","ir","resourceTransformPlan","buildResourceTransformPlan","entry","layoutKey","proof","typedViews","Object","assign","typedViewsFor","plan","buildWgslBindingPlan","keys","buildWgslSet","buildWgsl","bindingPlan","buildEffectBackendBodySet","permutationGraph","options","groups","enumerateUniqueEffectBodies","bodies","unitsBySignature","graphBodiesByKey","body","passUnits","seenBodyKeys","Set","group","variant","variants","graphBody","bodyKey","add","resolvedBody","programsByKey","program","lowerDxbcToIr","isParticleClearEffectCandidate","preflightParticleClearEffectProfile","error","representativePermutationIndex","status","String","message","passCount","bodyPasses","failure","signature","unit","wgsl","sha256","wgslSetVersion","formatVersion","shaders","layouts","resourceTransforms","unitKey","translatedCount","filter","format","coverage","programs","bodyCount","translatedBodyCount","passUnitCount"],"mappings":"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"}
1
+ {"version":3,"file":"effectBackendBodySet.js","sources":["../../../../../../src/resource/formats/webgpu/core/effectBackendBodySet.js"],"sourcesContent":["import { HlslEffectBindingManifest } from \"../../hlsl/core/tr2/shader/HlslEffectBindingManifest.js\";\nimport { enumerateUniqueEffectBodies } from \"../../../format/effect/effectBodyInventory.js\";\nimport { buildEffectAnalysis } from \"./helpers.js\";\nimport { normalizeBytecodeBytes } from \"./effectAnalysis.js\";\nimport { lowerDxbcToIr } from \"./ir/lowerDxbcToIr.js\";\nimport { buildWgslBindingPlan } from \"./wgsl/buildWgslBindingPlan.js\";\nimport { typedViewsFor } from \"../../hlsl/core/carbonTypedViews.js\";\nimport { buildWgsl } from \"./wgsl/emitWgsl.js\";\nimport { withoutUnboundUavs } from \"./wgsl/wgslTypedViews.js\";\nimport { withEmulatedAddressing } from \"./wgsl/emulatedAddressing.js\";\nimport { buildWgslSet } from \"./wgsl/buildWgslSet.js\";\nimport { buildResourceTransformPlan } from \"./wgsl/buildResourceTransformPlan.js\";\nimport { sha256Bytes, sha256Utf8 } from \"../../../format/effect/sha256.js\";\nimport { selectEffectStages } from \"./packageEffectSelection.js\";\nimport { compareUtf8 } from \"../../../format/compareUtf8.js\";\nimport {\n isParticleClearEffectCandidate,\n particleClearEffectProofFor,\n preflightParticleClearEffectProfile\n} from \"./wgsl/lowerParticleClearComputePrograms.js\";\n\nexport const EFFECT_BACKEND_BODY_SET_FORMAT = \"CJS_WGSL_BODY_SET\";\nexport const EFFECT_BACKEND_BODY_SET_VERSION = 1;\n\n/**\n * One translation unit is exactly one pass of one body: the binding plan, the\n * resource-transform plan, and every stage's emitted WGSL are derived together.\n * Bodies that share an identical pass signature therefore share one unit.\n *\n * @param {object} pass Pass entry carrying its ordered stage records.\n * @returns {string} Stable signature for the pass translation unit.\n */\nfunction passUnitSignature(pass)\n{\n return JSON.stringify({\n passKey: pass.passKey,\n stages: pass.stages\n .map((stage) => ({\n stageName: stage.stageName,\n bytecode: stage.bytecodeDigest,\n semanticBindings: stage.semanticBindings,\n // An effect profile changes emission, so two otherwise identical\n // passes must not share one unit when their proofs differ.\n effectProfileProof: stage.effectProfileProof\n ? sha256Utf8(JSON.stringify(stage.effectProfileProof))\n : null\n }))\n .sort((left, right) => compareUtf8(left.stageName, right.stageName))\n });\n}\n\nfunction collectBodyStageBytecode(effectDescription)\n{\n const bytecodeByKey = new Map();\n\n for (const technique of effectDescription?.techniques ?? [])\n {\n for (let passIndex = 0; passIndex < technique.passes.length; passIndex++)\n {\n const stageInputs = technique.passes[passIndex].stageInputs;\n\n for (let stageType = 0; stageType < stageInputs.length; stageType++)\n {\n const stage = stageInputs[stageType];\n if (!stage?.m_exists) continue;\n\n const stageName = stage.cjsShaderBytecode?.stageName;\n const value = stage.cjsShaderBytecode?.bytes;\n if (!stageName || value === undefined || value === null) continue;\n\n const key = `${technique.name}.pass${passIndex}.${stageName}`;\n const bytes = normalizeBytecodeBytes(value, `${key} stage bytecode`);\n\n if (!bytes?.length)\n {\n throw new TypeError(`${key} stage bytecode must be a non-empty byte view`);\n }\n\n bytecodeByKey.set(key, {\n techniqueName: technique.name,\n passIndex,\n stageType,\n stageName,\n bytes\n });\n }\n }\n }\n\n return bytecodeByKey;\n}\n\nfunction resolveBody(effectRes, permutationIndex, source)\n{\n const shader = effectRes.GetShaderByIndex(permutationIndex);\n\n if (!shader)\n {\n throw new Error(\n `Effect body at permutation ${permutationIndex} could not be decoded`\n );\n }\n\n const effectDescription = shader.GetEffectDescription();\n\n if (!effectDescription)\n {\n throw new Error(\n `Effect body at permutation ${permutationIndex} has no effect description`\n );\n }\n\n const resolved = {\n effectRes,\n shader,\n selection: { bodyIndex: permutationIndex, selectedOptions: [] },\n effectDescription,\n bindingManifest: HlslEffectBindingManifest.fromEffectDescription(effectDescription),\n stageBytecodeByKey: collectBodyStageBytecode(effectDescription)\n };\n\n return {\n resolved,\n analysis: buildEffectAnalysis(resolved, {\n source,\n decodeBytecode: false,\n decodeInstructions: false\n })\n };\n}\n\nfunction buildPassEntries(analysis, resolved, selection, effectProfileContext)\n{\n const selectedStages = selectEffectStages(analysis.stages, selection);\n const passes = new Map();\n\n for (const stage of selectedStages)\n {\n const passKey = `${stage.techniqueName}.pass${stage.passIndex}`;\n\n if (!passes.has(passKey))\n {\n passes.set(passKey, { passKey, stages: [] });\n }\n\n const bytecode = resolved.stageBytecodeByKey.get(stage.key)?.bytes;\n\n if (!bytecode?.length)\n {\n throw new Error(`${stage.key} has no shader bytecode`);\n }\n\n passes.get(passKey).stages.push({\n key: stage.key,\n stageName: stage.stageName,\n bytecodeKey: stage.key,\n bytecodeDigest: sha256Bytes(bytecode),\n semanticBindings: analysis.stages.find((candidate) =>\n candidate.techniqueName === stage.techniqueName\n && candidate.passIndex === stage.passIndex\n && candidate.stageName === stage.stageName)?.bindings || [],\n effectProfileProof: particleClearEffectProofFor(\n effectProfileContext,\n stage.key\n )\n });\n }\n\n return Array.from(passes.values());\n}\n\nfunction translatePassUnit(pass, programForKey, source, bindingPolicy)\n{\n const irEntries = pass.stages.map((stage) => ({\n key: stage.key,\n ir: withEmulatedAddressing(withoutUnboundUavs(programForKey(stage.bytecodeKey), stage.semanticBindings), stage.semanticBindings),\n semanticBindings: stage.semanticBindings,\n effectProfileProof: stage.effectProfileProof\n }));\n const resourceTransformPlan = buildResourceTransformPlan(\n irEntries.map((entry) => ({\n ir: entry.ir,\n semanticBindings: entry.semanticBindings\n })),\n { layoutKey: pass.passKey }\n );\n const proof = irEntries.find((entry) => entry.effectProfileProof)\n ?.effectProfileProof ?? null;\n const typedViews = Object.assign({}, ...irEntries.map((entry) => typedViewsFor(entry.semanticBindings)));\n const plan = buildWgslBindingPlan(\n irEntries.map((entry) => entry.ir),\n {\n ...(bindingPolicy ?? {}),\n ...(proof ? { effectProfileProof: proof } : {}),\n ...(resourceTransformPlan ? { resourceTransformPlan } : {}),\n ...(Object.keys(typedViews).length ? { typedViews } : {})\n }\n );\n\n return buildWgslSet(irEntries.map((entry) => ({\n key: entry.key,\n shader: buildWgsl(entry.ir, {\n bindingPlan: plan,\n ...(resourceTransformPlan ? { resourceTransformPlan } : {}),\n ...(entry.effectProfileProof\n ? { effectProfileProof: entry.effectProfileProof }\n : {})\n })\n })));\n}\n\n/**\n * Translate every unique source body into backend programs, layouts, and\n * resource transforms, sharing one translation unit between bodies whose pass\n * is byte-for-byte identical.\n *\n * A body that cannot be lowered is retained as an explicitly unsupported\n * in-memory record carrying its reason. Portable source reflection is built\n * separately from the same effect; this body-set document does not store it.\n * Any unsupported body makes `coverage.bodies` `\"partial\"`. The emitted\n * container keeps that body's non-program fields with zero-length programs, so\n * a reread can report only that it carries no translated programs, not why.\n * The caller (`buildEffectPackage`, mode `\"all\"`) has already required the\n * resolved selection to translate before this runs.\n *\n * @param {object} effectRes Loaded version-15 `Tr2EffectRes`.\n * @param {object} permutationGraph Validated derived `CJS_EFFECT_PERMUTATION_GRAPH` document (no chunk is stored).\n * @param {object} [options] Source label, stage selection, and binding policy.\n * @returns {object} Frozen `CJS_WGSL_BODY_SET` document.\n */\nexport function buildEffectBackendBodySet(effectRes, permutationGraph, options = {})\n{\n const source = options.source || \"memory\";\n const selection = options.selection ?? null;\n const bindingPolicy = options.bindingPolicy ?? null;\n const groups = enumerateUniqueEffectBodies(effectRes);\n\n if (groups.length !== permutationGraph.bodies.length)\n {\n throw new Error(\n \"Effect backend body set requires one unique body per permutation-graph body\"\n );\n }\n\n const unitsBySignature = new Map();\n const graphBodiesByKey = new Map(permutationGraph.bodies.map((body) => [ body.key, body ]));\n const passUnits = [];\n const bodies = [];\n const seenBodyKeys = new Set();\n\n for (const group of groups)\n {\n const variant = permutationGraph.variants[group.permutationIndex];\n const graphBody = variant ? graphBodiesByKey.get(variant.bodyKey) : null;\n\n if (!graphBody)\n {\n throw new Error(\n `Effect backend body ${group.permutationIndex} does not reconcile with its permutation graph record`\n );\n }\n\n if (seenBodyKeys.has(graphBody.key))\n {\n throw new Error(\n `Effect backend body ${graphBody.key} was enumerated more than once`\n );\n }\n\n seenBodyKeys.add(graphBody.key);\n\n let resolvedBody = null;\n let passes = null;\n let programForKey = null;\n\n try\n {\n resolvedBody = resolveBody(effectRes, group.permutationIndex, source);\n\n // One IR cache per body, so a stage shared by two passes lowers once\n // and the effect-profile preflight can seed it exactly as the\n // selected-body path does.\n const programsByKey = new Map();\n programForKey = (key) =>\n {\n if (programsByKey.has(key)) return programsByKey.get(key);\n\n const bytecode = resolvedBody.resolved.stageBytecodeByKey.get(key)?.bytes;\n\n if (!bytecode?.length)\n {\n throw new Error(`${key} has no shader bytecode`);\n }\n\n const program = lowerDxbcToIr(bytecode, { source: `${source}#${key}` });\n programsByKey.set(key, program);\n return program;\n };\n\n let effectProfileContext = null;\n\n if (isParticleClearEffectCandidate(resolvedBody.resolved.effectDescription))\n {\n programForKey(\"Main.pass0.compute\");\n programForKey(\"Main.pass1.compute\");\n effectProfileContext = preflightParticleClearEffectProfile(\n resolvedBody.resolved.effectDescription,\n programsByKey\n );\n }\n\n passes = buildPassEntries(\n resolvedBody.analysis,\n resolvedBody.resolved,\n selection,\n effectProfileContext\n );\n }\n catch (error)\n {\n // Stage selection and profile preflight fail closed per body: an\n // unsupported stage kind in one body must not fail the package.\n bodies.push({\n bodyKey: graphBody.key,\n representativePermutationIndex: group.permutationIndex,\n status: \"unsupported\",\n error: String(error?.message ?? error),\n passCount: 0,\n passes: []\n });\n continue;\n }\n\n const bodyPasses = [];\n let failure = null;\n\n for (const pass of passes)\n {\n const signature = passUnitSignature(pass);\n let unit = unitsBySignature.get(signature);\n\n if (!unit)\n {\n let wgsl = null;\n\n try\n {\n wgsl = translatePassUnit(\n pass,\n programForKey,\n source,\n bindingPolicy\n );\n }\n catch (error)\n {\n failure = String(error?.message ?? error);\n break;\n }\n\n unit = {\n key: `unit${passUnits.length}`,\n sha256: sha256Utf8(`${JSON.stringify(wgsl)}\\n`),\n wgslSetVersion: wgsl.formatVersion,\n shaders: wgsl.shaders,\n layouts: wgsl.layouts,\n ...(wgsl.resourceTransforms\n ? { resourceTransforms: wgsl.resourceTransforms }\n : {})\n };\n unitsBySignature.set(signature, unit);\n passUnits.push(unit);\n }\n\n bodyPasses.push({ passKey: pass.passKey, unitKey: unit.key });\n }\n\n bodies.push(failure\n ? {\n bodyKey: graphBody.key,\n representativePermutationIndex: group.permutationIndex,\n status: \"unsupported\",\n error: failure,\n passCount: 0,\n passes: []\n }\n : {\n bodyKey: graphBody.key,\n representativePermutationIndex: group.permutationIndex,\n status: \"translated\",\n error: null,\n passCount: bodyPasses.length,\n passes: bodyPasses\n });\n }\n\n const translatedCount = bodies.filter((body) => body.status === \"translated\").length;\n\n if (!translatedCount)\n {\n throw new Error(\n \"Effect backend body set requires at least one translated body\"\n );\n }\n\n return {\n format: EFFECT_BACKEND_BODY_SET_FORMAT,\n formatVersion: EFFECT_BACKEND_BODY_SET_VERSION,\n coverage: {\n bodies: translatedCount === bodies.length ? \"all-unique\" : \"partial\",\n programs: \"complete-for-translated\"\n },\n bodyCount: bodies.length,\n translatedBodyCount: translatedCount,\n passUnitCount: passUnits.length,\n passUnits: passUnits.map((unit) => unit),\n bodies: bodies\n };\n}\n"],"names":["EFFECT_BACKEND_BODY_SET_FORMAT","EFFECT_BACKEND_BODY_SET_VERSION","passUnitSignature","pass","JSON","stringify","passKey","stages","map","stage","stageName","bytecode","bytecodeDigest","semanticBindings","effectProfileProof","sha256Utf8","sort","left","right","compareUtf8","collectBodyStageBytecode","effectDescription","bytecodeByKey","Map","technique","techniques","passIndex","passes","length","stageInputs","stageType","m_exists","cjsShaderBytecode","value","bytes","undefined","key","name","normalizeBytecodeBytes","TypeError","set","techniqueName","resolveBody","effectRes","permutationIndex","source","shader","GetShaderByIndex","Error","GetEffectDescription","resolved","selection","bodyIndex","selectedOptions","bindingManifest","HlslEffectBindingManifest","fromEffectDescription","stageBytecodeByKey","analysis","buildEffectAnalysis","decodeBytecode","decodeInstructions","buildPassEntries","effectProfileContext","selectedStages","selectEffectStages","has","get","push","bytecodeKey","sha256Bytes","find","candidate","bindings","particleClearEffectProofFor","Array","from","values","translatePassUnit","programForKey","bindingPolicy","irEntries","ir","withEmulatedAddressing","withoutUnboundUavs","resourceTransformPlan","buildResourceTransformPlan","entry","layoutKey","proof","typedViews","Object","assign","typedViewsFor","plan","buildWgslBindingPlan","keys","buildWgslSet","buildWgsl","bindingPlan","buildEffectBackendBodySet","permutationGraph","options","groups","enumerateUniqueEffectBodies","bodies","unitsBySignature","graphBodiesByKey","body","passUnits","seenBodyKeys","Set","group","variant","variants","graphBody","bodyKey","add","resolvedBody","programsByKey","program","lowerDxbcToIr","isParticleClearEffectCandidate","preflightParticleClearEffectProfile","error","representativePermutationIndex","status","String","message","passCount","bodyPasses","failure","signature","unit","wgsl","sha256","wgslSetVersion","formatVersion","shaders","layouts","resourceTransforms","unitKey","translatedCount","filter","format","coverage","programs","bodyCount","translatedBodyCount","passUnitCount"],"mappings":"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"}
@@ -5,6 +5,8 @@ import { lowerDxbcToIr } from './ir/lowerDxbcToIr.js';
5
5
  import { buildWgslBindingPlan } from './wgsl/buildWgslBindingPlan.js';
6
6
  import { typedViewsFor } from '../../hlsl/core/carbonTypedViews.js';
7
7
  import { buildWgsl } from './wgsl/emitWgsl.js';
8
+ import { withoutUnboundUavs } from './wgsl/wgslTypedViews.js';
9
+ import { withEmulatedAddressing } from './wgsl/emulatedAddressing.js';
8
10
  import { buildWgslSet } from './wgsl/buildWgslSet.js';
9
11
  import { buildResourceTransformPlan } from './wgsl/buildResourceTransformPlan.js';
10
12
  import { buildEffectPermutationGraph, EFFECT_PERMUTATION_GRAPH_VERSION, EFFECT_PERMUTATION_GRAPH_FORMAT } from '../../../format/effect/effectPermutationGraph.js';
@@ -135,6 +137,9 @@ function buildEffectPackage(input, options = {}) {
135
137
  semanticBindings: analysis.stages.find(candidate => candidate.techniqueName === stage.techniqueName && candidate.passIndex === stage.passIndex && candidate.stageName === stage.stageName)?.bindings || [],
136
138
  effectProfileProof: particleClearEffectProofFor(effectProfileContext, stage.key)
137
139
  }));
140
+ for (const entry of irEntries) {
141
+ entry.ir = withEmulatedAddressing(withoutUnboundUavs(entry.ir, entry.semanticBindings), entry.semanticBindings);
142
+ }
138
143
  const programsByPass = new Map();
139
144
  for (const entry of irEntries) {
140
145
  if (!programsByPass.has(entry.passKey)) {
@@ -1 +1 @@
1
- {"version":3,"file":"packageEffect.js","sources":["../../../../../../src/resource/formats/webgpu/core/packageEffect.js"],"sourcesContent":["import { readEffectAnalysis } from \"./effectAnalysis.js\";\nimport { buildEffectAnalysis, inspectWithValues } from \"./helpers.js\";\nimport { buildCarbonEffectContainer } from \"./buildCarbonEffectContainer.js\";\nimport { lowerDxbcToIr } from \"./ir/lowerDxbcToIr.js\";\nimport { buildWgslBindingPlan } from \"./wgsl/buildWgslBindingPlan.js\";\nimport { typedViewsFor } from \"../../hlsl/core/carbonTypedViews.js\";\nimport { buildWgsl } from \"./wgsl/emitWgsl.js\";\nimport { buildWgslSet } from \"./wgsl/buildWgslSet.js\";\nimport { buildResourceTransformPlan } from \"./wgsl/buildResourceTransformPlan.js\";\nimport {\n buildEffectPermutationGraph,\n EFFECT_PERMUTATION_GRAPH_FORMAT,\n EFFECT_PERMUTATION_GRAPH_VERSION\n} from \"../../../format/effect/effectPermutationGraph.js\";\nimport {\n buildEffectBackendBodySet,\n EFFECT_BACKEND_BODY_SET_FORMAT,\n EFFECT_BACKEND_BODY_SET_VERSION\n} from \"./effectBackendBodySet.js\";\nimport {\n DXBC_WGSL_TRANSLATOR_NAME,\n DXBC_WGSL_TRANSLATOR_VERSION,\n EFFECT_INFO_VERSION,\n FORMAT_WEBGPU_PACKAGE_NAME,\n FORMAT_WEBGPU_PACKAGE_VERSION,\n WEBGPU_BACKEND_NAME\n} from \"./packageMetadata.js\";\nimport { sha256Bytes, sha256Utf8 } from \"../../../format/effect/sha256.js\";\nimport { resolveWriteVersion } from \"../../../format/carbonEffect/carbonEffectRecords.js\";\nimport {\n isParticleClearEffectCandidate,\n particleClearEffectProofFor,\n preflightParticleClearEffectProfile\n} from \"./wgsl/lowerParticleClearComputePrograms.js\";\nimport {\n buildWgslSelectionMetadata,\n normalizeEffectPermutation,\n selectEffectStages,\n validateResolvedPermutation\n} from \"./packageEffectSelection.js\";\n\n/**\n * Effects this backend refuses by name, whatever the translator can lower.\n *\n * `system/crash` must never run: without its sentinel its loop visits all\n * 2^32 indices and never terminates, and several workgroups race where it\n * expects exactly one; an iteration cap would change what it does, and the\n * package proves neither premise (`lowerComputeProgram.js`). It is refused\n * here by path, for every tier and backend directory, so a wider general\n * compute path can never let it through.\n */\nconst REFUSED_EFFECTS = Object.freeze([\n { pattern: /\\/managed\\/space\\/system\\/crash\\.[^/]*$/iu, reason: \"system/crash never terminates without its sentinel and races across workgroups\" }\n]);\n\n/** Throws for an effect this backend refuses by name. */\nexport function rejectRefusedEffect(source)\n{\n const refused = REFUSED_EFFECTS.find((entry) => entry.pattern.test(String(source ?? \"\")));\n if (refused) throw new Error(`WebGPU refuses ${source}: ${refused.reason}`);\n}\n\n/**\n * Build one structurally valid Carbon WebGPU package from compiled Tr2 effect bytes.\n *\n * The version-15 build result retains every unique body's portable source\n * reflection as in-memory evidence while the emitted Carbon wire stores WGSL\n * or empty program slots plus representable non-program fields. Filesystem\n * concerns remain in callers.\n *\n * Options:\n * - `mode`: `\"selected\"` (default) translates only the resolved body's\n * requested complete passes; `\"all\"` first requires that selection to\n * translate, then attempts every distinct body. `allPermutations: true`\n * forces `\"all\"`. Neither mode drops permutation rows.\n * - `permutation`: `{ name, value }[]` or a `Map`; unknown, duplicate or\n * unresolved assertions throw.\n * - `selection`: `{ techniqueName, passIndex, stageNames }`; `stageNames`\n * requires an exact `passIndex`.\n * - `bindingPolicy.sharedIdentities`: D3D identities allowed to share one\n * physical binding across stages.\n * - `source`, `outputPath`, `sourceIdentity`: returned provenance only; the\n * wire's backend identity comes from the consumer's resource path. A\n * supplied `sourceIdentity.sha256` must match the exact input bytes.\n *\n * Returned fields (caller evidence, none stored separately in the wire):\n * - `bytes`: the Carbon v15 container;\n * - `info`: producer, source, translation-scope (`backendBodyCoverage`) and\n * completeness evidence;\n * - `metadata`: resolved selection and caller provenance;\n * - `permutationGraph`: complete source permutation and body-alias view;\n * - `analysis`: selected-body diagnostic analysis;\n * - `wgsl`: emitted shaders, layouts and resource transforms;\n * - `backendBodySet`: all-body translation result, or `null` in selected mode;\n * - `inspection`: summary from rereading the emitted bytes;\n * - `qualification`: structural outcome and translation counts.\n *\n * `qualification.packageValid` is structural validity only; `backendComplete`\n * and `runtimeComplete` stay false because translating bodies does not prove\n * pipeline preparation or a draw. Compiler IR is transient and not returned.\n *\n * @param {Uint8Array|ArrayBuffer|ArrayBufferView} input Compiled effect bytes.\n * @param {object} [options] Source, body-mode, permutation, and stage-selection policy.\n * @returns {object} Package bytes plus inspection and provenance documents.\n */\nexport function buildEffectPackage(input, options = {})\n{\n const mode = normalizeMode(options.mode, options.allPermutations);\n const source = normalizeSource(options.source);\n rejectRefusedEffect(source);\n // Resolved once, up front, so an unwritable request fails before any\n // translation work is done rather than at the final assembly step. The\n // reported value is what was actually emitted, never the constant.\n const containerVersion = resolveWriteVersion(options.version);\n const outputPath = normalizeOptionalString(options.outputPath, \"Effect outputPath\");\n const sourceIdentity = normalizeSourceIdentity(\n options.sourceIdentity,\n source,\n input\n );\n const permutation = normalizeEffectPermutation(options.permutation);\n const selection = normalizeSelection(options.selection);\n const resolved = readEffectAnalysis(input, { source, permutation });\n\n // One INFO version means one contract, and that contract requires complete\n // source reflection, which only version-15 input can supply.\n if (resolved.effectRes?.m_version !== 15)\n {\n throw new Error(\n \"Effect package requires a version-15 compiled effect, got version \"\n + (resolved.effectRes?.m_version ?? \"unknown\")\n );\n }\n\n validateResolvedPermutation(permutation, resolved.selection?.selectedOptions ?? []);\n\n const analysis = buildEffectAnalysis(resolved, {\n source,\n decodeBytecode: false,\n decodeInstructions: false\n });\n const bytecodeByKey = resolved.stageBytecodeByKey;\n const selectedStages = selectEffectStages(analysis.stages, selection);\n const programsByKey = new Map();\n const programForKey = (key) =>\n {\n if (programsByKey.has(key)) return programsByKey.get(key);\n const bytecode = bytecodeByKey.get(key)?.bytes;\n\n if (!bytecode?.length)\n {\n throw new Error(`${key} has no shader bytecode`);\n }\n const program = lowerDxbcToIr(\n bytecode,\n { source: `${source}#${key}` }\n );\n programsByKey.set(key, program);\n return program;\n };\n let effectProfileContext = null;\n if (isParticleClearEffectCandidate(resolved.effectDescription))\n {\n programForKey(\"Main.pass0.compute\");\n programForKey(\"Main.pass1.compute\");\n effectProfileContext = preflightParticleClearEffectProfile(\n resolved.effectDescription,\n programsByKey\n );\n }\n const irEntries = selectedStages.map((stage) => ({\n key: stage.key,\n passKey: `${stage.techniqueName}.pass${stage.passIndex}`,\n ir: programForKey(stage.key),\n semanticBindings: analysis.stages.find((candidate) =>\n candidate.techniqueName === stage.techniqueName\n && candidate.passIndex === stage.passIndex\n && candidate.stageName === stage.stageName)?.bindings || [],\n effectProfileProof: particleClearEffectProofFor(\n effectProfileContext,\n stage.key\n )\n }));\n const programsByPass = new Map();\n\n for (const entry of irEntries)\n {\n if (!programsByPass.has(entry.passKey))\n {\n programsByPass.set(entry.passKey, []);\n }\n\n programsByPass.get(entry.passKey).push(entry);\n }\n\n const resourceTransformPlans = new Map(Array.from(programsByPass, ([ key, entries ]) => [\n key,\n buildResourceTransformPlan(\n entries.map((entry) => ({\n ir: entry.ir,\n semanticBindings: entry.semanticBindings\n })),\n { layoutKey: key }\n )\n ]));\n const plans = new Map(Array.from(programsByPass, ([ key, entries ]) =>\n {\n const proof = entries.find((entry) => entry.effectProfileProof)\n ?.effectProfileProof ?? null;\n const resourceTransformPlan = resourceTransformPlans.get(key);\n const typedViews = Object.assign({}, ...entries.map((entry) => typedViewsFor(entry.semanticBindings)));\n return [\n key,\n buildWgslBindingPlan(\n entries.map((entry) => entry.ir),\n {\n ...(options.bindingPolicy ?? {}),\n ...(proof ? { effectProfileProof: proof } : {}),\n ...(resourceTransformPlan ? { resourceTransformPlan } : {}),\n ...(Object.keys(typedViews).length ? { typedViews } : {})\n }\n )\n ];\n }));\n const shaderEntries = irEntries.map((entry) => ({\n key: entry.key,\n shader: buildWgsl(entry.ir, {\n bindingPlan: plans.get(entry.passKey),\n ...(resourceTransformPlans.get(entry.passKey)\n ? { resourceTransformPlan: resourceTransformPlans.get(entry.passKey) }\n : {}),\n ...(entry.effectProfileProof\n ? { effectProfileProof: entry.effectProfileProof }\n : {})\n })\n }));\n const wgsl = buildWgslSet(shaderEntries);\n const wgslSelection = buildWgslSelectionMetadata(selection, selectedStages);\n const permutationGraph = buildEffectPermutationGraph(resolved.effectRes);\n // The source is complete when it is a version-15 container. This used to be\n // read off a built reflection document, which made the document look load\n // bearing when it was only ever a consequence of the same version check.\n const sourceComplete = resolved.effectRes.m_version === 15;\n if (mode === \"all\" && !sourceComplete)\n {\n throw new Error(\n \"Effect package mode all requires a complete version-15 source\"\n );\n }\n\n const backendBodySet = mode === \"all\"\n ? buildEffectBackendBodySet(resolved.effectRes, permutationGraph, {\n source,\n selection,\n bindingPolicy: options.bindingPolicy\n })\n : null;\n const completeness = {\n packageValid: true,\n sourceComplete,\n backendComplete: false,\n runtimeComplete: false\n };\n const info = {\n format: \"CARBON_WEBGPU\",\n formatVersion: EFFECT_INFO_VERSION,\n packageKind: \"tr2-effect-webgpu\",\n sourcePath: source,\n outputPath,\n sourceIdentity,\n // The Carbon container version these bytes ARE, stated rather than\n // implied. The writer emits 15 and only 15, while the reader accepts\n // 8..15, so a consumer cannot infer what it was handed from what we can\n // read - and a v15 reader elsewhere (ccpwgl's Tw2Shader, Carbon itself)\n // needs to know this file is one it can parse before it tries.\n containerVersion,\n targetBackend: WEBGPU_BACKEND_NAME,\n backendPackage: FORMAT_WEBGPU_PACKAGE_NAME,\n backendPackageVersion: FORMAT_WEBGPU_PACKAGE_VERSION,\n translator: DXBC_WGSL_TRANSLATOR_NAME,\n translatorVersion: DXBC_WGSL_TRANSLATOR_VERSION,\n permutationGraph: {\n format: EFFECT_PERMUTATION_GRAPH_FORMAT,\n formatVersion: EFFECT_PERMUTATION_GRAPH_VERSION,\n sha256: sha256Utf8(`${JSON.stringify(permutationGraph)}\\n`),\n permutationCount: permutationGraph.variants.length,\n uniqueBodyCount: permutationGraph.bodies.length\n },\n ...(sourceComplete\n ? {\n sourceBodyCoverage: \"all-unique\",\n backendBodyCoverage: backendBodySet\n ? backendBodySet.coverage.bodies\n : \"selected\"\n }\n : {}),\n ...(backendBodySet\n ? {\n backendBodySet: {\n format: EFFECT_BACKEND_BODY_SET_FORMAT,\n formatVersion: EFFECT_BACKEND_BODY_SET_VERSION,\n sha256: sha256Utf8(`${JSON.stringify(backendBodySet)}\\n`),\n bodyCount: backendBodySet.bodyCount,\n translatedBodyCount: backendBodySet.translatedBodyCount,\n passUnitCount: backendBodySet.passUnitCount\n }\n }\n : {}),\n bodyMode: mode,\n completeness,\n stageCount: analysis.stages.length,\n selectedStageCount: selectedStages.length,\n shaderCount: wgsl.shaders.length,\n layoutCount: wgsl.layouts.length\n };\n const metadata = {\n effectName: analysis.effectName,\n containerVersion,\n sourcePath: source,\n bodyMode: mode,\n bodyIndex: analysis.bodyIndex,\n selectedOptions: analysis.selectedOptions,\n ...(wgslSelection ? { wgslSelection } : {})\n };\n // The switchover. Former stored chunks are now compatibility views over the\n // Carbon records: the permutation graph comes from the header and offset\n // table, and a translated pass comes from shaderData plus its trailing\n // block. The description tree retains only representable non-program\n // reflection; full portable source reflection remains in the rich\n // in-memory return value below.\n //\n // The wire no longer stores cross-chunk digests. The rich return value keeps\n // hashes as build evidence; they are not records in the emitted container.\n const emittedBodySet = backendBodySet\n ?? selectedModeBodySet(permutationGraph, wgsl, analysis.bodyIndex);\n const container = buildCarbonEffectContainer(\n resolved.effectRes,\n permutationGraph,\n emittedBodySet,\n {\n compilerVersion: resolved.effectRes.m_compilerVersionBytes,\n version: containerVersion\n }\n );\n const bytes = container.bytes;\n const inspection = inspectWithValues(bytes, {\n source,\n emit: \"json\"\n });\n const qualification = {\n ok: true,\n level: \"structural\",\n validator: \"carbon-webgpu-structural\",\n mode,\n ...completeness,\n selectedStageCount: selectedStages.length,\n shaderCount: wgsl.shaders.length,\n layoutCount: wgsl.layouts.length,\n ...(backendBodySet\n ? {\n backendBodyCount: backendBodySet.bodyCount,\n backendTranslatedBodyCount: backendBodySet.translatedBodyCount,\n backendPassUnitCount: backendBodySet.passUnitCount\n }\n : {}),\n nativeComparison: false\n };\n\n return {\n bytes,\n info: info,\n metadata: metadata,\n permutationGraph,\n analysis,\n wgsl,\n backendBodySet,\n inspection: inspection,\n qualification\n };\n}\n\n/**\n * Wraps a selected-mode translation as the body set the container emitter takes.\n *\n * `mode: \"all\"` builds a real body set covering every unique body. `mode:\n * \"selected\"` translates exactly one, and the container still carries every\n * permutation — that asymmetry is the format working as intended rather than a\n * gap. When the container emitter rebuilds an untranslated body, it retains\n * representable non-program description fields and writes zero-length program\n * slots.\n *\n * So this does not translate anything. It reshapes the one translation already\n * performed into the body-set contract, and marks every other body unsupported.\n *\n * @param {object} permutationGraph Validated permutation graph.\n * @param {object} wgsl Emitted WGSL set for the selected body.\n * @param {number} bodyIndex Selected permutation index.\n * @returns {object} Body set covering one translated body.\n */\nfunction selectedModeBodySet(permutationGraph, wgsl, bodyIndex)\n{\n const selectedBodyKey = permutationGraph.variants\n .find((variant) => variant.permutationIndex === bodyIndex)?.bodyKey\n ?? permutationGraph.variants[0]?.bodyKey\n ?? null;\n\n const shadersByPass = new Map();\n for (const shader of wgsl.shaders)\n {\n const passKey = `${shader.techniqueName}.pass${shader.passIndex}`;\n if (!shadersByPass.has(passKey)) shadersByPass.set(passKey, []);\n shadersByPass.get(passKey).push(shader);\n }\n\n const passUnits = [];\n const passes = [];\n for (const [ passKey, shaders ] of shadersByPass)\n {\n const transforms = (wgsl.resourceTransforms ?? [])\n .filter((transform) => transform.layoutKey === passKey);\n const unit = {\n key: `unit${passUnits.length}`,\n wgslSetVersion: wgsl.formatVersion,\n shaders,\n layouts: wgsl.layouts.filter((layout) => layout.key === passKey),\n ...(transforms.length ? { resourceTransforms: transforms } : {})\n };\n passUnits.push(unit);\n passes.push({ passKey, unitKey: unit.key });\n }\n\n const bodies = permutationGraph.bodies.map((body) => (body.key === selectedBodyKey\n ? {\n bodyKey: body.key,\n representativePermutationIndex: bodyIndex,\n status: \"translated\",\n error: null,\n passCount: passes.length,\n passes\n }\n : {\n bodyKey: body.key,\n representativePermutationIndex: permutationGraph.variants\n .find((variant) => variant.bodyKey === body.key)?.permutationIndex ?? 0,\n status: \"unsupported\",\n error: \"not translated in selected mode\",\n passCount: 0,\n passes: []\n }));\n\n return {\n bodyCount: bodies.length,\n translatedBodyCount: 1,\n passUnitCount: passUnits.length,\n passUnits,\n bodies\n };\n}\n\nfunction normalizeMode(value, allPermutations)\n{\n if (allPermutations !== undefined && typeof allPermutations !== \"boolean\")\n {\n throw new TypeError(\"Effect allPermutations compatibility option must be boolean\");\n }\n\n const mode = String(allPermutations === true ? \"all\" : value ?? \"selected\").trim();\n\n if (mode !== \"selected\" && mode !== \"all\")\n {\n throw new Error(\n `Effect package mode ${mode || \"<empty>\"} is not supported; `\n + \"supported modes are selected and all\"\n );\n }\n\n return mode;\n}\n\nfunction normalizeSource(value)\n{\n const source = String(value ?? \"memory\").trim();\n\n return source || \"memory\";\n}\n\nfunction normalizeOptionalString(value, name)\n{\n if (value === undefined || value === null)\n {\n return null;\n }\n\n const result = String(value).trim();\n\n if (!result)\n {\n throw new TypeError(`${name} must be a non-empty string or null`);\n }\n\n return result;\n}\n\nfunction normalizeSelection(value)\n{\n if (value === undefined || value === null)\n {\n return null;\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n {\n throw new TypeError(\"Effect stage selection must be an object\");\n }\n\n const techniqueName = String(value.techniqueName ?? \"\").trim();\n const passIndex = value.passIndex ?? null;\n const stageNames = value.stageNames ?? [];\n\n if (!techniqueName)\n {\n throw new TypeError(\"Effect stage selection requires techniqueName\");\n }\n\n if (passIndex !== null && (!Number.isSafeInteger(passIndex) || passIndex < 0))\n {\n throw new TypeError(\"Effect stage selection passIndex must be a non-negative integer or null\");\n }\n\n if (!Array.isArray(stageNames)\n || stageNames.some((stageName) => ![ \"vertex\", \"pixel\", \"compute\" ].includes(stageName)))\n {\n throw new TypeError(\"Effect stage selection supports only vertex, pixel, and compute stageNames\");\n }\n\n if (stageNames.length && passIndex === null)\n {\n throw new TypeError(\"Effect stageNames require an exact passIndex\");\n }\n\n return {\n techniqueName,\n passIndex,\n stageNames: [ ...new Set(stageNames) ]\n };\n}\n\nfunction normalizeSourceIdentity(value, source, input)\n{\n if (value !== undefined && value !== null\n && (!value || typeof value !== \"object\" || Array.isArray(value)))\n {\n throw new TypeError(\"Effect sourceIdentity must be an object\");\n }\n\n const bytes = input instanceof Uint8Array\n ? input\n : input instanceof ArrayBuffer\n ? new Uint8Array(input)\n : ArrayBuffer.isView(input)\n ? new Uint8Array(input.buffer, input.byteOffset, input.byteLength)\n : null;\n\n if (!bytes)\n {\n throw new TypeError(\"Effect input must be Uint8Array, ArrayBuffer, or ArrayBufferView bytes\");\n }\n\n const sha256 = sha256Bytes(bytes);\n if (value?.sha256 !== undefined && value?.sha256 !== null\n && value.sha256 !== sha256)\n {\n throw new Error(\n \"Effect sourceIdentity.sha256 does not match the exact effect input bytes\"\n );\n }\n\n return {\n logicalPath: value?.logicalPath ?? source,\n game: value?.game ?? null,\n client: value?.client ?? null,\n build: value?.build === undefined || value?.build === null ? null : String(value.build),\n byteLength: bytes.byteLength,\n md5: value?.md5 ?? null,\n sha256\n };\n}\n"],"names":["REFUSED_EFFECTS","Object","freeze","pattern","reason","rejectRefusedEffect","source","refused","find","entry","test","String","Error","buildEffectPackage","input","options","mode","normalizeMode","allPermutations","normalizeSource","containerVersion","resolveWriteVersion","version","outputPath","normalizeOptionalString","sourceIdentity","normalizeSourceIdentity","permutation","normalizeEffectPermutation","selection","normalizeSelection","resolved","readEffectAnalysis","effectRes","m_version","validateResolvedPermutation","selectedOptions","analysis","buildEffectAnalysis","decodeBytecode","decodeInstructions","bytecodeByKey","stageBytecodeByKey","selectedStages","selectEffectStages","stages","programsByKey","Map","programForKey","key","has","get","bytecode","bytes","length","program","lowerDxbcToIr","set","effectProfileContext","isParticleClearEffectCandidate","effectDescription","preflightParticleClearEffectProfile","irEntries","map","stage","passKey","techniqueName","passIndex","ir","semanticBindings","candidate","stageName","bindings","effectProfileProof","particleClearEffectProofFor","programsByPass","push","resourceTransformPlans","Array","from","entries","buildResourceTransformPlan","layoutKey","plans","proof","resourceTransformPlan","typedViews","assign","typedViewsFor","buildWgslBindingPlan","bindingPolicy","keys","shaderEntries","shader","buildWgsl","bindingPlan","wgsl","buildWgslSet","wgslSelection","buildWgslSelectionMetadata","permutationGraph","buildEffectPermutationGraph","sourceComplete","backendBodySet","buildEffectBackendBodySet","completeness","packageValid","backendComplete","runtimeComplete","info","format","formatVersion","EFFECT_INFO_VERSION","packageKind","sourcePath","targetBackend","WEBGPU_BACKEND_NAME","backendPackage","FORMAT_WEBGPU_PACKAGE_NAME","backendPackageVersion","FORMAT_WEBGPU_PACKAGE_VERSION","translator","DXBC_WGSL_TRANSLATOR_NAME","translatorVersion","DXBC_WGSL_TRANSLATOR_VERSION","EFFECT_PERMUTATION_GRAPH_FORMAT","EFFECT_PERMUTATION_GRAPH_VERSION","sha256","sha256Utf8","JSON","stringify","permutationCount","variants","uniqueBodyCount","bodies","sourceBodyCoverage","backendBodyCoverage","coverage","EFFECT_BACKEND_BODY_SET_FORMAT","EFFECT_BACKEND_BODY_SET_VERSION","bodyCount","translatedBodyCount","passUnitCount","bodyMode","stageCount","selectedStageCount","shaderCount","shaders","layoutCount","layouts","metadata","effectName","bodyIndex","emittedBodySet","selectedModeBodySet","container","buildCarbonEffectContainer","compilerVersion","m_compilerVersionBytes","inspection","inspectWithValues","emit","qualification","ok","level","validator","backendBodyCount","backendTranslatedBodyCount","backendPassUnitCount","nativeComparison","selectedBodyKey","variant","permutationIndex","bodyKey","shadersByPass","passUnits","passes","transforms","resourceTransforms","filter","transform","unit","wgslSetVersion","layout","unitKey","body","representativePermutationIndex","status","error","passCount","value","undefined","TypeError","trim","name","result","isArray","stageNames","Number","isSafeInteger","some","includes","Set","Uint8Array","ArrayBuffer","isView","buffer","byteOffset","byteLength","sha256Bytes","logicalPath","game","client","build","md5"],"mappings":"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"}
1
+ {"version":3,"file":"packageEffect.js","sources":["../../../../../../src/resource/formats/webgpu/core/packageEffect.js"],"sourcesContent":["import { readEffectAnalysis } from \"./effectAnalysis.js\";\nimport { buildEffectAnalysis, inspectWithValues } from \"./helpers.js\";\nimport { buildCarbonEffectContainer } from \"./buildCarbonEffectContainer.js\";\nimport { lowerDxbcToIr } from \"./ir/lowerDxbcToIr.js\";\nimport { buildWgslBindingPlan } from \"./wgsl/buildWgslBindingPlan.js\";\nimport { typedViewsFor } from \"../../hlsl/core/carbonTypedViews.js\";\nimport { buildWgsl } from \"./wgsl/emitWgsl.js\";\nimport { withoutUnboundUavs } from \"./wgsl/wgslTypedViews.js\";\nimport { withEmulatedAddressing } from \"./wgsl/emulatedAddressing.js\";\nimport { buildWgslSet } from \"./wgsl/buildWgslSet.js\";\nimport { buildResourceTransformPlan } from \"./wgsl/buildResourceTransformPlan.js\";\nimport {\n buildEffectPermutationGraph,\n EFFECT_PERMUTATION_GRAPH_FORMAT,\n EFFECT_PERMUTATION_GRAPH_VERSION\n} from \"../../../format/effect/effectPermutationGraph.js\";\nimport {\n buildEffectBackendBodySet,\n EFFECT_BACKEND_BODY_SET_FORMAT,\n EFFECT_BACKEND_BODY_SET_VERSION\n} from \"./effectBackendBodySet.js\";\nimport {\n DXBC_WGSL_TRANSLATOR_NAME,\n DXBC_WGSL_TRANSLATOR_VERSION,\n EFFECT_INFO_VERSION,\n FORMAT_WEBGPU_PACKAGE_NAME,\n FORMAT_WEBGPU_PACKAGE_VERSION,\n WEBGPU_BACKEND_NAME\n} from \"./packageMetadata.js\";\nimport { sha256Bytes, sha256Utf8 } from \"../../../format/effect/sha256.js\";\nimport { resolveWriteVersion } from \"../../../format/carbonEffect/carbonEffectRecords.js\";\nimport {\n isParticleClearEffectCandidate,\n particleClearEffectProofFor,\n preflightParticleClearEffectProfile\n} from \"./wgsl/lowerParticleClearComputePrograms.js\";\nimport {\n buildWgslSelectionMetadata,\n normalizeEffectPermutation,\n selectEffectStages,\n validateResolvedPermutation\n} from \"./packageEffectSelection.js\";\n\n/**\n * Effects this backend refuses by name, whatever the translator can lower.\n *\n * `system/crash` must never run: without its sentinel its loop visits all\n * 2^32 indices and never terminates, and several workgroups race where it\n * expects exactly one; an iteration cap would change what it does, and the\n * package proves neither premise (`lowerComputeProgram.js`). It is refused\n * here by path, for every tier and backend directory, so a wider general\n * compute path can never let it through.\n */\nconst REFUSED_EFFECTS = Object.freeze([\n { pattern: /\\/managed\\/space\\/system\\/crash\\.[^/]*$/iu, reason: \"system/crash never terminates without its sentinel and races across workgroups\" }\n]);\n\n/** Throws for an effect this backend refuses by name. */\nexport function rejectRefusedEffect(source)\n{\n const refused = REFUSED_EFFECTS.find((entry) => entry.pattern.test(String(source ?? \"\")));\n if (refused) throw new Error(`WebGPU refuses ${source}: ${refused.reason}`);\n}\n\n/**\n * Build one structurally valid Carbon WebGPU package from compiled Tr2 effect bytes.\n *\n * The version-15 build result retains every unique body's portable source\n * reflection as in-memory evidence while the emitted Carbon wire stores WGSL\n * or empty program slots plus representable non-program fields. Filesystem\n * concerns remain in callers.\n *\n * Options:\n * - `mode`: `\"selected\"` (default) translates only the resolved body's\n * requested complete passes; `\"all\"` first requires that selection to\n * translate, then attempts every distinct body. `allPermutations: true`\n * forces `\"all\"`. Neither mode drops permutation rows.\n * - `permutation`: `{ name, value }[]` or a `Map`; unknown, duplicate or\n * unresolved assertions throw.\n * - `selection`: `{ techniqueName, passIndex, stageNames }`; `stageNames`\n * requires an exact `passIndex`.\n * - `bindingPolicy.sharedIdentities`: D3D identities allowed to share one\n * physical binding across stages.\n * - `source`, `outputPath`, `sourceIdentity`: returned provenance only; the\n * wire's backend identity comes from the consumer's resource path. A\n * supplied `sourceIdentity.sha256` must match the exact input bytes.\n *\n * Returned fields (caller evidence, none stored separately in the wire):\n * - `bytes`: the Carbon v15 container;\n * - `info`: producer, source, translation-scope (`backendBodyCoverage`) and\n * completeness evidence;\n * - `metadata`: resolved selection and caller provenance;\n * - `permutationGraph`: complete source permutation and body-alias view;\n * - `analysis`: selected-body diagnostic analysis;\n * - `wgsl`: emitted shaders, layouts and resource transforms;\n * - `backendBodySet`: all-body translation result, or `null` in selected mode;\n * - `inspection`: summary from rereading the emitted bytes;\n * - `qualification`: structural outcome and translation counts.\n *\n * `qualification.packageValid` is structural validity only; `backendComplete`\n * and `runtimeComplete` stay false because translating bodies does not prove\n * pipeline preparation or a draw. Compiler IR is transient and not returned.\n *\n * @param {Uint8Array|ArrayBuffer|ArrayBufferView} input Compiled effect bytes.\n * @param {object} [options] Source, body-mode, permutation, and stage-selection policy.\n * @returns {object} Package bytes plus inspection and provenance documents.\n */\nexport function buildEffectPackage(input, options = {})\n{\n const mode = normalizeMode(options.mode, options.allPermutations);\n const source = normalizeSource(options.source);\n rejectRefusedEffect(source);\n // Resolved once, up front, so an unwritable request fails before any\n // translation work is done rather than at the final assembly step. The\n // reported value is what was actually emitted, never the constant.\n const containerVersion = resolveWriteVersion(options.version);\n const outputPath = normalizeOptionalString(options.outputPath, \"Effect outputPath\");\n const sourceIdentity = normalizeSourceIdentity(\n options.sourceIdentity,\n source,\n input\n );\n const permutation = normalizeEffectPermutation(options.permutation);\n const selection = normalizeSelection(options.selection);\n const resolved = readEffectAnalysis(input, { source, permutation });\n\n // One INFO version means one contract, and that contract requires complete\n // source reflection, which only version-15 input can supply.\n if (resolved.effectRes?.m_version !== 15)\n {\n throw new Error(\n \"Effect package requires a version-15 compiled effect, got version \"\n + (resolved.effectRes?.m_version ?? \"unknown\")\n );\n }\n\n validateResolvedPermutation(permutation, resolved.selection?.selectedOptions ?? []);\n\n const analysis = buildEffectAnalysis(resolved, {\n source,\n decodeBytecode: false,\n decodeInstructions: false\n });\n const bytecodeByKey = resolved.stageBytecodeByKey;\n const selectedStages = selectEffectStages(analysis.stages, selection);\n const programsByKey = new Map();\n const programForKey = (key) =>\n {\n if (programsByKey.has(key)) return programsByKey.get(key);\n const bytecode = bytecodeByKey.get(key)?.bytes;\n\n if (!bytecode?.length)\n {\n throw new Error(`${key} has no shader bytecode`);\n }\n const program = lowerDxbcToIr(\n bytecode,\n { source: `${source}#${key}` }\n );\n programsByKey.set(key, program);\n return program;\n };\n let effectProfileContext = null;\n if (isParticleClearEffectCandidate(resolved.effectDescription))\n {\n programForKey(\"Main.pass0.compute\");\n programForKey(\"Main.pass1.compute\");\n effectProfileContext = preflightParticleClearEffectProfile(\n resolved.effectDescription,\n programsByKey\n );\n }\n const irEntries = selectedStages.map((stage) => ({\n key: stage.key,\n passKey: `${stage.techniqueName}.pass${stage.passIndex}`,\n ir: programForKey(stage.key),\n semanticBindings: analysis.stages.find((candidate) =>\n candidate.techniqueName === stage.techniqueName\n && candidate.passIndex === stage.passIndex\n && candidate.stageName === stage.stageName)?.bindings || [],\n effectProfileProof: particleClearEffectProofFor(\n effectProfileContext,\n stage.key\n )\n }));\n for (const entry of irEntries)\n {\n entry.ir = withEmulatedAddressing(withoutUnboundUavs(entry.ir, entry.semanticBindings), entry.semanticBindings);\n }\n const programsByPass = new Map();\n\n for (const entry of irEntries)\n {\n if (!programsByPass.has(entry.passKey))\n {\n programsByPass.set(entry.passKey, []);\n }\n\n programsByPass.get(entry.passKey).push(entry);\n }\n\n const resourceTransformPlans = new Map(Array.from(programsByPass, ([ key, entries ]) => [\n key,\n buildResourceTransformPlan(\n entries.map((entry) => ({\n ir: entry.ir,\n semanticBindings: entry.semanticBindings\n })),\n { layoutKey: key }\n )\n ]));\n const plans = new Map(Array.from(programsByPass, ([ key, entries ]) =>\n {\n const proof = entries.find((entry) => entry.effectProfileProof)\n ?.effectProfileProof ?? null;\n const resourceTransformPlan = resourceTransformPlans.get(key);\n const typedViews = Object.assign({}, ...entries.map((entry) => typedViewsFor(entry.semanticBindings)));\n return [\n key,\n buildWgslBindingPlan(\n entries.map((entry) => entry.ir),\n {\n ...(options.bindingPolicy ?? {}),\n ...(proof ? { effectProfileProof: proof } : {}),\n ...(resourceTransformPlan ? { resourceTransformPlan } : {}),\n ...(Object.keys(typedViews).length ? { typedViews } : {})\n }\n )\n ];\n }));\n const shaderEntries = irEntries.map((entry) => ({\n key: entry.key,\n shader: buildWgsl(entry.ir, {\n bindingPlan: plans.get(entry.passKey),\n ...(resourceTransformPlans.get(entry.passKey)\n ? { resourceTransformPlan: resourceTransformPlans.get(entry.passKey) }\n : {}),\n ...(entry.effectProfileProof\n ? { effectProfileProof: entry.effectProfileProof }\n : {})\n })\n }));\n const wgsl = buildWgslSet(shaderEntries);\n const wgslSelection = buildWgslSelectionMetadata(selection, selectedStages);\n const permutationGraph = buildEffectPermutationGraph(resolved.effectRes);\n // The source is complete when it is a version-15 container. This used to be\n // read off a built reflection document, which made the document look load\n // bearing when it was only ever a consequence of the same version check.\n const sourceComplete = resolved.effectRes.m_version === 15;\n if (mode === \"all\" && !sourceComplete)\n {\n throw new Error(\n \"Effect package mode all requires a complete version-15 source\"\n );\n }\n\n const backendBodySet = mode === \"all\"\n ? buildEffectBackendBodySet(resolved.effectRes, permutationGraph, {\n source,\n selection,\n bindingPolicy: options.bindingPolicy\n })\n : null;\n const completeness = {\n packageValid: true,\n sourceComplete,\n backendComplete: false,\n runtimeComplete: false\n };\n const info = {\n format: \"CARBON_WEBGPU\",\n formatVersion: EFFECT_INFO_VERSION,\n packageKind: \"tr2-effect-webgpu\",\n sourcePath: source,\n outputPath,\n sourceIdentity,\n // The Carbon container version these bytes ARE, stated rather than\n // implied. The writer emits 15 and only 15, while the reader accepts\n // 8..15, so a consumer cannot infer what it was handed from what we can\n // read - and a v15 reader elsewhere (ccpwgl's Tw2Shader, Carbon itself)\n // needs to know this file is one it can parse before it tries.\n containerVersion,\n targetBackend: WEBGPU_BACKEND_NAME,\n backendPackage: FORMAT_WEBGPU_PACKAGE_NAME,\n backendPackageVersion: FORMAT_WEBGPU_PACKAGE_VERSION,\n translator: DXBC_WGSL_TRANSLATOR_NAME,\n translatorVersion: DXBC_WGSL_TRANSLATOR_VERSION,\n permutationGraph: {\n format: EFFECT_PERMUTATION_GRAPH_FORMAT,\n formatVersion: EFFECT_PERMUTATION_GRAPH_VERSION,\n sha256: sha256Utf8(`${JSON.stringify(permutationGraph)}\\n`),\n permutationCount: permutationGraph.variants.length,\n uniqueBodyCount: permutationGraph.bodies.length\n },\n ...(sourceComplete\n ? {\n sourceBodyCoverage: \"all-unique\",\n backendBodyCoverage: backendBodySet\n ? backendBodySet.coverage.bodies\n : \"selected\"\n }\n : {}),\n ...(backendBodySet\n ? {\n backendBodySet: {\n format: EFFECT_BACKEND_BODY_SET_FORMAT,\n formatVersion: EFFECT_BACKEND_BODY_SET_VERSION,\n sha256: sha256Utf8(`${JSON.stringify(backendBodySet)}\\n`),\n bodyCount: backendBodySet.bodyCount,\n translatedBodyCount: backendBodySet.translatedBodyCount,\n passUnitCount: backendBodySet.passUnitCount\n }\n }\n : {}),\n bodyMode: mode,\n completeness,\n stageCount: analysis.stages.length,\n selectedStageCount: selectedStages.length,\n shaderCount: wgsl.shaders.length,\n layoutCount: wgsl.layouts.length\n };\n const metadata = {\n effectName: analysis.effectName,\n containerVersion,\n sourcePath: source,\n bodyMode: mode,\n bodyIndex: analysis.bodyIndex,\n selectedOptions: analysis.selectedOptions,\n ...(wgslSelection ? { wgslSelection } : {})\n };\n // The switchover. Former stored chunks are now compatibility views over the\n // Carbon records: the permutation graph comes from the header and offset\n // table, and a translated pass comes from shaderData plus its trailing\n // block. The description tree retains only representable non-program\n // reflection; full portable source reflection remains in the rich\n // in-memory return value below.\n //\n // The wire no longer stores cross-chunk digests. The rich return value keeps\n // hashes as build evidence; they are not records in the emitted container.\n const emittedBodySet = backendBodySet\n ?? selectedModeBodySet(permutationGraph, wgsl, analysis.bodyIndex);\n const container = buildCarbonEffectContainer(\n resolved.effectRes,\n permutationGraph,\n emittedBodySet,\n {\n compilerVersion: resolved.effectRes.m_compilerVersionBytes,\n version: containerVersion\n }\n );\n const bytes = container.bytes;\n const inspection = inspectWithValues(bytes, {\n source,\n emit: \"json\"\n });\n const qualification = {\n ok: true,\n level: \"structural\",\n validator: \"carbon-webgpu-structural\",\n mode,\n ...completeness,\n selectedStageCount: selectedStages.length,\n shaderCount: wgsl.shaders.length,\n layoutCount: wgsl.layouts.length,\n ...(backendBodySet\n ? {\n backendBodyCount: backendBodySet.bodyCount,\n backendTranslatedBodyCount: backendBodySet.translatedBodyCount,\n backendPassUnitCount: backendBodySet.passUnitCount\n }\n : {}),\n nativeComparison: false\n };\n\n return {\n bytes,\n info: info,\n metadata: metadata,\n permutationGraph,\n analysis,\n wgsl,\n backendBodySet,\n inspection: inspection,\n qualification\n };\n}\n\n/**\n * Wraps a selected-mode translation as the body set the container emitter takes.\n *\n * `mode: \"all\"` builds a real body set covering every unique body. `mode:\n * \"selected\"` translates exactly one, and the container still carries every\n * permutation — that asymmetry is the format working as intended rather than a\n * gap. When the container emitter rebuilds an untranslated body, it retains\n * representable non-program description fields and writes zero-length program\n * slots.\n *\n * So this does not translate anything. It reshapes the one translation already\n * performed into the body-set contract, and marks every other body unsupported.\n *\n * @param {object} permutationGraph Validated permutation graph.\n * @param {object} wgsl Emitted WGSL set for the selected body.\n * @param {number} bodyIndex Selected permutation index.\n * @returns {object} Body set covering one translated body.\n */\nfunction selectedModeBodySet(permutationGraph, wgsl, bodyIndex)\n{\n const selectedBodyKey = permutationGraph.variants\n .find((variant) => variant.permutationIndex === bodyIndex)?.bodyKey\n ?? permutationGraph.variants[0]?.bodyKey\n ?? null;\n\n const shadersByPass = new Map();\n for (const shader of wgsl.shaders)\n {\n const passKey = `${shader.techniqueName}.pass${shader.passIndex}`;\n if (!shadersByPass.has(passKey)) shadersByPass.set(passKey, []);\n shadersByPass.get(passKey).push(shader);\n }\n\n const passUnits = [];\n const passes = [];\n for (const [ passKey, shaders ] of shadersByPass)\n {\n const transforms = (wgsl.resourceTransforms ?? [])\n .filter((transform) => transform.layoutKey === passKey);\n const unit = {\n key: `unit${passUnits.length}`,\n wgslSetVersion: wgsl.formatVersion,\n shaders,\n layouts: wgsl.layouts.filter((layout) => layout.key === passKey),\n ...(transforms.length ? { resourceTransforms: transforms } : {})\n };\n passUnits.push(unit);\n passes.push({ passKey, unitKey: unit.key });\n }\n\n const bodies = permutationGraph.bodies.map((body) => (body.key === selectedBodyKey\n ? {\n bodyKey: body.key,\n representativePermutationIndex: bodyIndex,\n status: \"translated\",\n error: null,\n passCount: passes.length,\n passes\n }\n : {\n bodyKey: body.key,\n representativePermutationIndex: permutationGraph.variants\n .find((variant) => variant.bodyKey === body.key)?.permutationIndex ?? 0,\n status: \"unsupported\",\n error: \"not translated in selected mode\",\n passCount: 0,\n passes: []\n }));\n\n return {\n bodyCount: bodies.length,\n translatedBodyCount: 1,\n passUnitCount: passUnits.length,\n passUnits,\n bodies\n };\n}\n\nfunction normalizeMode(value, allPermutations)\n{\n if (allPermutations !== undefined && typeof allPermutations !== \"boolean\")\n {\n throw new TypeError(\"Effect allPermutations compatibility option must be boolean\");\n }\n\n const mode = String(allPermutations === true ? \"all\" : value ?? \"selected\").trim();\n\n if (mode !== \"selected\" && mode !== \"all\")\n {\n throw new Error(\n `Effect package mode ${mode || \"<empty>\"} is not supported; `\n + \"supported modes are selected and all\"\n );\n }\n\n return mode;\n}\n\nfunction normalizeSource(value)\n{\n const source = String(value ?? \"memory\").trim();\n\n return source || \"memory\";\n}\n\nfunction normalizeOptionalString(value, name)\n{\n if (value === undefined || value === null)\n {\n return null;\n }\n\n const result = String(value).trim();\n\n if (!result)\n {\n throw new TypeError(`${name} must be a non-empty string or null`);\n }\n\n return result;\n}\n\nfunction normalizeSelection(value)\n{\n if (value === undefined || value === null)\n {\n return null;\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n {\n throw new TypeError(\"Effect stage selection must be an object\");\n }\n\n const techniqueName = String(value.techniqueName ?? \"\").trim();\n const passIndex = value.passIndex ?? null;\n const stageNames = value.stageNames ?? [];\n\n if (!techniqueName)\n {\n throw new TypeError(\"Effect stage selection requires techniqueName\");\n }\n\n if (passIndex !== null && (!Number.isSafeInteger(passIndex) || passIndex < 0))\n {\n throw new TypeError(\"Effect stage selection passIndex must be a non-negative integer or null\");\n }\n\n if (!Array.isArray(stageNames)\n || stageNames.some((stageName) => ![ \"vertex\", \"pixel\", \"compute\" ].includes(stageName)))\n {\n throw new TypeError(\"Effect stage selection supports only vertex, pixel, and compute stageNames\");\n }\n\n if (stageNames.length && passIndex === null)\n {\n throw new TypeError(\"Effect stageNames require an exact passIndex\");\n }\n\n return {\n techniqueName,\n passIndex,\n stageNames: [ ...new Set(stageNames) ]\n };\n}\n\nfunction normalizeSourceIdentity(value, source, input)\n{\n if (value !== undefined && value !== null\n && (!value || typeof value !== \"object\" || Array.isArray(value)))\n {\n throw new TypeError(\"Effect sourceIdentity must be an object\");\n }\n\n const bytes = input instanceof Uint8Array\n ? input\n : input instanceof ArrayBuffer\n ? new Uint8Array(input)\n : ArrayBuffer.isView(input)\n ? new Uint8Array(input.buffer, input.byteOffset, input.byteLength)\n : null;\n\n if (!bytes)\n {\n throw new TypeError(\"Effect input must be Uint8Array, ArrayBuffer, or ArrayBufferView bytes\");\n }\n\n const sha256 = sha256Bytes(bytes);\n if (value?.sha256 !== undefined && value?.sha256 !== null\n && value.sha256 !== sha256)\n {\n throw new Error(\n \"Effect sourceIdentity.sha256 does not match the exact effect input bytes\"\n );\n }\n\n return {\n logicalPath: value?.logicalPath ?? source,\n game: value?.game ?? null,\n client: value?.client ?? null,\n build: value?.build === undefined || value?.build === null ? null : String(value.build),\n byteLength: bytes.byteLength,\n md5: value?.md5 ?? null,\n sha256\n };\n}\n"],"names":["REFUSED_EFFECTS","Object","freeze","pattern","reason","rejectRefusedEffect","source","refused","find","entry","test","String","Error","buildEffectPackage","input","options","mode","normalizeMode","allPermutations","normalizeSource","containerVersion","resolveWriteVersion","version","outputPath","normalizeOptionalString","sourceIdentity","normalizeSourceIdentity","permutation","normalizeEffectPermutation","selection","normalizeSelection","resolved","readEffectAnalysis","effectRes","m_version","validateResolvedPermutation","selectedOptions","analysis","buildEffectAnalysis","decodeBytecode","decodeInstructions","bytecodeByKey","stageBytecodeByKey","selectedStages","selectEffectStages","stages","programsByKey","Map","programForKey","key","has","get","bytecode","bytes","length","program","lowerDxbcToIr","set","effectProfileContext","isParticleClearEffectCandidate","effectDescription","preflightParticleClearEffectProfile","irEntries","map","stage","passKey","techniqueName","passIndex","ir","semanticBindings","candidate","stageName","bindings","effectProfileProof","particleClearEffectProofFor","withEmulatedAddressing","withoutUnboundUavs","programsByPass","push","resourceTransformPlans","Array","from","entries","buildResourceTransformPlan","layoutKey","plans","proof","resourceTransformPlan","typedViews","assign","typedViewsFor","buildWgslBindingPlan","bindingPolicy","keys","shaderEntries","shader","buildWgsl","bindingPlan","wgsl","buildWgslSet","wgslSelection","buildWgslSelectionMetadata","permutationGraph","buildEffectPermutationGraph","sourceComplete","backendBodySet","buildEffectBackendBodySet","completeness","packageValid","backendComplete","runtimeComplete","info","format","formatVersion","EFFECT_INFO_VERSION","packageKind","sourcePath","targetBackend","WEBGPU_BACKEND_NAME","backendPackage","FORMAT_WEBGPU_PACKAGE_NAME","backendPackageVersion","FORMAT_WEBGPU_PACKAGE_VERSION","translator","DXBC_WGSL_TRANSLATOR_NAME","translatorVersion","DXBC_WGSL_TRANSLATOR_VERSION","EFFECT_PERMUTATION_GRAPH_FORMAT","EFFECT_PERMUTATION_GRAPH_VERSION","sha256","sha256Utf8","JSON","stringify","permutationCount","variants","uniqueBodyCount","bodies","sourceBodyCoverage","backendBodyCoverage","coverage","EFFECT_BACKEND_BODY_SET_FORMAT","EFFECT_BACKEND_BODY_SET_VERSION","bodyCount","translatedBodyCount","passUnitCount","bodyMode","stageCount","selectedStageCount","shaderCount","shaders","layoutCount","layouts","metadata","effectName","bodyIndex","emittedBodySet","selectedModeBodySet","container","buildCarbonEffectContainer","compilerVersion","m_compilerVersionBytes","inspection","inspectWithValues","emit","qualification","ok","level","validator","backendBodyCount","backendTranslatedBodyCount","backendPassUnitCount","nativeComparison","selectedBodyKey","variant","permutationIndex","bodyKey","shadersByPass","passUnits","passes","transforms","resourceTransforms","filter","transform","unit","wgslSetVersion","layout","unitKey","body","representativePermutationIndex","status","error","passCount","value","undefined","TypeError","trim","name","result","isArray","stageNames","Number","isSafeInteger","some","includes","Set","Uint8Array","ArrayBuffer","isView","buffer","byteOffset","byteLength","sha256Bytes","logicalPath","game","client","build","md5"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { EmulatedAddressingHelpers } from './emulatedAddressing.js';
2
+ import { CARBON_BACKEND_UNORM_TARGET_OVERRIDE } from '../../../../format/carbonEffect/carbonEffectBackendBlock.js';
2
3
  import { lowerDxbcToIr } from '../ir/lowerDxbcToIr.js';
3
4
  import { lowerComputeProgram } from './lowerComputeProgram.js';
4
5
  import { lowerFragmentProgram } from './lowerFragmentProgram.js';
@@ -310,6 +311,16 @@ function buildWgsl(input, options = {}) {
310
311
  const hasInputs = interfaceInputs.length > 0;
311
312
  if (hasInputs) emitStruct(lines, `${prefix}Input`, interfaceInputs);
312
313
  if (!compute) emitStruct(lines, `${prefix}Output`, interfaceOutputs, program.stage === "vertex");
314
+
315
+ // D3D stores a float written to a UNORM target clamped to [0, 1], NaN as
316
+ // 0. WebGPU has no 16-bit UNORM the backend can render and filter, so it
317
+ // renders those into float stand-ins and sets this override on the
318
+ // pipeline to store the same values (CARBON_BACKEND_UNORM_TARGET_OVERRIDE).
319
+ const unormOutputs = program.stage === "fragment" ? interfaceOutputs.filter(field => field.attribute.kind !== "builtin" && /f32/u.test(field.type)) : [];
320
+ for (const field of unormOutputs) {
321
+ lines.push(`override ${CARBON_BACKEND_UNORM_TARGET_OVERRIDE}${field.attribute.index}: bool = false;`);
322
+ }
323
+ if (unormOutputs.length) lines.push("");
313
324
  if (program.immediateConstantBuffer?.length) emitImmediateConstantBuffer(lines, program.immediateConstantBuffer);
314
325
  if (program.constTables?.length) emitConstTables(lines, program.constTables);
315
326
  const workgroupDeclarations = computeWorkgroupVariableDeclarations(program);
@@ -356,6 +367,15 @@ function buildWgsl(input, options = {}) {
356
367
  } else if (statement.kind === "value-assignment") {
357
368
  lines.push(`${indent}${valueAssignment(statement.name, statement.expression.code)}`);
358
369
  } else if (statement.kind === "return") {
370
+ // NaN is found by its bits: WGSL lets a compiler assume floats are
371
+ // never NaN, so `v != v` may fold to false.
372
+ for (const field of unormOutputs) {
373
+ const value = `output.${field.name}`;
374
+ const zero = `${field.type}(0.0)`;
375
+ const bits = field.type.replace("f32", "u32");
376
+ const nan = `(bitcast<${bits}>(${value}) & ${bits}(0x7fffffffu)) > ${bits}(0x7f800000u)`;
377
+ lines.push(`${indent}if (${CARBON_BACKEND_UNORM_TARGET_OVERRIDE}${field.attribute.index}) { ${value} = clamp(select(${value}, ${zero}, ${nan}), ${zero}, ${field.type}(1.0)); }`);
378
+ }
359
379
  lines.push(compute ? `${indent}return;` : `${indent}return output;`);
360
380
  } else if (statement.kind === "discard") {
361
381
  lines.push(`${indent}discard;`);