@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.
- package/dist/global/consts/effectPaths.js +4 -1
- package/dist/global/consts/effectPaths.js.map +1 -1
- package/dist/global/consts/index.js +1 -1
- package/dist/global/index.js +1 -1
- package/dist/index.js +3 -3
- package/dist/resource/format/carbonEffect/carbonEffectBackendBlock.js +19 -2
- package/dist/resource/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
- package/dist/resource/format/index.js +1 -1
- package/dist/resource/formats/hlsl/core/carbonTypedViews.js +121 -65
- package/dist/resource/formats/hlsl/core/carbonTypedViews.js.map +1 -1
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js +10 -7
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
- package/dist/resource/formats/webgpu/core/effectBackendBodySet.js +3 -1
- package/dist/resource/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
- package/dist/resource/formats/webgpu/core/packageEffect.js +5 -0
- package/dist/resource/formats/webgpu/core/packageEffect.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/emitWgsl.js +20 -0
- package/dist/resource/formats/webgpu/core/wgsl/emitWgsl.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/emulatedAddressing.js +93 -4
- package/dist/resource/formats/webgpu/core/wgsl/emulatedAddressing.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/lowerBindingLayout.js +74 -64
- package/dist/resource/formats/webgpu/core/wgsl/lowerBindingLayout.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/lowerFragmentProgram.js +16 -7
- package/dist/resource/formats/webgpu/core/wgsl/lowerFragmentProgram.js.map +1 -1
- package/dist/resource/formats/webgpu/core/wgsl/wgslTypedViews.js +69 -27
- package/dist/resource/formats/webgpu/core/wgsl/wgslTypedViews.js.map +1 -1
- package/dist/resource/geometry/registerGeometryResources.js +10 -1
- package/dist/resource/geometry/registerGeometryResources.js.map +1 -1
- package/dist/sof/EveSOFDNA.js +4 -2
- package/dist/sof/EveSOFDNA.js.map +1 -1
- package/dist/sof/EveSOFDataMgr.js +83 -69
- package/dist/sof/EveSOFDataMgr.js.map +1 -1
- package/dist/trinity/core/Tr2Denoiser.js +6 -1
- package/dist/trinity/core/Tr2Denoiser.js.map +1 -1
- package/dist/trinity/core/Tr2ShadowMap.js +7 -2
- package/dist/trinity/core/Tr2ShadowMap.js.map +1 -1
- package/dist/trinity/core/context/Tr2RenderContext.js +43 -0
- package/dist/trinity/core/context/Tr2RenderContext.js.map +1 -1
- package/dist/trinity/core/device/Tr2GpuStructuredBuffer.js +134 -0
- package/dist/trinity/core/device/Tr2GpuStructuredBuffer.js.map +1 -0
- package/dist/trinity/core/index.js +1 -0
- package/dist/trinity/core/index.js.map +1 -1
- package/dist/trinity/core/lighting/Tr2LightManager.js +410 -124
- package/dist/trinity/core/lighting/Tr2LightManager.js.map +1 -1
- package/dist/trinity/eve/effect/lensflare/EveLensflare.js +303 -312
- package/dist/trinity/eve/effect/lensflare/EveLensflare.js.map +1 -1
- package/dist/trinity/eve/effect/lensflare/EveOccluder.js +117 -0
- package/dist/trinity/eve/effect/lensflare/EveOccluder.js.map +1 -0
- package/dist/trinity/eve/index.js +1 -0
- package/dist/trinity/eve/index.js.map +1 -1
- package/dist/trinity/eve/scene/EveSpaceScene.js +286 -6
- package/dist/trinity/eve/scene/EveSpaceScene.js.map +1 -1
- package/dist/trinity/eve/scene/EveSpaceSceneRenderDriver.js +212 -32
- package/dist/trinity/eve/scene/EveSpaceSceneRenderDriver.js.map +1 -1
- package/dist/trinity/generated/eve/effect/index.js +0 -1
- package/dist/trinity/generated/eve/effect/index.js.map +1 -1
- package/dist/trinity/generated/eve/index.js +0 -1
- package/dist/trinity/generated/eve/index.js.map +1 -1
- package/dist/trinity/generated/index.js +0 -2
- package/dist/trinity/generated/index.js.map +1 -1
- package/dist/trinity/generated/trinityCore/index.js +0 -1
- package/dist/trinity/generated/trinityCore/index.js.map +1 -1
- package/dist/trinity/index.js +2 -2
- package/dist/trinity/postProcess/Tr2PostProcessRenderer.js +4 -1
- package/dist/trinity/postProcess/Tr2PostProcessRenderer.js.map +1 -1
- package/dist/trinity/postProcess/Tr2SSAO.js +282 -21
- package/dist/trinity/postProcess/Tr2SSAO.js.map +1 -1
- package/dist/trinity/shader/parameter/Tr2RuntimeTextureParameter.js +71 -53
- package/dist/trinity/shader/parameter/Tr2RuntimeTextureParameter.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuRenderContextAL.js +81 -18
- package/dist/trinityal/webgpu/CjsWebgpuRenderContextAL.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuResourceSetAL.js +46 -4
- package/dist/trinityal/webgpu/CjsWebgpuResourceSetAL.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuShaderAL.js +32 -1
- package/dist/trinityal/webgpu/CjsWebgpuShaderAL.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuShaderProgramAL.js +27 -0
- package/dist/trinityal/webgpu/CjsWebgpuShaderProgramAL.js.map +1 -1
- package/dist/trinityal/webgpu/CjsWebgpuTextureAL.js +29 -4
- package/dist/trinityal/webgpu/CjsWebgpuTextureAL.js.map +1 -1
- package/dist/trinityal/webgpu/core/CjsWebgpuPsoDescription.js +32 -2
- package/dist/trinityal/webgpu/core/CjsWebgpuPsoDescription.js.map +1 -1
- package/dist/trinityal/webgpu/core/CjsWebgpuUtils.js +57 -5
- package/dist/trinityal/webgpu/core/CjsWebgpuUtils.js.map +1 -1
- package/dist/trinityal/webgpu/core/CjsWebgpuWorkQueue.js +111 -5
- package/dist/trinityal/webgpu/core/CjsWebgpuWorkQueue.js.map +1 -1
- package/docs/trinity/reference/classes/generated.md +20 -20
- package/docs/trinity/reference/classes/post-process.md +1 -1
- package/package.json +1 -1
- package/dist/trinity/generated/eve/effect/EveOccluder.js +0 -38
- package/dist/trinity/generated/eve/effect/EveOccluder.js.map +0 -1
- package/dist/trinity/generated/trinityCore/Tr2GpuStructuredBuffer.js +0 -48
- package/dist/trinity/generated/trinityCore/Tr2GpuStructuredBuffer.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitWgsl.js","sources":["../../../../../../../src/resource/formats/webgpu/core/wgsl/emitWgsl.js"],"sourcesContent":["import { EmulatedAddressingHelpers } from \"./emulatedAddressing.js\";\nimport { lowerDxbcToIr } from \"../ir/lowerDxbcToIr.js\";\nimport { lowerComputeProgram } from \"./lowerComputeProgram.js\";\nimport { lowerFragmentProgram } from \"./lowerFragmentProgram.js\";\nimport { lowerVertexProgram } from \"./lowerVertexProgram.js\";\n\nconst COMPONENTS = [ \"x\", \"y\", \"z\", \"w\" ];\nconst SAFE_WORKGROUP_IDENTIFIER = /^[A-Za-z][A-Za-z0-9_]*$/u;\nconst WORKGROUP_ELEMENT_BYTES = 4;\nconst MAX_WORKGROUP_VARIABLE_BYTES = 16 * 1024;\nconst WGSL_RESERVED_IDENTIFIERS = new Set([\n \"NULL\", \"Self\", \"abstract\", \"active\", \"alias\", \"alignas\", \"alignof\", \"array\", \"as\",\n \"asm\", \"asm_fragment\", \"async\", \"atomic\", \"attribute\", \"auto\", \"await\", \"become\",\n \"binding_array\", \"bool\", \"break\", \"case\", \"cast\", \"catch\", \"class\", \"co_await\",\n \"co_return\", \"co_yield\", \"coherent\", \"column_major\", \"common\", \"compile\",\n \"compile_fragment\", \"concept\", \"const\", \"const_assert\", \"const_cast\", \"consteval\",\n \"constexpr\", \"constinit\", \"continue\", \"continuing\", \"crate\", \"debug\", \"debugger\",\n \"decltype\", \"default\", \"delete\", \"demote\", \"demote_to_helper\", \"diagnostic\", \"discard\",\n \"do\", \"dynamic_cast\", \"else\", \"enable\", \"enum\", \"explicit\", \"export\", \"extends\",\n \"extern\", \"external\", \"f16\", \"f32\", \"fallthrough\", \"false\", \"filter\", \"final\",\n \"finally\", \"fn\", \"for\", \"friend\", \"from\", \"fxgroup\", \"get\", \"goto\", \"groupshared\",\n \"highp\", \"i32\", \"if\", \"impl\", \"implements\", \"import\", \"inline\", \"instanceof\",\n \"interface\", \"layout\", \"let\", \"loop\", \"lowp\", \"macro\", \"macro_rules\", \"match\",\n \"mediump\", \"meta\", \"mod\", \"module\", \"move\", \"mut\", \"mutable\", \"namespace\", \"new\",\n \"nil\", \"noexcept\", \"noinline\", \"nointerpolation\", \"noperspective\", \"null\", \"nullptr\",\n \"of\", \"operator\", \"override\", \"package\", \"packoffset\", \"partition\", \"pass\", \"patch\",\n \"pixelfragment\", \"precise\", \"precision\", \"premerge\", \"priv\", \"protected\", \"ptr\",\n \"pub\", \"public\", \"readonly\", \"ref\", \"regardless\", \"register\", \"reinterpret_cast\",\n \"require\", \"requires\", \"resource\", \"restrict\", \"return\", \"sampler\",\n \"sampler_comparison\", \"self\", \"set\", \"shared\", \"sizeof\", \"smooth\", \"snorm\", \"static\",\n \"static_assert\", \"static_cast\", \"std\", \"struct\", \"subroutine\", \"super\", \"switch\",\n \"target\", \"template\", \"this\", \"thread_local\", \"throw\", \"trait\", \"true\", \"try\", \"type\",\n \"typedef\", \"typeid\", \"typename\", \"typeof\", \"u32\", \"union\", \"unless\", \"unorm\", \"unsafe\",\n \"unsized\", \"use\", \"using\", \"var\", \"varying\", \"vec2\", \"vec3\", \"vec4\", \"virtual\",\n \"volatile\", \"wgsl\", \"where\", \"while\", \"with\", \"writeonly\", \"yield\"\n]);\n\n/**\n * One assignment statement. WGSL cannot assign to a multi-component swizzle\n * (`r0.yz = ...` is \"cannot assign to value of type swizzle\"), so a register\n * write with a two- to four-lane mask evaluates once into a block-scoped\n * temporary and writes each lane from it, in the mask's order.\n */\nfunction valueAssignment(name, code)\n{\n const swizzle = /^(.+)\\.([xyzw]{2,4})$/u.exec(name);\n\n if (!swizzle) return `${name} = ${code};`;\n\n const [ , target, mask ] = swizzle;\n const lanes = Array.from(mask, (lane, index) => `${target}.${lane} = lanes.${COMPONENTS[index]};`);\n\n return `{ let lanes = ${code}; ${lanes.join(\" \")} }`;\n}\n\nfunction attribute(field, invariantPosition = false)\n{\n if (field.attribute.kind !== \"builtin\")\n {\n const interpolate = field.interpolation ? ` @interpolate(${field.interpolation})` : \"\";\n return `@location(${field.attribute.index})${interpolate}`;\n }\n const invariant = invariantPosition && field.attribute.name === \"position\" ? \"@invariant \" : \"\";\n return `${invariant}@builtin(${field.attribute.name})`;\n}\n\nfunction access(base, field, components)\n{\n const natural = COMPONENTS.slice(0, field.components.length);\n const suffix = components.length === natural.length\n && components.every((component, index) => component === natural[index])\n ? \"\"\n : `.${components.join(\"\")}`;\n return `${base}.${field.name}${suffix}`;\n}\n\n/**\n * Assigns into an interface field, one statement per component when the write is\n * a partial swizzle.\n *\n * WGSL HAS NO SWIZZLE ASSIGNMENT, and this is the whole reason the function\n * exists. `output.output1.xy = vec2<f32>(...)` is a compile error - Tint rejects\n * it with \"cannot assign to value of type 'swizzle<...>'\" - while reading a\n * swizzle is fine and a WHOLE-field assignment is fine. HLSL and GLSL both allow\n * the write, so a mask that came straight across from DXBC produces one.\n *\n * IT COMPILED IN ONE CHROME AND NOT ANOTHER, which is why this survived a\n * headless run with a real adapter: the stricter Tint refused the same module\n * the looser one had accepted. The spec has never allowed it, so the strict\n * reading is the right one and the emitter must not rely on either.\n *\n * The source is bound to a `let` first rather than swizzled in place, so an\n * expression with a function call in it is evaluated ONCE however many\n * components it feeds. The `let` takes no type annotation because WGSL infers\n * it, and the emitter does not always have the source type to hand.\n *\n * The temporary is numbered by the CALLER, from a counter that restarts for each\n * function emitted, so the same program always produces the same text. A\n * module-level counter would have made emission depend on what was emitted\n * before it in the process, and the container tests compare bytes.\n *\n * @param {string} indent Leading whitespace for the statement.\n * @param {object} field The interface field being written.\n * @param {string[]} components The target components, in write order.\n * @param {string} source The right-hand side, already emitted.\n * @param {number} ordinal Index of this partial write within the function.\n * @returns {string[]} One or more WGSL statements.\n */\nfunction assignComponents(indent, field, components, source, ordinal)\n{\n const natural = COMPONENTS.slice(0, field.components.length);\n const whole = components.length === natural.length\n && components.every((component, index) => component === natural[index]);\n\n // A whole-field write, or a single component, is already legal as written.\n if (whole || components.length === 1)\n {\n return [ `${indent}${access(\"output\", field, components)} = ${source};` ];\n }\n\n const temporary = `swizzleWrite${ordinal}`;\n\n return [\n `${indent}let ${temporary} = ${source};`,\n ...components.map((component, index) =>\n `${indent}output.${field.name}.${component} = ${temporary}.${COMPONENTS[index]};`)\n ];\n}\n\n/**\n * One f32 lane of an immediate constant buffer or immutable indexable-temp\n * table. Non-finite lanes and negative zero are written as `bitcast<f32>` of\n * the raw bits so the exceptional or sign pattern survives. Finite lanes use a\n * readable decimal; WGSL does not fix the rounding direction of an inexact\n * decimal-to-f32 conversion, so that form is not a normative raw-bit guarantee.\n *\n * @param {{float32: number, uint32: number}} value Decoded lane.\n * @returns {string} WGSL f32 expression.\n */\nfunction f32Literal(value)\n{\n const number = value.float32;\n if (!Number.isFinite(number) || Object.is(number, -0))\n {\n return `bitcast<f32>(0x${(value.uint32 >>> 0).toString(16).padStart(8, \"0\")}u)`;\n }\n const text = String(number);\n return /[.eE]/u.test(text) ? text : `${text}.0`;\n}\n\nfunction emitImmediateConstantBuffer(lines, rows)\n{\n const vectors = rows.map((row) => `vec4<f32>(${row.map(f32Literal).join(\", \")})`);\n lines.push(`const icb = array<vec4<f32>, ${rows.length}>(${vectors.join(\", \")});`, \"\");\n}\n\nfunction emitConstTables(lines, tables)\n{\n for (const table of tables)\n {\n const vectors = table.rows.map((row) => `vec4<f32>(${row.map(f32Literal).join(\", \")})`);\n lines.push(`const ${table.symbol} = array<vec4<f32>, ${table.rows.length}>(${vectors.join(\", \")});`, \"\");\n }\n}\n\nfunction emitStruct(lines, name, fields, invariantPosition = false)\n{\n lines.push(`struct ${name}`, \"{\");\n for (const field of fields)\n {\n lines.push(` ${attribute(field, invariantPosition)} ${field.name}: ${field.type},`);\n }\n lines.push(\"};\", \"\");\n}\n\n/**\n * Formats the closed compute-builtin subset accepted by the WGSL emitter.\n *\n * @param {object} program Typed shader program.\n * @returns {string} WGSL entry-point parameter list.\n */\nexport function computeEntryPointParameters(program)\n{\n const inputs = program?.builtinInputs;\n if (inputs === undefined) return \"\";\n if (!Array.isArray(inputs) || inputs.length === 0)\n {\n throw new Error(\"WGSL compute builtinInputs must be a non-empty array\");\n }\n const names = new Set();\n const builtins = new Set();\n for (const input of inputs)\n {\n if (!input || typeof input !== \"object\" || Array.isArray(input))\n {\n throw new Error(\"WGSL compute builtin input must be an object\");\n }\n const keys = Object.keys(input).sort();\n if (keys.length !== 3\n || keys[0] !== \"builtin\" || keys[1] !== \"name\" || keys[2] !== \"type\")\n {\n throw new Error(\"WGSL compute builtin input contains unsupported metadata\");\n }\n if (typeof input.builtin !== \"string\" || typeof input.name !== \"string\"\n || typeof input.type !== \"string\")\n {\n throw new Error(\"WGSL compute builtin input fields must be strings\");\n }\n if (builtins.has(input.builtin))\n {\n throw new Error(`WGSL compute builtin input duplicates ${input.builtin}`);\n }\n if (names.has(input.name))\n {\n throw new Error(`WGSL compute builtin input duplicates parameter ${input.name}`);\n }\n builtins.add(input.builtin);\n names.add(input.name);\n }\n // A CLOSED SCHEMA: every input is one of these, with exactly this name and\n // type, and they arrive in this order (the lowering's own order). Any\n // subset in that order is accepted; CORTAO's Pack pass, for one, reads\n // SV_GroupIndex beside the group and thread IDs.\n let previous = -1;\n for (const input of inputs)\n {\n const index = COMPUTE_BUILTIN_SCHEMA.findIndex((entry) =>\n entry.builtin === input.builtin && entry.name === input.name && entry.type === input.type);\n if (index <= previous)\n {\n throw new Error(\"WGSL compute builtinInputs contains an unsupported ordered schema\");\n }\n previous = index;\n }\n return inputs.map((input) => `@builtin(${input.builtin}) ${input.name}: ${input.type}`).join(\", \");\n}\n\n/** The compute builtins the lowering emits, in their fixed order. */\nconst COMPUTE_BUILTIN_SCHEMA = Object.freeze([\n Object.freeze({ builtin: \"workgroup_id\", name: \"workgroup_id\", type: \"vec3<u32>\" }),\n Object.freeze({ builtin: \"local_invocation_id\", name: \"local_invocation_id\", type: \"vec3<u32>\" }),\n Object.freeze({ builtin: \"global_invocation_id\", name: \"dispatch_thread_id\", type: \"vec3<u32>\" }),\n Object.freeze({ builtin: \"local_invocation_index\", name: \"local_invocation_index\", type: \"u32\" })\n]);\n\nfunction collectStatementNames(statements, names)\n{\n for (const statement of statements || [])\n {\n if (typeof statement?.name === \"string\") names.add(statement.name);\n if (Array.isArray(statement?.statements)) collectStatementNames(statement.statements, names);\n if (Array.isArray(statement?.elseStatements)) collectStatementNames(statement.elseStatements, names);\n if (Array.isArray(statement?.continuing)) collectStatementNames(statement.continuing, names);\n for (const clause of statement?.clauses || [])\n {\n collectStatementNames(clause.statements, names);\n }\n }\n}\n\n/**\n * Validates and formats the closed module-scope workgroup-variable schema.\n * The 16 KiB cap is deliberately the WebGPU baseline workgroup-storage limit,\n * applied cumulatively so admitted modules remain portable without querying\n * device-specific limits.\n *\n * @param {object} program Typed shader program.\n * @returns {string[]} Canonical WGSL workgroup variable declarations.\n */\nexport function computeWorkgroupVariableDeclarations(program)\n{\n const variables = program?.workgroupVariables;\n if (variables === undefined) return [];\n if (program?.stage !== \"compute\")\n {\n throw new Error(\"WGSL workgroupVariables metadata is compute-only\");\n }\n if (!Array.isArray(variables) || variables.length === 0)\n {\n throw new Error(\"WGSL compute workgroupVariables must be a non-empty array\");\n }\n\n const occupied = new Set();\n if (typeof program.entryPoint === \"string\") occupied.add(program.entryPoint);\n for (const input of program.builtinInputs || [])\n {\n if (typeof input?.name === \"string\") occupied.add(input.name);\n }\n for (const binding of program.bindings || [])\n {\n if (typeof binding?.generatedSymbol === \"string\") occupied.add(binding.generatedSymbol);\n }\n if (program.immediateConstantBuffer?.length) occupied.add(\"icb\");\n for (const table of program.constTables || [])\n {\n if (typeof table?.symbol === \"string\") occupied.add(table.symbol);\n }\n collectStatementNames(program.statements, occupied);\n\n const names = new Set();\n const declarations = [];\n let footprint = 0;\n for (const variable of variables)\n {\n if (!variable || typeof variable !== \"object\" || Array.isArray(variable))\n {\n throw new Error(\"WGSL compute workgroup variable must be an object\");\n }\n const keys = Object.keys(variable).sort();\n if (keys.length !== 3\n || keys[0] !== \"elementCount\" || keys[1] !== \"elementType\" || keys[2] !== \"name\")\n {\n throw new Error(\"WGSL compute workgroup variable contains unsupported metadata\");\n }\n const { name, elementType, elementCount } = variable;\n if (typeof name !== \"string\"\n || !SAFE_WORKGROUP_IDENTIFIER.test(name)\n || name.includes(\"__\")\n || WGSL_RESERVED_IDENTIFIERS.has(name))\n {\n throw new Error(`WGSL compute workgroup variable has unsafe name ${JSON.stringify(name)}`);\n }\n if (elementType !== \"u32\" && elementType !== \"atomic<u32>\")\n {\n throw new Error(`WGSL compute workgroup variable ${name} has unsupported element type`);\n }\n if (!Number.isSafeInteger(elementCount) || elementCount < 1)\n {\n throw new Error(`WGSL compute workgroup variable ${name} requires a positive safe-integer elementCount`);\n }\n if (names.has(name))\n {\n throw new Error(`WGSL compute workgroup variable duplicates ${name}`);\n }\n if (occupied.has(name))\n {\n throw new Error(`WGSL compute workgroup variable ${name} collides with another shader symbol`);\n }\n footprint += elementCount * WORKGROUP_ELEMENT_BYTES;\n if (footprint > MAX_WORKGROUP_VARIABLE_BYTES)\n {\n throw new Error(\"WGSL compute workgroupVariables exceed the conservative 16 KiB footprint\");\n }\n names.add(name);\n declarations.push(`var<workgroup> ${name}: array<${elementType}, ${elementCount}>;`);\n }\n return declarations;\n}\n\n/**\n * Builds deterministic WGSL and a DXBC-offset source map for the supported IR.\n *\n * @param {Uint8Array|ArrayBuffer|ArrayBufferView|object} input DXBC or CJS IR.\n * @param {object} [options] Source/provenance options.\n * @returns {object} Frozen WGSL shader descriptor.\n */\nexport function buildWgsl(input, options = {})\n{\n if (options.precisionPolicy !== undefined)\n {\n throw new TypeError(\"WGSL precisionPolicy is not supported; precise controls require exact lowering\");\n }\n const ir = input?.format === \"CJS_SHADER_IR\" ? input : lowerDxbcToIr(input, options);\n let program;\n if (ir.stage === \"vertex\") program = lowerVertexProgram(ir, options);\n else if (ir.stage === \"pixel\") program = lowerFragmentProgram(ir, options);\n else if (ir.stage === \"compute\") program = lowerComputeProgram(ir, options);\n else throw new Error(`WGSL lowering does not support the ${ir.stage || \"unknown\"} shader stage`);\n const lines = [];\n const sourceMap = [];\n const compute = program.stage === \"compute\";\n if (!compute && program.builtinInputs !== undefined)\n {\n throw new Error(\"WGSL render lowering cannot emit compute builtinInputs\");\n }\n const prefix = program.stage === \"vertex\" ? \"Vertex\" : \"Fragment\";\n if (program.requiresDerivativeUniformityOptOut)\n {\n // This shader computes a screen-space derivative / implicit-LOD sample\n // inside non-uniform control flow, which WGSL forbids by default. The\n // DXBC source relied on D3D11's permissive behavior; this module-level\n // filter reproduces it (a standard WGSL opt-out) rather than rejecting\n // the shader. Neighbor lanes that skip the branch yield undefined\n // derivatives there, exactly as under D3D11.\n // The directive rather than gradient hoisting: converting to\n // textureSampleGrad with a gradient computed in uniform control flow\n // would substitute a different gradient than the one D3D11 used. The\n // directive keeps the operation at its source control-flow point, is\n // emitted only when the fragment lowerer detected a non-uniform\n // derivative/sample (including after a loop with a non-uniform exit),\n // and is flagged on the typed program so the reliance is never silent.\n lines.push(\"diagnostic(off, derivative_uniformity);\", \"\");\n }\n const interfaceInputs = compute ? [] : program.interface.inputs;\n const interfaceOutputs = compute ? [] : program.interface.outputs;\n const hasInputs = interfaceInputs.length > 0;\n if (hasInputs) emitStruct(lines, `${prefix}Input`, interfaceInputs);\n if (!compute) emitStruct(lines, `${prefix}Output`, interfaceOutputs, program.stage === \"vertex\");\n if (program.immediateConstantBuffer?.length) emitImmediateConstantBuffer(lines, program.immediateConstantBuffer);\n if (program.constTables?.length) emitConstTables(lines, program.constTables);\n const workgroupDeclarations = computeWorkgroupVariableDeclarations(program);\n if (workgroupDeclarations.length) lines.push(...workgroupDeclarations, \"\");\n for (const binding of program.bindings || [])\n {\n lines.push(`@group(${binding.group}) @binding(${binding.binding}) ${binding.declaration} ${binding.generatedSymbol}: ${binding.type};`);\n }\n if (program.bindings?.length) lines.push(\"\");\n\n // Reserved for the emulated-addressing helpers, spliced in at the end once\n // the body has been generated and it is known whether anything called them.\n // WGSL needs a function declared before its call, and the body comes later.\n const helperInsertionPoint = lines.length;\n\n if (compute)\n {\n const size = program.threadGroupSize;\n if (!Array.isArray(size) || size.length !== 3\n || size.some((value) => !Number.isSafeInteger(value) || value < 1))\n {\n throw new Error(\"WGSL compute lowering requires a positive three-dimensional threadGroupSize\");\n }\n const parameters = computeEntryPointParameters(program);\n lines.push(`@compute @workgroup_size(${size.join(\", \")})`, `fn ${program.entryPoint}(${parameters})`, \"{\");\n }\n else\n {\n const parameters = hasInputs ? `input: ${prefix}Input` : \"\";\n lines.push(`@${program.stage}`, `fn ${program.entryPoint}(${parameters}) -> ${prefix}Output`, \"{\", ` var output: ${prefix}Output;`);\n }\n\n const inputById = new Map(interfaceInputs.map((field) => [ field.id, field ]));\n const outputById = new Map(interfaceOutputs.map((field) => [ field.id, field ]));\n\n // Numbers the temporaries a partial interface write needs. Local to this\n // function so the same program always emits the same text.\n let swizzleWrites = 0;\n\n function emitStatement(statement, depth)\n {\n const indent = \" \".repeat(depth);\n const line = lines.length + 1;\n if (statement.kind === \"assignment\")\n {\n if (compute) throw new Error(\"WGSL compute lowering cannot emit a render-interface assignment\");\n const targetField = outputById.get(statement.target.fieldId);\n const source = statement.expression.fieldId\n ? access(\"input\", inputById.get(statement.expression.fieldId), statement.expression.components)\n : statement.expression.code;\n\n lines.push(...assignComponents(indent, targetField, statement.target.components, source, swizzleWrites));\n\n if (statement.target.components.length > 1) swizzleWrites += 1;\n }\n else if (statement.kind === \"let\")\n {\n lines.push(`${indent}let ${statement.name}: ${statement.type} = ${statement.expression.code};`);\n }\n else if (statement.kind === \"var\")\n {\n lines.push(statement.expression\n ? `${indent}var ${statement.name}: ${statement.type} = ${statement.expression.code};`\n : `${indent}var ${statement.name}: ${statement.type};`);\n }\n else if (statement.kind === \"value-assignment\")\n {\n lines.push(`${indent}${valueAssignment(statement.name, statement.expression.code)}`);\n }\n else if (statement.kind === \"return\")\n {\n lines.push(compute ? `${indent}return;` : `${indent}return output;`);\n }\n else if (statement.kind === \"discard\")\n {\n lines.push(`${indent}discard;`);\n }\n else if (statement.kind === \"call\")\n {\n lines.push(`${indent}${statement.expression.code};`);\n }\n else if (statement.kind === \"if\")\n {\n lines.push(`${indent}if (${statement.condition.code})`, `${indent}{`);\n sourceMap.push({ line, instructionIndex: statement.instructionIndex, dxbcOffset: statement.dxbcOffset });\n for (const child of statement.statements) emitStatement(child, depth + 1);\n lines.push(`${indent}}`);\n if (statement.elseStatements?.length)\n {\n lines.push(`${indent}else`, `${indent}{`);\n for (const child of statement.elseStatements) emitStatement(child, depth + 1);\n lines.push(`${indent}}`);\n }\n return;\n }\n else if (statement.kind === \"break\")\n {\n lines.push(`${indent}break;`);\n }\n else if (statement.kind === \"continue\")\n {\n lines.push(`${indent}continue;`);\n }\n else if (statement.kind === \"loop\")\n {\n lines.push(`${indent}loop`, `${indent}{`);\n sourceMap.push({ line, instructionIndex: statement.instructionIndex, dxbcOffset: statement.dxbcOffset });\n for (const child of statement.statements) emitStatement(child, depth + 1);\n if (statement.continuing?.length)\n {\n lines.push(`${indent} continuing`, `${indent} {`);\n for (const child of statement.continuing) emitStatement(child, depth + 2);\n lines.push(`${indent} }`);\n }\n lines.push(`${indent}}`);\n return;\n }\n else if (statement.kind === \"switch\")\n {\n lines.push(`${indent}switch (${statement.selector.code})`, `${indent}{`);\n sourceMap.push({ line, instructionIndex: statement.instructionIndex, dxbcOffset: statement.dxbcOffset });\n for (const clause of statement.clauses)\n {\n const selectors = clause.selectors.map((value) => `${value}u`);\n if (clause.isDefault) selectors.push(\"default\");\n const label = selectors.length === 1 && clause.isDefault ? \"default\" : `case ${selectors.join(\", \")}`;\n lines.push(`${indent} ${label}:`, `${indent} {`);\n for (const child of clause.statements) emitStatement(child, depth + 2);\n lines.push(`${indent} }`);\n }\n if (!statement.clauses.some((clause) => clause.isDefault))\n {\n // WGSL requires a default clause; a DXBC switch without one\n // falls through to endswitch, which an empty default matches.\n // Switches carrying live merges need a real DXBC default and\n // are rejected earlier by the switch merge planner.\n lines.push(`${indent} default:`, `${indent} {`, `${indent} }`);\n }\n lines.push(`${indent}}`);\n return;\n }\n if (Number.isInteger(statement.instructionIndex) && Number.isInteger(statement.dxbcOffset))\n {\n sourceMap.push({ line, instructionIndex: statement.instructionIndex, dxbcOffset: statement.dxbcOffset });\n }\n }\n\n for (const statement of program.statements) emitStatement(statement, 1);\n lines.push(\"}\", \"\");\n\n const usedAddressHelpers = new Set();\n\n for (const line of lines)\n {\n for (const name of line.match(/cjsAddress[A-Za-z0-9]*/gu) ?? []) usedAddressHelpers.add(name);\n }\n\n if (usedAddressHelpers.size)\n {\n lines.splice(helperInsertionPoint, 0, ...EmulatedAddressingHelpers(usedAddressHelpers));\n }\n\n return {\n kind: \"wgsl-shader\",\n format: \"CJS_WGSL_SHADER\",\n formatVersion: 1,\n source: program.source,\n stage: program.stage,\n entryPoint: program.entryPoint,\n code: lines.join(\"\\n\"),\n sourceMap,\n ...(compute ? { threadGroupSize: program.threadGroupSize } : {}),\n program\n };\n}\n"],"names":["COMPONENTS","SAFE_WORKGROUP_IDENTIFIER","WORKGROUP_ELEMENT_BYTES","MAX_WORKGROUP_VARIABLE_BYTES","WGSL_RESERVED_IDENTIFIERS","Set","valueAssignment","name","code","swizzle","exec","target","mask","lanes","Array","from","lane","index","join","attribute","field","invariantPosition","kind","interpolate","interpolation","invariant","access","base","components","natural","slice","length","suffix","every","component","assignComponents","indent","source","ordinal","whole","temporary","map","f32Literal","value","number","float32","Number","isFinite","Object","is","uint32","toString","padStart","text","String","test","emitImmediateConstantBuffer","lines","rows","vectors","row","push","emitConstTables","tables","table","symbol","emitStruct","fields","type","computeEntryPointParameters","program","inputs","builtinInputs","undefined","isArray","Error","names","builtins","input","keys","sort","builtin","has","add","previous","COMPUTE_BUILTIN_SCHEMA","findIndex","entry","freeze","collectStatementNames","statements","statement","elseStatements","continuing","clause","clauses","computeWorkgroupVariableDeclarations","variables","workgroupVariables","stage","occupied","entryPoint","binding","bindings","generatedSymbol","immediateConstantBuffer","constTables","declarations","footprint","variable","elementType","elementCount","includes","JSON","stringify","isSafeInteger","buildWgsl","options","precisionPolicy","TypeError","ir","format","lowerDxbcToIr","lowerVertexProgram","lowerFragmentProgram","lowerComputeProgram","sourceMap","compute","prefix","requiresDerivativeUniformityOptOut","interfaceInputs","interface","interfaceOutputs","outputs","hasInputs","workgroupDeclarations","group","declaration","helperInsertionPoint","size","threadGroupSize","some","parameters","inputById","Map","id","outputById","swizzleWrites","emitStatement","depth","repeat","line","targetField","get","fieldId","expression","condition","instructionIndex","dxbcOffset","child","selector","selectors","isDefault","label","isInteger","usedAddressHelpers","match","splice","EmulatedAddressingHelpers","formatVersion"],"mappings":";;;;;;AAMA,MAAMA,UAAU,GAAG,CAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAE;AACzC,MAAMC,yBAAyB,GAAG,0BAA0B;AAC5D,MAAMC,uBAAuB,GAAG,CAAC;AACjC,MAAMC,4BAA4B,GAAG,EAAE,GAAG,IAAI;AAC9C,MAAMC,yBAAyB,GAAG,IAAIC,GAAG,CAAC,CACtC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAClF,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAChF,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAC9E,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EACxE,kBAAkB,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EACjF,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAChF,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,SAAS,EACtF,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAC/E,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAC7E,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EACjF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAC5E,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAC7E,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAChF,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EACpF,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EACnF,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAC/E,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAChF,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAClE,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EACpF,eAAe,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAChF,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EACrF,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EACtF,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAC9E,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CACrE,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,eAAeA,CAACC,IAAI,EAAEC,IAAI,EACnC;AACI,EAAA,MAAMC,OAAO,GAAG,wBAAwB,CAACC,IAAI,CAACH,IAAI,CAAC;EAEnD,IAAI,CAACE,OAAO,EAAE,OAAO,GAAGF,IAAI,CAAA,GAAA,EAAMC,IAAI,CAAA,CAAA,CAAG;AAEzC,EAAA,MAAM,GAAIG,MAAM,EAAEC,IAAI,CAAE,GAAGH,OAAO;EAClC,MAAMI,KAAK,GAAGC,KAAK,CAACC,IAAI,CAACH,IAAI,EAAE,CAACI,IAAI,EAAEC,KAAK,KAAK,CAAA,EAAGN,MAAM,CAAA,CAAA,EAAIK,IAAI,CAAA,SAAA,EAAYhB,UAAU,CAACiB,KAAK,CAAC,CAAA,CAAA,CAAG,CAAC;EAElG,OAAO,CAAA,cAAA,EAAiBT,IAAI,CAAA,EAAA,EAAKK,KAAK,CAACK,IAAI,CAAC,GAAG,CAAC,CAAA,EAAA,CAAI;AACxD;AAEA,SAASC,SAASA,CAACC,KAAK,EAAEC,iBAAiB,GAAG,KAAK,EACnD;AACI,EAAA,IAAID,KAAK,CAACD,SAAS,CAACG,IAAI,KAAK,SAAS,EACtC;AACI,IAAA,MAAMC,WAAW,GAAGH,KAAK,CAACI,aAAa,GAAG,CAAA,cAAA,EAAiBJ,KAAK,CAACI,aAAa,CAAA,CAAA,CAAG,GAAG,EAAE;IACtF,OAAO,CAAA,UAAA,EAAaJ,KAAK,CAACD,SAAS,CAACF,KAAK,CAAA,CAAA,EAAIM,WAAW,CAAA,CAAE;AAC9D,EAAA;AACA,EAAA,MAAME,SAAS,GAAGJ,iBAAiB,IAAID,KAAK,CAACD,SAAS,CAACZ,IAAI,KAAK,UAAU,GAAG,aAAa,GAAG,EAAE;EAC/F,OAAO,CAAA,EAAGkB,SAAS,CAAA,SAAA,EAAYL,KAAK,CAACD,SAAS,CAACZ,IAAI,CAAA,CAAA,CAAG;AAC1D;AAEA,SAASmB,MAAMA,CAACC,IAAI,EAAEP,KAAK,EAAEQ,UAAU,EACvC;AACI,EAAA,MAAMC,OAAO,GAAG7B,UAAU,CAAC8B,KAAK,CAAC,CAAC,EAAEV,KAAK,CAACQ,UAAU,CAACG,MAAM,CAAC;AAC5D,EAAA,MAAMC,MAAM,GAAGJ,UAAU,CAACG,MAAM,KAAKF,OAAO,CAACE,MAAM,IAC5CH,UAAU,CAACK,KAAK,CAAC,CAACC,SAAS,EAAEjB,KAAK,KAAKiB,SAAS,KAAKL,OAAO,CAACZ,KAAK,CAAC,CAAC,GACrE,EAAE,GACF,CAAA,CAAA,EAAIW,UAAU,CAACV,IAAI,CAAC,EAAE,CAAC,CAAA,CAAE;EAC/B,OAAO,CAAA,EAAGS,IAAI,CAAA,CAAA,EAAIP,KAAK,CAACb,IAAI,CAAA,EAAGyB,MAAM,CAAA,CAAE;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASG,gBAAgBA,CAACC,MAAM,EAAEhB,KAAK,EAAEQ,UAAU,EAAES,MAAM,EAAEC,OAAO,EACpE;AACI,EAAA,MAAMT,OAAO,GAAG7B,UAAU,CAAC8B,KAAK,CAAC,CAAC,EAAEV,KAAK,CAACQ,UAAU,CAACG,MAAM,CAAC;EAC5D,MAAMQ,KAAK,GAAGX,UAAU,CAACG,MAAM,KAAKF,OAAO,CAACE,MAAM,IAC3CH,UAAU,CAACK,KAAK,CAAC,CAACC,SAAS,EAAEjB,KAAK,KAAKiB,SAAS,KAAKL,OAAO,CAACZ,KAAK,CAAC,CAAC;;AAE3E;AACA,EAAA,IAAIsB,KAAK,IAAIX,UAAU,CAACG,MAAM,KAAK,CAAC,EACpC;AACI,IAAA,OAAO,CAAE,CAAA,EAAGK,MAAM,CAAA,EAAGV,MAAM,CAAC,QAAQ,EAAEN,KAAK,EAAEQ,UAAU,CAAC,CAAA,GAAA,EAAMS,MAAM,GAAG,CAAE;AAC7E,EAAA;AAEA,EAAA,MAAMG,SAAS,GAAG,CAAA,YAAA,EAAeF,OAAO,CAAA,CAAE;AAE1C,EAAA,OAAO,CACH,CAAA,EAAGF,MAAM,CAAA,IAAA,EAAOI,SAAS,MAAMH,MAAM,CAAA,CAAA,CAAG,EACxC,GAAGT,UAAU,CAACa,GAAG,CAAC,CAACP,SAAS,EAAEjB,KAAK,KAC/B,CAAA,EAAGmB,MAAM,CAAA,OAAA,EAAUhB,KAAK,CAACb,IAAI,IAAI2B,SAAS,CAAA,GAAA,EAAMM,SAAS,CAAA,CAAA,EAAIxC,UAAU,CAACiB,KAAK,CAAC,CAAA,CAAA,CAAG,CAAC,CACzF;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASyB,UAAUA,CAACC,KAAK,EACzB;AACI,EAAA,MAAMC,MAAM,GAAGD,KAAK,CAACE,OAAO;AAC5B,EAAA,IAAI,CAACC,MAAM,CAACC,QAAQ,CAACH,MAAM,CAAC,IAAII,MAAM,CAACC,EAAE,CAACL,MAAM,EAAE,EAAE,CAAC,EACrD;AACI,IAAA,OAAO,kBAAkB,CAACD,KAAK,CAACO,MAAM,KAAK,CAAC,EAAEC,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAA,CAAI;AACnF,EAAA;AACA,EAAA,MAAMC,IAAI,GAAGC,MAAM,CAACV,MAAM,CAAC;EAC3B,OAAO,QAAQ,CAACW,IAAI,CAACF,IAAI,CAAC,GAAGA,IAAI,GAAG,CAAA,EAAGA,IAAI,CAAA,EAAA,CAAI;AACnD;AAEA,SAASG,2BAA2BA,CAACC,KAAK,EAAEC,IAAI,EAChD;EACI,MAAMC,OAAO,GAAGD,IAAI,CAACjB,GAAG,CAAEmB,GAAG,IAAK,CAAA,UAAA,EAAaA,GAAG,CAACnB,GAAG,CAACC,UAAU,CAAC,CAACxB,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC;AACjFuC,EAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,6BAAA,EAAgCH,IAAI,CAAC3B,MAAM,CAAA,EAAA,EAAK4B,OAAO,CAACzC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAA,CAAI,EAAE,EAAE,CAAC;AAC1F;AAEA,SAAS4C,eAAeA,CAACL,KAAK,EAAEM,MAAM,EACtC;AACI,EAAA,KAAK,MAAMC,KAAK,IAAID,MAAM,EAC1B;IACI,MAAMJ,OAAO,GAAGK,KAAK,CAACN,IAAI,CAACjB,GAAG,CAAEmB,GAAG,IAAK,CAAA,UAAA,EAAaA,GAAG,CAACnB,GAAG,CAACC,UAAU,CAAC,CAACxB,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC;IACvFuC,KAAK,CAACI,IAAI,CAAC,CAAA,MAAA,EAASG,KAAK,CAACC,MAAM,CAAA,oBAAA,EAAuBD,KAAK,CAACN,IAAI,CAAC3B,MAAM,CAAA,EAAA,EAAK4B,OAAO,CAACzC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAA,CAAI,EAAE,EAAE,CAAC;AAC5G,EAAA;AACJ;AAEA,SAASgD,UAAUA,CAACT,KAAK,EAAElD,IAAI,EAAE4D,MAAM,EAAE9C,iBAAiB,GAAG,KAAK,EAClE;EACIoC,KAAK,CAACI,IAAI,CAAC,CAAA,OAAA,EAAUtD,IAAI,CAAA,CAAE,EAAE,GAAG,CAAC;AACjC,EAAA,KAAK,MAAMa,KAAK,IAAI+C,MAAM,EAC1B;AACIV,IAAAA,KAAK,CAACI,IAAI,CAAC,OAAO1C,SAAS,CAACC,KAAK,EAAEC,iBAAiB,CAAC,CAAA,CAAA,EAAID,KAAK,CAACb,IAAI,CAAA,EAAA,EAAKa,KAAK,CAACgD,IAAI,GAAG,CAAC;AAC1F,EAAA;AACAX,EAAAA,KAAK,CAACI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASQ,2BAA2BA,CAACC,OAAO,EACnD;AACI,EAAA,MAAMC,MAAM,GAAGD,OAAO,EAAEE,aAAa;AACrC,EAAA,IAAID,MAAM,KAAKE,SAAS,EAAE,OAAO,EAAE;AACnC,EAAA,IAAI,CAAC3D,KAAK,CAAC4D,OAAO,CAACH,MAAM,CAAC,IAAIA,MAAM,CAACxC,MAAM,KAAK,CAAC,EACjD;AACI,IAAA,MAAM,IAAI4C,KAAK,CAAC,sDAAsD,CAAC;AAC3E,EAAA;AACA,EAAA,MAAMC,KAAK,GAAG,IAAIvE,GAAG,EAAE;AACvB,EAAA,MAAMwE,QAAQ,GAAG,IAAIxE,GAAG,EAAE;AAC1B,EAAA,KAAK,MAAMyE,KAAK,IAAIP,MAAM,EAC1B;AACI,IAAA,IAAI,CAACO,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIhE,KAAK,CAAC4D,OAAO,CAACI,KAAK,CAAC,EAC/D;AACI,MAAA,MAAM,IAAIH,KAAK,CAAC,8CAA8C,CAAC;AACnE,IAAA;IACA,MAAMI,IAAI,GAAG/B,MAAM,CAAC+B,IAAI,CAACD,KAAK,CAAC,CAACE,IAAI,EAAE;IACtC,IAAID,IAAI,CAAChD,MAAM,KAAK,CAAC,IACdgD,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAIA,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,IAAIA,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EACxE;AACI,MAAA,MAAM,IAAIJ,KAAK,CAAC,0DAA0D,CAAC;AAC/E,IAAA;IACA,IAAI,OAAOG,KAAK,CAACG,OAAO,KAAK,QAAQ,IAAI,OAAOH,KAAK,CAACvE,IAAI,KAAK,QAAQ,IAChE,OAAOuE,KAAK,CAACV,IAAI,KAAK,QAAQ,EACrC;AACI,MAAA,MAAM,IAAIO,KAAK,CAAC,mDAAmD,CAAC;AACxE,IAAA;IACA,IAAIE,QAAQ,CAACK,GAAG,CAACJ,KAAK,CAACG,OAAO,CAAC,EAC/B;MACI,MAAM,IAAIN,KAAK,CAAC,CAAA,sCAAA,EAAyCG,KAAK,CAACG,OAAO,EAAE,CAAC;AAC7E,IAAA;IACA,IAAIL,KAAK,CAACM,GAAG,CAACJ,KAAK,CAACvE,IAAI,CAAC,EACzB;MACI,MAAM,IAAIoE,KAAK,CAAC,CAAA,gDAAA,EAAmDG,KAAK,CAACvE,IAAI,EAAE,CAAC;AACpF,IAAA;AACAsE,IAAAA,QAAQ,CAACM,GAAG,CAACL,KAAK,CAACG,OAAO,CAAC;AAC3BL,IAAAA,KAAK,CAACO,GAAG,CAACL,KAAK,CAACvE,IAAI,CAAC;AACzB,EAAA;AACA;AACA;AACA;AACA;EACA,IAAI6E,QAAQ,GAAG,EAAE;AACjB,EAAA,KAAK,MAAMN,KAAK,IAAIP,MAAM,EAC1B;AACI,IAAA,MAAMtD,KAAK,GAAGoE,sBAAsB,CAACC,SAAS,CAAEC,KAAK,IACjDA,KAAK,CAACN,OAAO,KAAKH,KAAK,CAACG,OAAO,IAAIM,KAAK,CAAChF,IAAI,KAAKuE,KAAK,CAACvE,IAAI,IAAIgF,KAAK,CAACnB,IAAI,KAAKU,KAAK,CAACV,IAAI,CAAC;IAC9F,IAAInD,KAAK,IAAImE,QAAQ,EACrB;AACI,MAAA,MAAM,IAAIT,KAAK,CAAC,mEAAmE,CAAC;AACxF,IAAA;AACAS,IAAAA,QAAQ,GAAGnE,KAAK;AACpB,EAAA;EACA,OAAOsD,MAAM,CAAC9B,GAAG,CAAEqC,KAAK,IAAK,CAAA,SAAA,EAAYA,KAAK,CAACG,OAAO,CAAA,EAAA,EAAKH,KAAK,CAACvE,IAAI,CAAA,EAAA,EAAKuE,KAAK,CAACV,IAAI,CAAA,CAAE,CAAC,CAAClD,IAAI,CAAC,IAAI,CAAC;AACtG;;AAEA;AACA,MAAMmE,sBAAsB,GAAGrC,MAAM,CAACwC,MAAM,CAAC,CACzCxC,MAAM,CAACwC,MAAM,CAAC;AAAEP,EAAAA,OAAO,EAAE,cAAc;AAAE1E,EAAAA,IAAI,EAAE,cAAc;AAAE6D,EAAAA,IAAI,EAAE;AAAY,CAAC,CAAC,EACnFpB,MAAM,CAACwC,MAAM,CAAC;AAAEP,EAAAA,OAAO,EAAE,qBAAqB;AAAE1E,EAAAA,IAAI,EAAE,qBAAqB;AAAE6D,EAAAA,IAAI,EAAE;AAAY,CAAC,CAAC,EACjGpB,MAAM,CAACwC,MAAM,CAAC;AAAEP,EAAAA,OAAO,EAAE,sBAAsB;AAAE1E,EAAAA,IAAI,EAAE,oBAAoB;AAAE6D,EAAAA,IAAI,EAAE;AAAY,CAAC,CAAC,EACjGpB,MAAM,CAACwC,MAAM,CAAC;AAAEP,EAAAA,OAAO,EAAE,wBAAwB;AAAE1E,EAAAA,IAAI,EAAE,wBAAwB;AAAE6D,EAAAA,IAAI,EAAE;AAAM,CAAC,CAAC,CACpG,CAAC;AAEF,SAASqB,qBAAqBA,CAACC,UAAU,EAAEd,KAAK,EAChD;AACI,EAAA,KAAK,MAAMe,SAAS,IAAID,UAAU,IAAI,EAAE,EACxC;AACI,IAAA,IAAI,OAAOC,SAAS,EAAEpF,IAAI,KAAK,QAAQ,EAAEqE,KAAK,CAACO,GAAG,CAACQ,SAAS,CAACpF,IAAI,CAAC;AAClE,IAAA,IAAIO,KAAK,CAAC4D,OAAO,CAACiB,SAAS,EAAED,UAAU,CAAC,EAAED,qBAAqB,CAACE,SAAS,CAACD,UAAU,EAAEd,KAAK,CAAC;AAC5F,IAAA,IAAI9D,KAAK,CAAC4D,OAAO,CAACiB,SAAS,EAAEC,cAAc,CAAC,EAAEH,qBAAqB,CAACE,SAAS,CAACC,cAAc,EAAEhB,KAAK,CAAC;AACpG,IAAA,IAAI9D,KAAK,CAAC4D,OAAO,CAACiB,SAAS,EAAEE,UAAU,CAAC,EAAEJ,qBAAqB,CAACE,SAAS,CAACE,UAAU,EAAEjB,KAAK,CAAC;IAC5F,KAAK,MAAMkB,MAAM,IAAIH,SAAS,EAAEI,OAAO,IAAI,EAAE,EAC7C;AACIN,MAAAA,qBAAqB,CAACK,MAAM,CAACJ,UAAU,EAAEd,KAAK,CAAC;AACnD,IAAA;AACJ,EAAA;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASoB,oCAAoCA,CAAC1B,OAAO,EAC5D;AACI,EAAA,MAAM2B,SAAS,GAAG3B,OAAO,EAAE4B,kBAAkB;AAC7C,EAAA,IAAID,SAAS,KAAKxB,SAAS,EAAE,OAAO,EAAE;AACtC,EAAA,IAAIH,OAAO,EAAE6B,KAAK,KAAK,SAAS,EAChC;AACI,IAAA,MAAM,IAAIxB,KAAK,CAAC,kDAAkD,CAAC;AACvE,EAAA;AACA,EAAA,IAAI,CAAC7D,KAAK,CAAC4D,OAAO,CAACuB,SAAS,CAAC,IAAIA,SAAS,CAAClE,MAAM,KAAK,CAAC,EACvD;AACI,IAAA,MAAM,IAAI4C,KAAK,CAAC,2DAA2D,CAAC;AAChF,EAAA;AAEA,EAAA,MAAMyB,QAAQ,GAAG,IAAI/F,GAAG,EAAE;AAC1B,EAAA,IAAI,OAAOiE,OAAO,CAAC+B,UAAU,KAAK,QAAQ,EAAED,QAAQ,CAACjB,GAAG,CAACb,OAAO,CAAC+B,UAAU,CAAC;EAC5E,KAAK,MAAMvB,KAAK,IAAIR,OAAO,CAACE,aAAa,IAAI,EAAE,EAC/C;AACI,IAAA,IAAI,OAAOM,KAAK,EAAEvE,IAAI,KAAK,QAAQ,EAAE6F,QAAQ,CAACjB,GAAG,CAACL,KAAK,CAACvE,IAAI,CAAC;AACjE,EAAA;EACA,KAAK,MAAM+F,OAAO,IAAIhC,OAAO,CAACiC,QAAQ,IAAI,EAAE,EAC5C;AACI,IAAA,IAAI,OAAOD,OAAO,EAAEE,eAAe,KAAK,QAAQ,EAAEJ,QAAQ,CAACjB,GAAG,CAACmB,OAAO,CAACE,eAAe,CAAC;AAC3F,EAAA;EACA,IAAIlC,OAAO,CAACmC,uBAAuB,EAAE1E,MAAM,EAAEqE,QAAQ,CAACjB,GAAG,CAAC,KAAK,CAAC;EAChE,KAAK,MAAMnB,KAAK,IAAIM,OAAO,CAACoC,WAAW,IAAI,EAAE,EAC7C;AACI,IAAA,IAAI,OAAO1C,KAAK,EAAEC,MAAM,KAAK,QAAQ,EAAEmC,QAAQ,CAACjB,GAAG,CAACnB,KAAK,CAACC,MAAM,CAAC;AACrE,EAAA;AACAwB,EAAAA,qBAAqB,CAACnB,OAAO,CAACoB,UAAU,EAAEU,QAAQ,CAAC;AAEnD,EAAA,MAAMxB,KAAK,GAAG,IAAIvE,GAAG,EAAE;EACvB,MAAMsG,YAAY,GAAG,EAAE;EACvB,IAAIC,SAAS,GAAG,CAAC;AACjB,EAAA,KAAK,MAAMC,QAAQ,IAAIZ,SAAS,EAChC;AACI,IAAA,IAAI,CAACY,QAAQ,IAAI,OAAOA,QAAQ,KAAK,QAAQ,IAAI/F,KAAK,CAAC4D,OAAO,CAACmC,QAAQ,CAAC,EACxE;AACI,MAAA,MAAM,IAAIlC,KAAK,CAAC,mDAAmD,CAAC;AACxE,IAAA;IACA,MAAMI,IAAI,GAAG/B,MAAM,CAAC+B,IAAI,CAAC8B,QAAQ,CAAC,CAAC7B,IAAI,EAAE;IACzC,IAAID,IAAI,CAAChD,MAAM,KAAK,CAAC,IACdgD,IAAI,CAAC,CAAC,CAAC,KAAK,cAAc,IAAIA,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,IAAIA,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EACpF;AACI,MAAA,MAAM,IAAIJ,KAAK,CAAC,+DAA+D,CAAC;AACpF,IAAA;IACA,MAAM;MAAEpE,IAAI;MAAEuG,WAAW;AAAEC,MAAAA;AAAa,KAAC,GAAGF,QAAQ;IACpD,IAAI,OAAOtG,IAAI,KAAK,QAAQ,IACrB,CAACN,yBAAyB,CAACsD,IAAI,CAAChD,IAAI,CAAC,IACrCA,IAAI,CAACyG,QAAQ,CAAC,IAAI,CAAC,IACnB5G,yBAAyB,CAAC8E,GAAG,CAAC3E,IAAI,CAAC,EAC1C;MACI,MAAM,IAAIoE,KAAK,CAAC,CAAA,gDAAA,EAAmDsC,IAAI,CAACC,SAAS,CAAC3G,IAAI,CAAC,CAAA,CAAE,CAAC;AAC9F,IAAA;AACA,IAAA,IAAIuG,WAAW,KAAK,KAAK,IAAIA,WAAW,KAAK,aAAa,EAC1D;AACI,MAAA,MAAM,IAAInC,KAAK,CAAC,CAAA,gCAAA,EAAmCpE,IAAI,+BAA+B,CAAC;AAC3F,IAAA;IACA,IAAI,CAACuC,MAAM,CAACqE,aAAa,CAACJ,YAAY,CAAC,IAAIA,YAAY,GAAG,CAAC,EAC3D;AACI,MAAA,MAAM,IAAIpC,KAAK,CAAC,CAAA,gCAAA,EAAmCpE,IAAI,gDAAgD,CAAC;AAC5G,IAAA;AACA,IAAA,IAAIqE,KAAK,CAACM,GAAG,CAAC3E,IAAI,CAAC,EACnB;AACI,MAAA,MAAM,IAAIoE,KAAK,CAAC,CAAA,2CAAA,EAA8CpE,IAAI,EAAE,CAAC;AACzE,IAAA;AACA,IAAA,IAAI6F,QAAQ,CAAClB,GAAG,CAAC3E,IAAI,CAAC,EACtB;AACI,MAAA,MAAM,IAAIoE,KAAK,CAAC,CAAA,gCAAA,EAAmCpE,IAAI,sCAAsC,CAAC;AAClG,IAAA;IACAqG,SAAS,IAAIG,YAAY,GAAG7G,uBAAuB;IACnD,IAAI0G,SAAS,GAAGzG,4BAA4B,EAC5C;AACI,MAAA,MAAM,IAAIwE,KAAK,CAAC,0EAA0E,CAAC;AAC/F,IAAA;AACAC,IAAAA,KAAK,CAACO,GAAG,CAAC5E,IAAI,CAAC;IACfoG,YAAY,CAAC9C,IAAI,CAAC,CAAA,eAAA,EAAkBtD,IAAI,WAAWuG,WAAW,CAAA,EAAA,EAAKC,YAAY,CAAA,EAAA,CAAI,CAAC;AACxF,EAAA;AACA,EAAA,OAAOJ,YAAY;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASS,SAASA,CAACtC,KAAK,EAAEuC,OAAO,GAAG,EAAE,EAC7C;AACI,EAAA,IAAIA,OAAO,CAACC,eAAe,KAAK7C,SAAS,EACzC;AACI,IAAA,MAAM,IAAI8C,SAAS,CAAC,gFAAgF,CAAC;AACzG,EAAA;AACA,EAAA,MAAMC,EAAE,GAAG1C,KAAK,EAAE2C,MAAM,KAAK,eAAe,GAAG3C,KAAK,GAAG4C,aAAa,CAAC5C,KAAK,EAAEuC,OAAO,CAAC;AACpF,EAAA,IAAI/C,OAAO;AACX,EAAA,IAAIkD,EAAE,CAACrB,KAAK,KAAK,QAAQ,EAAE7B,OAAO,GAAGqD,kBAAkB,CAACH,EAAE,EAAEH,OAAO,CAAC,CAAC,KAChE,IAAIG,EAAE,CAACrB,KAAK,KAAK,OAAO,EAAE7B,OAAO,GAAGsD,oBAAoB,CAACJ,EAAE,EAAEH,OAAO,CAAC,CAAC,KACtE,IAAIG,EAAE,CAACrB,KAAK,KAAK,SAAS,EAAE7B,OAAO,GAAGuD,mBAAmB,CAACL,EAAE,EAAEH,OAAO,CAAC,CAAC,KACvE,MAAM,IAAI1C,KAAK,CAAC,CAAA,mCAAA,EAAsC6C,EAAE,CAACrB,KAAK,IAAI,SAAS,eAAe,CAAC;EAChG,MAAM1C,KAAK,GAAG,EAAE;EAChB,MAAMqE,SAAS,GAAG,EAAE;AACpB,EAAA,MAAMC,OAAO,GAAGzD,OAAO,CAAC6B,KAAK,KAAK,SAAS;EAC3C,IAAI,CAAC4B,OAAO,IAAIzD,OAAO,CAACE,aAAa,KAAKC,SAAS,EACnD;AACI,IAAA,MAAM,IAAIE,KAAK,CAAC,wDAAwD,CAAC;AAC7E,EAAA;EACA,MAAMqD,MAAM,GAAG1D,OAAO,CAAC6B,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAG,UAAU;EACjE,IAAI7B,OAAO,CAAC2D,kCAAkC,EAC9C;AACI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACAxE,IAAAA,KAAK,CAACI,IAAI,CAAC,yCAAyC,EAAE,EAAE,CAAC;AAC7D,EAAA;EACA,MAAMqE,eAAe,GAAGH,OAAO,GAAG,EAAE,GAAGzD,OAAO,CAAC6D,SAAS,CAAC5D,MAAM;EAC/D,MAAM6D,gBAAgB,GAAGL,OAAO,GAAG,EAAE,GAAGzD,OAAO,CAAC6D,SAAS,CAACE,OAAO;AACjE,EAAA,MAAMC,SAAS,GAAGJ,eAAe,CAACnG,MAAM,GAAG,CAAC;EAC5C,IAAIuG,SAAS,EAAEpE,UAAU,CAACT,KAAK,EAAE,CAAA,EAAGuE,MAAM,CAAA,KAAA,CAAO,EAAEE,eAAe,CAAC;AACnE,EAAA,IAAI,CAACH,OAAO,EAAE7D,UAAU,CAACT,KAAK,EAAE,CAAA,EAAGuE,MAAM,CAAA,MAAA,CAAQ,EAAEI,gBAAgB,EAAE9D,OAAO,CAAC6B,KAAK,KAAK,QAAQ,CAAC;AAChG,EAAA,IAAI7B,OAAO,CAACmC,uBAAuB,EAAE1E,MAAM,EAAEyB,2BAA2B,CAACC,KAAK,EAAEa,OAAO,CAACmC,uBAAuB,CAAC;AAChH,EAAA,IAAInC,OAAO,CAACoC,WAAW,EAAE3E,MAAM,EAAE+B,eAAe,CAACL,KAAK,EAAEa,OAAO,CAACoC,WAAW,CAAC;AAC5E,EAAA,MAAM6B,qBAAqB,GAAGvC,oCAAoC,CAAC1B,OAAO,CAAC;AAC3E,EAAA,IAAIiE,qBAAqB,CAACxG,MAAM,EAAE0B,KAAK,CAACI,IAAI,CAAC,GAAG0E,qBAAqB,EAAE,EAAE,CAAC;EAC1E,KAAK,MAAMjC,OAAO,IAAIhC,OAAO,CAACiC,QAAQ,IAAI,EAAE,EAC5C;IACI9C,KAAK,CAACI,IAAI,CAAC,CAAA,OAAA,EAAUyC,OAAO,CAACkC,KAAK,CAAA,WAAA,EAAclC,OAAO,CAACA,OAAO,CAAA,EAAA,EAAKA,OAAO,CAACmC,WAAW,CAAA,CAAA,EAAInC,OAAO,CAACE,eAAe,KAAKF,OAAO,CAAClC,IAAI,CAAA,CAAA,CAAG,CAAC;AAC3I,EAAA;EACA,IAAIE,OAAO,CAACiC,QAAQ,EAAExE,MAAM,EAAE0B,KAAK,CAACI,IAAI,CAAC,EAAE,CAAC;;AAE5C;AACA;AACA;AACA,EAAA,MAAM6E,oBAAoB,GAAGjF,KAAK,CAAC1B,MAAM;AAEzC,EAAA,IAAIgG,OAAO,EACX;AACI,IAAA,MAAMY,IAAI,GAAGrE,OAAO,CAACsE,eAAe;AACpC,IAAA,IAAI,CAAC9H,KAAK,CAAC4D,OAAO,CAACiE,IAAI,CAAC,IAAIA,IAAI,CAAC5G,MAAM,KAAK,CAAC,IACtC4G,IAAI,CAACE,IAAI,CAAElG,KAAK,IAAK,CAACG,MAAM,CAACqE,aAAa,CAACxE,KAAK,CAAC,IAAIA,KAAK,GAAG,CAAC,CAAC,EACtE;AACI,MAAA,MAAM,IAAIgC,KAAK,CAAC,6EAA6E,CAAC;AAClG,IAAA;AACA,IAAA,MAAMmE,UAAU,GAAGzE,2BAA2B,CAACC,OAAO,CAAC;IACvDb,KAAK,CAACI,IAAI,CAAC,CAAA,yBAAA,EAA4B8E,IAAI,CAACzH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA,GAAA,EAAMoD,OAAO,CAAC+B,UAAU,IAAIyC,UAAU,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;AAC9G,EAAA,CAAC,MAED;IACI,MAAMA,UAAU,GAAGR,SAAS,GAAG,UAAUN,MAAM,CAAA,KAAA,CAAO,GAAG,EAAE;IAC3DvE,KAAK,CAACI,IAAI,CAAC,CAAA,CAAA,EAAIS,OAAO,CAAC6B,KAAK,CAAA,CAAE,EAAE,CAAA,GAAA,EAAM7B,OAAO,CAAC+B,UAAU,CAAA,CAAA,EAAIyC,UAAU,CAAA,KAAA,EAAQd,MAAM,CAAA,MAAA,CAAQ,EAAE,GAAG,EAAE,CAAA,gBAAA,EAAmBA,MAAM,CAAA,OAAA,CAAS,CAAC;AAC1I,EAAA;AAEA,EAAA,MAAMe,SAAS,GAAG,IAAIC,GAAG,CAACd,eAAe,CAACzF,GAAG,CAAErB,KAAK,IAAK,CAAEA,KAAK,CAAC6H,EAAE,EAAE7H,KAAK,CAAE,CAAC,CAAC;AAC9E,EAAA,MAAM8H,UAAU,GAAG,IAAIF,GAAG,CAACZ,gBAAgB,CAAC3F,GAAG,CAAErB,KAAK,IAAK,CAAEA,KAAK,CAAC6H,EAAE,EAAE7H,KAAK,CAAE,CAAC,CAAC;;AAEhF;AACA;EACA,IAAI+H,aAAa,GAAG,CAAC;AAErB,EAAA,SAASC,aAAaA,CAACzD,SAAS,EAAE0D,KAAK,EACvC;AACI,IAAA,MAAMjH,MAAM,GAAG,MAAM,CAACkH,MAAM,CAACD,KAAK,CAAC;AACnC,IAAA,MAAME,IAAI,GAAG9F,KAAK,CAAC1B,MAAM,GAAG,CAAC;AAC7B,IAAA,IAAI4D,SAAS,CAACrE,IAAI,KAAK,YAAY,EACnC;AACI,MAAA,IAAIyG,OAAO,EAAE,MAAM,IAAIpD,KAAK,CAAC,iEAAiE,CAAC;MAC/F,MAAM6E,WAAW,GAAGN,UAAU,CAACO,GAAG,CAAC9D,SAAS,CAAChF,MAAM,CAAC+I,OAAO,CAAC;AAC5D,MAAA,MAAMrH,MAAM,GAAGsD,SAAS,CAACgE,UAAU,CAACD,OAAO,GACrChI,MAAM,CAAC,OAAO,EAAEqH,SAAS,CAACU,GAAG,CAAC9D,SAAS,CAACgE,UAAU,CAACD,OAAO,CAAC,EAAE/D,SAAS,CAACgE,UAAU,CAAC/H,UAAU,CAAC,GAC7F+D,SAAS,CAACgE,UAAU,CAACnJ,IAAI;MAE/BiD,KAAK,CAACI,IAAI,CAAC,GAAG1B,gBAAgB,CAACC,MAAM,EAAEoH,WAAW,EAAE7D,SAAS,CAAChF,MAAM,CAACiB,UAAU,EAAES,MAAM,EAAE8G,aAAa,CAAC,CAAC;AAExG,MAAA,IAAIxD,SAAS,CAAChF,MAAM,CAACiB,UAAU,CAACG,MAAM,GAAG,CAAC,EAAEoH,aAAa,IAAI,CAAC;AAClE,IAAA,CAAC,MACI,IAAIxD,SAAS,CAACrE,IAAI,KAAK,KAAK,EACjC;MACImC,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,CAAA,IAAA,EAAOuD,SAAS,CAACpF,IAAI,CAAA,EAAA,EAAKoF,SAAS,CAACvB,IAAI,MAAMuB,SAAS,CAACgE,UAAU,CAACnJ,IAAI,GAAG,CAAC;AACnG,IAAA,CAAC,MACI,IAAImF,SAAS,CAACrE,IAAI,KAAK,KAAK,EACjC;AACImC,MAAAA,KAAK,CAACI,IAAI,CAAC8B,SAAS,CAACgE,UAAU,GACzB,CAAA,EAAGvH,MAAM,CAAA,IAAA,EAAOuD,SAAS,CAACpF,IAAI,CAAA,EAAA,EAAKoF,SAAS,CAACvB,IAAI,CAAA,GAAA,EAAMuB,SAAS,CAACgE,UAAU,CAACnJ,IAAI,CAAA,CAAA,CAAG,GACnF,GAAG4B,MAAM,CAAA,IAAA,EAAOuD,SAAS,CAACpF,IAAI,CAAA,EAAA,EAAKoF,SAAS,CAACvB,IAAI,GAAG,CAAC;AAC/D,IAAA,CAAC,MACI,IAAIuB,SAAS,CAACrE,IAAI,KAAK,kBAAkB,EAC9C;AACImC,MAAAA,KAAK,CAACI,IAAI,CAAC,GAAGzB,MAAM,CAAA,EAAG9B,eAAe,CAACqF,SAAS,CAACpF,IAAI,EAAEoF,SAAS,CAACgE,UAAU,CAACnJ,IAAI,CAAC,EAAE,CAAC;AACxF,IAAA,CAAC,MACI,IAAImF,SAAS,CAACrE,IAAI,KAAK,QAAQ,EACpC;AACImC,MAAAA,KAAK,CAACI,IAAI,CAACkE,OAAO,GAAG,CAAA,EAAG3F,MAAM,CAAA,OAAA,CAAS,GAAG,CAAA,EAAGA,MAAM,CAAA,cAAA,CAAgB,CAAC;AACxE,IAAA,CAAC,MACI,IAAIuD,SAAS,CAACrE,IAAI,KAAK,SAAS,EACrC;AACImC,MAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,UAAU,CAAC;AACnC,IAAA,CAAC,MACI,IAAIuD,SAAS,CAACrE,IAAI,KAAK,MAAM,EAClC;AACImC,MAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,CAAA,EAAGuD,SAAS,CAACgE,UAAU,CAACnJ,IAAI,CAAA,CAAA,CAAG,CAAC;AACxD,IAAA,CAAC,MACI,IAAImF,SAAS,CAACrE,IAAI,KAAK,IAAI,EAChC;AACImC,MAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,OAAOuD,SAAS,CAACiE,SAAS,CAACpJ,IAAI,CAAA,CAAA,CAAG,EAAE,CAAA,EAAG4B,MAAM,GAAG,CAAC;MACrE0F,SAAS,CAACjE,IAAI,CAAC;QAAE0F,IAAI;QAAEM,gBAAgB,EAAElE,SAAS,CAACkE,gBAAgB;QAAEC,UAAU,EAAEnE,SAAS,CAACmE;AAAW,OAAC,CAAC;AACxG,MAAA,KAAK,MAAMC,KAAK,IAAIpE,SAAS,CAACD,UAAU,EAAE0D,aAAa,CAACW,KAAK,EAAEV,KAAK,GAAG,CAAC,CAAC;AACzE5F,MAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,GAAG,CAAC;AACxB,MAAA,IAAIuD,SAAS,CAACC,cAAc,EAAE7D,MAAM,EACpC;QACI0B,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,MAAM,EAAE,CAAA,EAAGA,MAAM,CAAA,CAAA,CAAG,CAAC;AACzC,QAAA,KAAK,MAAM2H,KAAK,IAAIpE,SAAS,CAACC,cAAc,EAAEwD,aAAa,CAACW,KAAK,EAAEV,KAAK,GAAG,CAAC,CAAC;AAC7E5F,QAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,GAAG,CAAC;AAC5B,MAAA;AACA,MAAA;AACJ,IAAA,CAAC,MACI,IAAIuD,SAAS,CAACrE,IAAI,KAAK,OAAO,EACnC;AACImC,MAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,QAAQ,CAAC;AACjC,IAAA,CAAC,MACI,IAAIuD,SAAS,CAACrE,IAAI,KAAK,UAAU,EACtC;AACImC,MAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,WAAW,CAAC;AACpC,IAAA,CAAC,MACI,IAAIuD,SAAS,CAACrE,IAAI,KAAK,MAAM,EAClC;MACImC,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,MAAM,EAAE,CAAA,EAAGA,MAAM,CAAA,CAAA,CAAG,CAAC;MACzC0F,SAAS,CAACjE,IAAI,CAAC;QAAE0F,IAAI;QAAEM,gBAAgB,EAAElE,SAAS,CAACkE,gBAAgB;QAAEC,UAAU,EAAEnE,SAAS,CAACmE;AAAW,OAAC,CAAC;AACxG,MAAA,KAAK,MAAMC,KAAK,IAAIpE,SAAS,CAACD,UAAU,EAAE0D,aAAa,CAACW,KAAK,EAAEV,KAAK,GAAG,CAAC,CAAC;AACzE,MAAA,IAAI1D,SAAS,CAACE,UAAU,EAAE9D,MAAM,EAChC;QACI0B,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,gBAAgB,EAAE,CAAA,EAAGA,MAAM,CAAA,KAAA,CAAO,CAAC;AACvD,QAAA,KAAK,MAAM2H,KAAK,IAAIpE,SAAS,CAACE,UAAU,EAAEuD,aAAa,CAACW,KAAK,EAAEV,KAAK,GAAG,CAAC,CAAC;AACzE5F,QAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,OAAO,CAAC;AAChC,MAAA;AACAqB,MAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,GAAG,CAAC;AACxB,MAAA;AACJ,IAAA,CAAC,MACI,IAAIuD,SAAS,CAACrE,IAAI,KAAK,QAAQ,EACpC;AACImC,MAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,WAAWuD,SAAS,CAACqE,QAAQ,CAACxJ,IAAI,CAAA,CAAA,CAAG,EAAE,CAAA,EAAG4B,MAAM,GAAG,CAAC;MACxE0F,SAAS,CAACjE,IAAI,CAAC;QAAE0F,IAAI;QAAEM,gBAAgB,EAAElE,SAAS,CAACkE,gBAAgB;QAAEC,UAAU,EAAEnE,SAAS,CAACmE;AAAW,OAAC,CAAC;AACxG,MAAA,KAAK,MAAMhE,MAAM,IAAIH,SAAS,CAACI,OAAO,EACtC;AACI,QAAA,MAAMkE,SAAS,GAAGnE,MAAM,CAACmE,SAAS,CAACxH,GAAG,CAAEE,KAAK,IAAK,CAAA,EAAGA,KAAK,GAAG,CAAC;QAC9D,IAAImD,MAAM,CAACoE,SAAS,EAAED,SAAS,CAACpG,IAAI,CAAC,SAAS,CAAC;QAC/C,MAAMsG,KAAK,GAAGF,SAAS,CAAClI,MAAM,KAAK,CAAC,IAAI+D,MAAM,CAACoE,SAAS,GAAG,SAAS,GAAG,CAAA,KAAA,EAAQD,SAAS,CAAC/I,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE;AACrGuC,QAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,CAAA,IAAA,EAAO+H,KAAK,CAAA,CAAA,CAAG,EAAE,CAAA,EAAG/H,MAAM,CAAA,KAAA,CAAO,CAAC;AACtD,QAAA,KAAK,MAAM2H,KAAK,IAAIjE,MAAM,CAACJ,UAAU,EAAE0D,aAAa,CAACW,KAAK,EAAEV,KAAK,GAAG,CAAC,CAAC;AACtE5F,QAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,OAAO,CAAC;AAChC,MAAA;AACA,MAAA,IAAI,CAACuD,SAAS,CAACI,OAAO,CAAC8C,IAAI,CAAE/C,MAAM,IAAKA,MAAM,CAACoE,SAAS,CAAC,EACzD;AACI;AACA;AACA;AACA;AACAzG,QAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,CAAA,YAAA,CAAc,EAAE,CAAA,EAAGA,MAAM,CAAA,KAAA,CAAO,EAAE,CAAA,EAAGA,MAAM,OAAO,CAAC;AAC3E,MAAA;AACAqB,MAAAA,KAAK,CAACI,IAAI,CAAC,CAAA,EAAGzB,MAAM,GAAG,CAAC;AACxB,MAAA;AACJ,IAAA;AACA,IAAA,IAAIU,MAAM,CAACsH,SAAS,CAACzE,SAAS,CAACkE,gBAAgB,CAAC,IAAI/G,MAAM,CAACsH,SAAS,CAACzE,SAAS,CAACmE,UAAU,CAAC,EAC1F;MACIhC,SAAS,CAACjE,IAAI,CAAC;QAAE0F,IAAI;QAAEM,gBAAgB,EAAElE,SAAS,CAACkE,gBAAgB;QAAEC,UAAU,EAAEnE,SAAS,CAACmE;AAAW,OAAC,CAAC;AAC5G,IAAA;AACJ,EAAA;AAEA,EAAA,KAAK,MAAMnE,SAAS,IAAIrB,OAAO,CAACoB,UAAU,EAAE0D,aAAa,CAACzD,SAAS,EAAE,CAAC,CAAC;AACvElC,EAAAA,KAAK,CAACI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAEnB,EAAA,MAAMwG,kBAAkB,GAAG,IAAIhK,GAAG,EAAE;AAEpC,EAAA,KAAK,MAAMkJ,IAAI,IAAI9F,KAAK,EACxB;AACI,IAAA,KAAK,MAAMlD,IAAI,IAAIgJ,IAAI,CAACe,KAAK,CAAC,0BAA0B,CAAC,IAAI,EAAE,EAAED,kBAAkB,CAAClF,GAAG,CAAC5E,IAAI,CAAC;AACjG,EAAA;EAEA,IAAI8J,kBAAkB,CAAC1B,IAAI,EAC3B;AACIlF,IAAAA,KAAK,CAAC8G,MAAM,CAAC7B,oBAAoB,EAAE,CAAC,EAAE,GAAG8B,yBAAyB,CAACH,kBAAkB,CAAC,CAAC;AAC3F,EAAA;EAEA,OAAO;AACH/I,IAAAA,IAAI,EAAE,aAAa;AACnBmG,IAAAA,MAAM,EAAE,iBAAiB;AACzBgD,IAAAA,aAAa,EAAE,CAAC;IAChBpI,MAAM,EAAEiC,OAAO,CAACjC,MAAM;IACtB8D,KAAK,EAAE7B,OAAO,CAAC6B,KAAK;IACpBE,UAAU,EAAE/B,OAAO,CAAC+B,UAAU;AAC9B7F,IAAAA,IAAI,EAAEiD,KAAK,CAACvC,IAAI,CAAC,IAAI,CAAC;IACtB4G,SAAS;AACT,IAAA,IAAIC,OAAO,GAAG;MAAEa,eAAe,EAAEtE,OAAO,CAACsE;KAAiB,GAAG,EAAE,CAAC;AAChEtE,IAAAA;GACH;AACL;;;;"}
|
|
1
|
+
{"version":3,"file":"emitWgsl.js","sources":["../../../../../../../src/resource/formats/webgpu/core/wgsl/emitWgsl.js"],"sourcesContent":["import { EmulatedAddressingHelpers } from \"./emulatedAddressing.js\";\nimport { CARBON_BACKEND_UNORM_TARGET_OVERRIDE } from \"../../../../format/carbonEffect/carbonEffectBackendBlock.js\";\nimport { lowerDxbcToIr } from \"../ir/lowerDxbcToIr.js\";\nimport { lowerComputeProgram } from \"./lowerComputeProgram.js\";\nimport { lowerFragmentProgram } from \"./lowerFragmentProgram.js\";\nimport { lowerVertexProgram } from \"./lowerVertexProgram.js\";\n\nconst COMPONENTS = [ \"x\", \"y\", \"z\", \"w\" ];\nconst SAFE_WORKGROUP_IDENTIFIER = /^[A-Za-z][A-Za-z0-9_]*$/u;\nconst WORKGROUP_ELEMENT_BYTES = 4;\nconst MAX_WORKGROUP_VARIABLE_BYTES = 16 * 1024;\nconst WGSL_RESERVED_IDENTIFIERS = new Set([\n \"NULL\", \"Self\", \"abstract\", \"active\", \"alias\", \"alignas\", \"alignof\", \"array\", \"as\",\n \"asm\", \"asm_fragment\", \"async\", \"atomic\", \"attribute\", \"auto\", \"await\", \"become\",\n \"binding_array\", \"bool\", \"break\", \"case\", \"cast\", \"catch\", \"class\", \"co_await\",\n \"co_return\", \"co_yield\", \"coherent\", \"column_major\", \"common\", \"compile\",\n \"compile_fragment\", \"concept\", \"const\", \"const_assert\", \"const_cast\", \"consteval\",\n \"constexpr\", \"constinit\", \"continue\", \"continuing\", \"crate\", \"debug\", \"debugger\",\n \"decltype\", \"default\", \"delete\", \"demote\", \"demote_to_helper\", \"diagnostic\", \"discard\",\n \"do\", \"dynamic_cast\", \"else\", \"enable\", \"enum\", \"explicit\", \"export\", \"extends\",\n \"extern\", \"external\", \"f16\", \"f32\", \"fallthrough\", \"false\", \"filter\", \"final\",\n \"finally\", \"fn\", \"for\", \"friend\", \"from\", \"fxgroup\", \"get\", \"goto\", \"groupshared\",\n \"highp\", \"i32\", \"if\", \"impl\", \"implements\", \"import\", \"inline\", \"instanceof\",\n \"interface\", \"layout\", \"let\", \"loop\", \"lowp\", \"macro\", \"macro_rules\", \"match\",\n \"mediump\", \"meta\", \"mod\", \"module\", \"move\", \"mut\", \"mutable\", \"namespace\", \"new\",\n \"nil\", \"noexcept\", \"noinline\", \"nointerpolation\", \"noperspective\", \"null\", \"nullptr\",\n \"of\", \"operator\", \"override\", \"package\", \"packoffset\", \"partition\", \"pass\", \"patch\",\n \"pixelfragment\", \"precise\", \"precision\", \"premerge\", \"priv\", \"protected\", \"ptr\",\n \"pub\", \"public\", \"readonly\", \"ref\", \"regardless\", \"register\", \"reinterpret_cast\",\n \"require\", \"requires\", \"resource\", \"restrict\", \"return\", \"sampler\",\n \"sampler_comparison\", \"self\", \"set\", \"shared\", \"sizeof\", \"smooth\", \"snorm\", \"static\",\n \"static_assert\", \"static_cast\", \"std\", \"struct\", \"subroutine\", \"super\", \"switch\",\n \"target\", \"template\", \"this\", \"thread_local\", \"throw\", \"trait\", \"true\", \"try\", \"type\",\n \"typedef\", \"typeid\", \"typename\", \"typeof\", \"u32\", \"union\", \"unless\", \"unorm\", \"unsafe\",\n \"unsized\", \"use\", \"using\", \"var\", \"varying\", \"vec2\", \"vec3\", \"vec4\", \"virtual\",\n \"volatile\", \"wgsl\", \"where\", \"while\", \"with\", \"writeonly\", \"yield\"\n]);\n\n/**\n * One assignment statement. WGSL cannot assign to a multi-component swizzle\n * (`r0.yz = ...` is \"cannot assign to value of type swizzle\"), so a register\n * write with a two- to four-lane mask evaluates once into a block-scoped\n * temporary and writes each lane from it, in the mask's order.\n */\nfunction valueAssignment(name, code)\n{\n const swizzle = /^(.+)\\.([xyzw]{2,4})$/u.exec(name);\n\n if (!swizzle) return `${name} = ${code};`;\n\n const [ , target, mask ] = swizzle;\n const lanes = Array.from(mask, (lane, index) => `${target}.${lane} = lanes.${COMPONENTS[index]};`);\n\n return `{ let lanes = ${code}; ${lanes.join(\" \")} }`;\n}\n\nfunction attribute(field, invariantPosition = false)\n{\n if (field.attribute.kind !== \"builtin\")\n {\n const interpolate = field.interpolation ? ` @interpolate(${field.interpolation})` : \"\";\n return `@location(${field.attribute.index})${interpolate}`;\n }\n const invariant = invariantPosition && field.attribute.name === \"position\" ? \"@invariant \" : \"\";\n return `${invariant}@builtin(${field.attribute.name})`;\n}\n\nfunction access(base, field, components)\n{\n const natural = COMPONENTS.slice(0, field.components.length);\n const suffix = components.length === natural.length\n && components.every((component, index) => component === natural[index])\n ? \"\"\n : `.${components.join(\"\")}`;\n return `${base}.${field.name}${suffix}`;\n}\n\n/**\n * Assigns into an interface field, one statement per component when the write is\n * a partial swizzle.\n *\n * WGSL HAS NO SWIZZLE ASSIGNMENT, and this is the whole reason the function\n * exists. `output.output1.xy = vec2<f32>(...)` is a compile error - Tint rejects\n * it with \"cannot assign to value of type 'swizzle<...>'\" - while reading a\n * swizzle is fine and a WHOLE-field assignment is fine. HLSL and GLSL both allow\n * the write, so a mask that came straight across from DXBC produces one.\n *\n * IT COMPILED IN ONE CHROME AND NOT ANOTHER, which is why this survived a\n * headless run with a real adapter: the stricter Tint refused the same module\n * the looser one had accepted. The spec has never allowed it, so the strict\n * reading is the right one and the emitter must not rely on either.\n *\n * The source is bound to a `let` first rather than swizzled in place, so an\n * expression with a function call in it is evaluated ONCE however many\n * components it feeds. The `let` takes no type annotation because WGSL infers\n * it, and the emitter does not always have the source type to hand.\n *\n * The temporary is numbered by the CALLER, from a counter that restarts for each\n * function emitted, so the same program always produces the same text. A\n * module-level counter would have made emission depend on what was emitted\n * before it in the process, and the container tests compare bytes.\n *\n * @param {string} indent Leading whitespace for the statement.\n * @param {object} field The interface field being written.\n * @param {string[]} components The target components, in write order.\n * @param {string} source The right-hand side, already emitted.\n * @param {number} ordinal Index of this partial write within the function.\n * @returns {string[]} One or more WGSL statements.\n */\nfunction assignComponents(indent, field, components, source, ordinal)\n{\n const natural = COMPONENTS.slice(0, field.components.length);\n const whole = components.length === natural.length\n && components.every((component, index) => component === natural[index]);\n\n // A whole-field write, or a single component, is already legal as written.\n if (whole || components.length === 1)\n {\n return [ `${indent}${access(\"output\", field, components)} = ${source};` ];\n }\n\n const temporary = `swizzleWrite${ordinal}`;\n\n return [\n `${indent}let ${temporary} = ${source};`,\n ...components.map((component, index) =>\n `${indent}output.${field.name}.${component} = ${temporary}.${COMPONENTS[index]};`)\n ];\n}\n\n/**\n * One f32 lane of an immediate constant buffer or immutable indexable-temp\n * table. Non-finite lanes and negative zero are written as `bitcast<f32>` of\n * the raw bits so the exceptional or sign pattern survives. Finite lanes use a\n * readable decimal; WGSL does not fix the rounding direction of an inexact\n * decimal-to-f32 conversion, so that form is not a normative raw-bit guarantee.\n *\n * @param {{float32: number, uint32: number}} value Decoded lane.\n * @returns {string} WGSL f32 expression.\n */\nfunction f32Literal(value)\n{\n const number = value.float32;\n if (!Number.isFinite(number) || Object.is(number, -0))\n {\n return `bitcast<f32>(0x${(value.uint32 >>> 0).toString(16).padStart(8, \"0\")}u)`;\n }\n const text = String(number);\n return /[.eE]/u.test(text) ? text : `${text}.0`;\n}\n\nfunction emitImmediateConstantBuffer(lines, rows)\n{\n const vectors = rows.map((row) => `vec4<f32>(${row.map(f32Literal).join(\", \")})`);\n lines.push(`const icb = array<vec4<f32>, ${rows.length}>(${vectors.join(\", \")});`, \"\");\n}\n\nfunction emitConstTables(lines, tables)\n{\n for (const table of tables)\n {\n const vectors = table.rows.map((row) => `vec4<f32>(${row.map(f32Literal).join(\", \")})`);\n lines.push(`const ${table.symbol} = array<vec4<f32>, ${table.rows.length}>(${vectors.join(\", \")});`, \"\");\n }\n}\n\nfunction emitStruct(lines, name, fields, invariantPosition = false)\n{\n lines.push(`struct ${name}`, \"{\");\n for (const field of fields)\n {\n lines.push(` ${attribute(field, invariantPosition)} ${field.name}: ${field.type},`);\n }\n lines.push(\"};\", \"\");\n}\n\n/**\n * Formats the closed compute-builtin subset accepted by the WGSL emitter.\n *\n * @param {object} program Typed shader program.\n * @returns {string} WGSL entry-point parameter list.\n */\nexport function computeEntryPointParameters(program)\n{\n const inputs = program?.builtinInputs;\n if (inputs === undefined) return \"\";\n if (!Array.isArray(inputs) || inputs.length === 0)\n {\n throw new Error(\"WGSL compute builtinInputs must be a non-empty array\");\n }\n const names = new Set();\n const builtins = new Set();\n for (const input of inputs)\n {\n if (!input || typeof input !== \"object\" || Array.isArray(input))\n {\n throw new Error(\"WGSL compute builtin input must be an object\");\n }\n const keys = Object.keys(input).sort();\n if (keys.length !== 3\n || keys[0] !== \"builtin\" || keys[1] !== \"name\" || keys[2] !== \"type\")\n {\n throw new Error(\"WGSL compute builtin input contains unsupported metadata\");\n }\n if (typeof input.builtin !== \"string\" || typeof input.name !== \"string\"\n || typeof input.type !== \"string\")\n {\n throw new Error(\"WGSL compute builtin input fields must be strings\");\n }\n if (builtins.has(input.builtin))\n {\n throw new Error(`WGSL compute builtin input duplicates ${input.builtin}`);\n }\n if (names.has(input.name))\n {\n throw new Error(`WGSL compute builtin input duplicates parameter ${input.name}`);\n }\n builtins.add(input.builtin);\n names.add(input.name);\n }\n // A CLOSED SCHEMA: every input is one of these, with exactly this name and\n // type, and they arrive in this order (the lowering's own order). Any\n // subset in that order is accepted; CORTAO's Pack pass, for one, reads\n // SV_GroupIndex beside the group and thread IDs.\n let previous = -1;\n for (const input of inputs)\n {\n const index = COMPUTE_BUILTIN_SCHEMA.findIndex((entry) =>\n entry.builtin === input.builtin && entry.name === input.name && entry.type === input.type);\n if (index <= previous)\n {\n throw new Error(\"WGSL compute builtinInputs contains an unsupported ordered schema\");\n }\n previous = index;\n }\n return inputs.map((input) => `@builtin(${input.builtin}) ${input.name}: ${input.type}`).join(\", \");\n}\n\n/** The compute builtins the lowering emits, in their fixed order. */\nconst COMPUTE_BUILTIN_SCHEMA = Object.freeze([\n Object.freeze({ builtin: \"workgroup_id\", name: \"workgroup_id\", type: \"vec3<u32>\" }),\n Object.freeze({ builtin: \"local_invocation_id\", name: \"local_invocation_id\", type: \"vec3<u32>\" }),\n Object.freeze({ builtin: \"global_invocation_id\", name: \"dispatch_thread_id\", type: \"vec3<u32>\" }),\n Object.freeze({ builtin: \"local_invocation_index\", name: \"local_invocation_index\", type: \"u32\" })\n]);\n\nfunction collectStatementNames(statements, names)\n{\n for (const statement of statements || [])\n {\n if (typeof statement?.name === \"string\") names.add(statement.name);\n if (Array.isArray(statement?.statements)) collectStatementNames(statement.statements, names);\n if (Array.isArray(statement?.elseStatements)) collectStatementNames(statement.elseStatements, names);\n if (Array.isArray(statement?.continuing)) collectStatementNames(statement.continuing, names);\n for (const clause of statement?.clauses || [])\n {\n collectStatementNames(clause.statements, names);\n }\n }\n}\n\n/**\n * Validates and formats the closed module-scope workgroup-variable schema.\n * The 16 KiB cap is deliberately the WebGPU baseline workgroup-storage limit,\n * applied cumulatively so admitted modules remain portable without querying\n * device-specific limits.\n *\n * @param {object} program Typed shader program.\n * @returns {string[]} Canonical WGSL workgroup variable declarations.\n */\nexport function computeWorkgroupVariableDeclarations(program)\n{\n const variables = program?.workgroupVariables;\n if (variables === undefined) return [];\n if (program?.stage !== \"compute\")\n {\n throw new Error(\"WGSL workgroupVariables metadata is compute-only\");\n }\n if (!Array.isArray(variables) || variables.length === 0)\n {\n throw new Error(\"WGSL compute workgroupVariables must be a non-empty array\");\n }\n\n const occupied = new Set();\n if (typeof program.entryPoint === \"string\") occupied.add(program.entryPoint);\n for (const input of program.builtinInputs || [])\n {\n if (typeof input?.name === \"string\") occupied.add(input.name);\n }\n for (const binding of program.bindings || [])\n {\n if (typeof binding?.generatedSymbol === \"string\") occupied.add(binding.generatedSymbol);\n }\n if (program.immediateConstantBuffer?.length) occupied.add(\"icb\");\n for (const table of program.constTables || [])\n {\n if (typeof table?.symbol === \"string\") occupied.add(table.symbol);\n }\n collectStatementNames(program.statements, occupied);\n\n const names = new Set();\n const declarations = [];\n let footprint = 0;\n for (const variable of variables)\n {\n if (!variable || typeof variable !== \"object\" || Array.isArray(variable))\n {\n throw new Error(\"WGSL compute workgroup variable must be an object\");\n }\n const keys = Object.keys(variable).sort();\n if (keys.length !== 3\n || keys[0] !== \"elementCount\" || keys[1] !== \"elementType\" || keys[2] !== \"name\")\n {\n throw new Error(\"WGSL compute workgroup variable contains unsupported metadata\");\n }\n const { name, elementType, elementCount } = variable;\n if (typeof name !== \"string\"\n || !SAFE_WORKGROUP_IDENTIFIER.test(name)\n || name.includes(\"__\")\n || WGSL_RESERVED_IDENTIFIERS.has(name))\n {\n throw new Error(`WGSL compute workgroup variable has unsafe name ${JSON.stringify(name)}`);\n }\n if (elementType !== \"u32\" && elementType !== \"atomic<u32>\")\n {\n throw new Error(`WGSL compute workgroup variable ${name} has unsupported element type`);\n }\n if (!Number.isSafeInteger(elementCount) || elementCount < 1)\n {\n throw new Error(`WGSL compute workgroup variable ${name} requires a positive safe-integer elementCount`);\n }\n if (names.has(name))\n {\n throw new Error(`WGSL compute workgroup variable duplicates ${name}`);\n }\n if (occupied.has(name))\n {\n throw new Error(`WGSL compute workgroup variable ${name} collides with another shader symbol`);\n }\n footprint += elementCount * WORKGROUP_ELEMENT_BYTES;\n if (footprint > MAX_WORKGROUP_VARIABLE_BYTES)\n {\n throw new Error(\"WGSL compute workgroupVariables exceed the conservative 16 KiB footprint\");\n }\n names.add(name);\n declarations.push(`var<workgroup> ${name}: array<${elementType}, ${elementCount}>;`);\n }\n return declarations;\n}\n\n/**\n * Builds deterministic WGSL and a DXBC-offset source map for the supported IR.\n *\n * @param {Uint8Array|ArrayBuffer|ArrayBufferView|object} input DXBC or CJS IR.\n * @param {object} [options] Source/provenance options.\n * @returns {object} Frozen WGSL shader descriptor.\n */\nexport function buildWgsl(input, options = {})\n{\n if (options.precisionPolicy !== undefined)\n {\n throw new TypeError(\"WGSL precisionPolicy is not supported; precise controls require exact lowering\");\n }\n const ir = input?.format === \"CJS_SHADER_IR\" ? input : lowerDxbcToIr(input, options);\n let program;\n if (ir.stage === \"vertex\") program = lowerVertexProgram(ir, options);\n else if (ir.stage === \"pixel\") program = lowerFragmentProgram(ir, options);\n else if (ir.stage === \"compute\") program = lowerComputeProgram(ir, options);\n else throw new Error(`WGSL lowering does not support the ${ir.stage || \"unknown\"} shader stage`);\n const lines = [];\n const sourceMap = [];\n const compute = program.stage === \"compute\";\n if (!compute && program.builtinInputs !== undefined)\n {\n throw new Error(\"WGSL render lowering cannot emit compute builtinInputs\");\n }\n const prefix = program.stage === \"vertex\" ? \"Vertex\" : \"Fragment\";\n if (program.requiresDerivativeUniformityOptOut)\n {\n // This shader computes a screen-space derivative / implicit-LOD sample\n // inside non-uniform control flow, which WGSL forbids by default. The\n // DXBC source relied on D3D11's permissive behavior; this module-level\n // filter reproduces it (a standard WGSL opt-out) rather than rejecting\n // the shader. Neighbor lanes that skip the branch yield undefined\n // derivatives there, exactly as under D3D11.\n // The directive rather than gradient hoisting: converting to\n // textureSampleGrad with a gradient computed in uniform control flow\n // would substitute a different gradient than the one D3D11 used. The\n // directive keeps the operation at its source control-flow point, is\n // emitted only when the fragment lowerer detected a non-uniform\n // derivative/sample (including after a loop with a non-uniform exit),\n // and is flagged on the typed program so the reliance is never silent.\n lines.push(\"diagnostic(off, derivative_uniformity);\", \"\");\n }\n const interfaceInputs = compute ? [] : program.interface.inputs;\n const interfaceOutputs = compute ? [] : program.interface.outputs;\n const hasInputs = interfaceInputs.length > 0;\n if (hasInputs) emitStruct(lines, `${prefix}Input`, interfaceInputs);\n if (!compute) emitStruct(lines, `${prefix}Output`, interfaceOutputs, program.stage === \"vertex\");\n\n // D3D stores a float written to a UNORM target clamped to [0, 1], NaN as\n // 0. WebGPU has no 16-bit UNORM the backend can render and filter, so it\n // renders those into float stand-ins and sets this override on the\n // pipeline to store the same values (CARBON_BACKEND_UNORM_TARGET_OVERRIDE).\n const unormOutputs = program.stage === \"fragment\"\n ? interfaceOutputs.filter((field) => field.attribute.kind !== \"builtin\" && /f32/u.test(field.type))\n : [];\n for (const field of unormOutputs)\n {\n lines.push(`override ${CARBON_BACKEND_UNORM_TARGET_OVERRIDE}${field.attribute.index}: bool = false;`);\n }\n if (unormOutputs.length) lines.push(\"\");\n if (program.immediateConstantBuffer?.length) emitImmediateConstantBuffer(lines, program.immediateConstantBuffer);\n if (program.constTables?.length) emitConstTables(lines, program.constTables);\n const workgroupDeclarations = computeWorkgroupVariableDeclarations(program);\n if (workgroupDeclarations.length) lines.push(...workgroupDeclarations, \"\");\n for (const binding of program.bindings || [])\n {\n lines.push(`@group(${binding.group}) @binding(${binding.binding}) ${binding.declaration} ${binding.generatedSymbol}: ${binding.type};`);\n }\n if (program.bindings?.length) lines.push(\"\");\n\n // Reserved for the emulated-addressing helpers, spliced in at the end once\n // the body has been generated and it is known whether anything called them.\n // WGSL needs a function declared before its call, and the body comes later.\n const helperInsertionPoint = lines.length;\n\n if (compute)\n {\n const size = program.threadGroupSize;\n if (!Array.isArray(size) || size.length !== 3\n || size.some((value) => !Number.isSafeInteger(value) || value < 1))\n {\n throw new Error(\"WGSL compute lowering requires a positive three-dimensional threadGroupSize\");\n }\n const parameters = computeEntryPointParameters(program);\n lines.push(`@compute @workgroup_size(${size.join(\", \")})`, `fn ${program.entryPoint}(${parameters})`, \"{\");\n }\n else\n {\n const parameters = hasInputs ? `input: ${prefix}Input` : \"\";\n lines.push(`@${program.stage}`, `fn ${program.entryPoint}(${parameters}) -> ${prefix}Output`, \"{\", ` var output: ${prefix}Output;`);\n }\n\n const inputById = new Map(interfaceInputs.map((field) => [ field.id, field ]));\n const outputById = new Map(interfaceOutputs.map((field) => [ field.id, field ]));\n\n // Numbers the temporaries a partial interface write needs. Local to this\n // function so the same program always emits the same text.\n let swizzleWrites = 0;\n\n function emitStatement(statement, depth)\n {\n const indent = \" \".repeat(depth);\n const line = lines.length + 1;\n if (statement.kind === \"assignment\")\n {\n if (compute) throw new Error(\"WGSL compute lowering cannot emit a render-interface assignment\");\n const targetField = outputById.get(statement.target.fieldId);\n const source = statement.expression.fieldId\n ? access(\"input\", inputById.get(statement.expression.fieldId), statement.expression.components)\n : statement.expression.code;\n\n lines.push(...assignComponents(indent, targetField, statement.target.components, source, swizzleWrites));\n\n if (statement.target.components.length > 1) swizzleWrites += 1;\n }\n else if (statement.kind === \"let\")\n {\n lines.push(`${indent}let ${statement.name}: ${statement.type} = ${statement.expression.code};`);\n }\n else if (statement.kind === \"var\")\n {\n lines.push(statement.expression\n ? `${indent}var ${statement.name}: ${statement.type} = ${statement.expression.code};`\n : `${indent}var ${statement.name}: ${statement.type};`);\n }\n else if (statement.kind === \"value-assignment\")\n {\n lines.push(`${indent}${valueAssignment(statement.name, statement.expression.code)}`);\n }\n else if (statement.kind === \"return\")\n {\n // NaN is found by its bits: WGSL lets a compiler assume floats are\n // never NaN, so `v != v` may fold to false.\n for (const field of unormOutputs)\n {\n const value = `output.${field.name}`;\n const zero = `${field.type}(0.0)`;\n const bits = field.type.replace(\"f32\", \"u32\");\n const nan = `(bitcast<${bits}>(${value}) & ${bits}(0x7fffffffu)) > ${bits}(0x7f800000u)`;\n lines.push(`${indent}if (${CARBON_BACKEND_UNORM_TARGET_OVERRIDE}${field.attribute.index}) { ${value} = clamp(select(${value}, ${zero}, ${nan}), ${zero}, ${field.type}(1.0)); }`);\n }\n lines.push(compute ? `${indent}return;` : `${indent}return output;`);\n }\n else if (statement.kind === \"discard\")\n {\n lines.push(`${indent}discard;`);\n }\n else if (statement.kind === \"call\")\n {\n lines.push(`${indent}${statement.expression.code};`);\n }\n else if (statement.kind === \"if\")\n {\n lines.push(`${indent}if (${statement.condition.code})`, `${indent}{`);\n sourceMap.push({ line, instructionIndex: statement.instructionIndex, dxbcOffset: statement.dxbcOffset });\n for (const child of statement.statements) emitStatement(child, depth + 1);\n lines.push(`${indent}}`);\n if (statement.elseStatements?.length)\n {\n lines.push(`${indent}else`, `${indent}{`);\n for (const child of statement.elseStatements) emitStatement(child, depth + 1);\n lines.push(`${indent}}`);\n }\n return;\n }\n else if (statement.kind === \"break\")\n {\n lines.push(`${indent}break;`);\n }\n else if (statement.kind === \"continue\")\n {\n lines.push(`${indent}continue;`);\n }\n else if (statement.kind === \"loop\")\n {\n lines.push(`${indent}loop`, `${indent}{`);\n sourceMap.push({ line, instructionIndex: statement.instructionIndex, dxbcOffset: statement.dxbcOffset });\n for (const child of statement.statements) emitStatement(child, depth + 1);\n if (statement.continuing?.length)\n {\n lines.push(`${indent} continuing`, `${indent} {`);\n for (const child of statement.continuing) emitStatement(child, depth + 2);\n lines.push(`${indent} }`);\n }\n lines.push(`${indent}}`);\n return;\n }\n else if (statement.kind === \"switch\")\n {\n lines.push(`${indent}switch (${statement.selector.code})`, `${indent}{`);\n sourceMap.push({ line, instructionIndex: statement.instructionIndex, dxbcOffset: statement.dxbcOffset });\n for (const clause of statement.clauses)\n {\n const selectors = clause.selectors.map((value) => `${value}u`);\n if (clause.isDefault) selectors.push(\"default\");\n const label = selectors.length === 1 && clause.isDefault ? \"default\" : `case ${selectors.join(\", \")}`;\n lines.push(`${indent} ${label}:`, `${indent} {`);\n for (const child of clause.statements) emitStatement(child, depth + 2);\n lines.push(`${indent} }`);\n }\n if (!statement.clauses.some((clause) => clause.isDefault))\n {\n // WGSL requires a default clause; a DXBC switch without one\n // falls through to endswitch, which an empty default matches.\n // Switches carrying live merges need a real DXBC default and\n // are rejected earlier by the switch merge planner.\n lines.push(`${indent} default:`, `${indent} {`, `${indent} }`);\n }\n lines.push(`${indent}}`);\n return;\n }\n if (Number.isInteger(statement.instructionIndex) && Number.isInteger(statement.dxbcOffset))\n {\n sourceMap.push({ line, instructionIndex: statement.instructionIndex, dxbcOffset: statement.dxbcOffset });\n }\n }\n\n for (const statement of program.statements) emitStatement(statement, 1);\n lines.push(\"}\", \"\");\n\n const usedAddressHelpers = new Set();\n\n for (const line of lines)\n {\n for (const name of line.match(/cjsAddress[A-Za-z0-9]*/gu) ?? []) usedAddressHelpers.add(name);\n }\n\n if (usedAddressHelpers.size)\n {\n lines.splice(helperInsertionPoint, 0, ...EmulatedAddressingHelpers(usedAddressHelpers));\n }\n\n return {\n kind: \"wgsl-shader\",\n format: \"CJS_WGSL_SHADER\",\n formatVersion: 1,\n source: program.source,\n stage: program.stage,\n entryPoint: program.entryPoint,\n code: lines.join(\"\\n\"),\n sourceMap,\n ...(compute ? { threadGroupSize: program.threadGroupSize } : {}),\n program\n };\n}\n"],"names":["COMPONENTS","SAFE_WORKGROUP_IDENTIFIER","WORKGROUP_ELEMENT_BYTES","MAX_WORKGROUP_VARIABLE_BYTES","WGSL_RESERVED_IDENTIFIERS","Set","valueAssignment","name","code","swizzle","exec","target","mask","lanes","Array","from","lane","index","join","attribute","field","invariantPosition","kind","interpolate","interpolation","invariant","access","base","components","natural","slice","length","suffix","every","component","assignComponents","indent","source","ordinal","whole","temporary","map","f32Literal","value","number","float32","Number","isFinite","Object","is","uint32","toString","padStart","text","String","test","emitImmediateConstantBuffer","lines","rows","vectors","row","push","emitConstTables","tables","table","symbol","emitStruct","fields","type","computeEntryPointParameters","program","inputs","builtinInputs","undefined","isArray","Error","names","builtins","input","keys","sort","builtin","has","add","previous","COMPUTE_BUILTIN_SCHEMA","findIndex","entry","freeze","collectStatementNames","statements","statement","elseStatements","continuing","clause","clauses","computeWorkgroupVariableDeclarations","variables","workgroupVariables","stage","occupied","entryPoint","binding","bindings","generatedSymbol","immediateConstantBuffer","constTables","declarations","footprint","variable","elementType","elementCount","includes","JSON","stringify","isSafeInteger","buildWgsl","options","precisionPolicy","TypeError","ir","format","lowerDxbcToIr","lowerVertexProgram","lowerFragmentProgram","lowerComputeProgram","sourceMap","compute","prefix","requiresDerivativeUniformityOptOut","interfaceInputs","interface","interfaceOutputs","outputs","hasInputs","unormOutputs","filter","CARBON_BACKEND_UNORM_TARGET_OVERRIDE","workgroupDeclarations","group","declaration","helperInsertionPoint","size","threadGroupSize","some","parameters","inputById","Map","id","outputById","swizzleWrites","emitStatement","depth","repeat","line","targetField","get","fieldId","expression","zero","bits","replace","nan","condition","instructionIndex","dxbcOffset","child","selector","selectors","isDefault","label","isInteger","usedAddressHelpers","match","splice","EmulatedAddressingHelpers","formatVersion"],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { CARBON_BACKEND_ADDRESS_MODES_SYMBOL } from '../../../../format/carbonEffect/carbonEffectBackendBlock.js';
|
|
2
|
+
|
|
1
3
|
// Clamp-to-border and mirror-once, emulated in WGSL.
|
|
2
4
|
//
|
|
3
5
|
// WebGPU's GPUAddressMode has exactly three values - clamp-to-edge, repeat and
|
|
@@ -21,6 +23,7 @@
|
|
|
21
23
|
// declare a W mode - eight shipped samplers declare border on W - which must
|
|
22
24
|
// not be tested against a component that does not exist.
|
|
23
25
|
|
|
26
|
+
|
|
24
27
|
/** Helper names, so the emitter and its tests cannot disagree about spelling. */
|
|
25
28
|
const ADDRESS_COORD_2 = "cjsAddressCoord2";
|
|
26
29
|
|
|
@@ -105,11 +108,11 @@ function BorderColorLiteral(color) {
|
|
|
105
108
|
* the player can still change. The GLSL emitter reads them for the same reason:
|
|
106
109
|
* it "is what lets an override correct a container that is wrong".
|
|
107
110
|
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
111
|
+
* The WebGL2 path indexes by resource register; this one passes the SAMPLER
|
|
112
|
+
* register, as Carbon's overrides key the sampler (withEmulatedAddressing).
|
|
110
113
|
*
|
|
111
114
|
* @param {string} bufferSymbol Generated symbol of the modes buffer.
|
|
112
|
-
* @param {number} resourceRegister
|
|
115
|
+
* @param {number} resourceRegister The register the buffer is indexed by.
|
|
113
116
|
* @param {number} components 2 or 3.
|
|
114
117
|
* @returns {string} A `vec2<f32>` or `vec3<f32>` expression.
|
|
115
118
|
*/
|
|
@@ -143,5 +146,91 @@ function ShouldEmulate(modes, forced) {
|
|
|
143
146
|
return NeedsEmulation(modes) || Boolean(forced);
|
|
144
147
|
}
|
|
145
148
|
|
|
146
|
-
|
|
149
|
+
/**
|
|
150
|
+
* The constant-buffer register the modes buffer takes, as the WebGL2 path's
|
|
151
|
+
* `emulatedAddressingRegister` (docs/contracts/webgl2-emulated-addressing.md).
|
|
152
|
+
*/
|
|
153
|
+
const ADDRESS_MODES_REGISTER = 8;
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* The modes buffer's WGSL symbol. It is not `cb8`, so the backend can tell
|
|
157
|
+
* this buffer, which it fills itself, from a constant buffer the effect binds.
|
|
158
|
+
*/
|
|
159
|
+
const ADDRESS_MODES_SYMBOL = CARBON_BACKEND_ADDRESS_MODES_SYMBOL;
|
|
160
|
+
|
|
161
|
+
/** The sample forms the fragment lowering emulates addressing for. */
|
|
162
|
+
const SAMPLE_OPCODES = new Set(["sample", "sample_b", "sample_l", "sample_d"]);
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* The pixel program with emulated addressing switched on: when one of its
|
|
166
|
+
* samples goes through a sampler whose AUTHORED state has a border or
|
|
167
|
+
* mirror-once axis, the program gains the modes buffer as a uniform binding
|
|
168
|
+
* at `ADDRESS_MODES_REGISTER`, and `emulatedAddressing` names those samplers.
|
|
169
|
+
*
|
|
170
|
+
* KEYED BY SAMPLER REGISTER, as Carbon keys an override: its
|
|
171
|
+
* `Tr2Effect::RebuildSamplerOverrides` writes the sampler register, so every
|
|
172
|
+
* texture on a shared sampler changes together. The backend fills
|
|
173
|
+
* `modes[samplerRegister]` from the sampler state actually bound there, so an
|
|
174
|
+
* override that keeps an emulated mode is honoured; one that adds border to a
|
|
175
|
+
* sampler the container did not author with it is not gated here.
|
|
176
|
+
*
|
|
177
|
+
* @param {object} program Frozen CJS shader IR.
|
|
178
|
+
* @param {object[]} semanticBindings The stage's effect-description bindings.
|
|
179
|
+
* @returns {object} The program, or a copy with emulated addressing.
|
|
180
|
+
*/
|
|
181
|
+
function withEmulatedAddressing(program, semanticBindings) {
|
|
182
|
+
if (program.stage !== "pixel") return program;
|
|
183
|
+
const samplerModes = {};
|
|
184
|
+
for (const binding of semanticBindings || []) {
|
|
185
|
+
const state = binding?.kind === "sampler" && (binding.registerSpace ?? 0) === 0 ? binding.carbon?.sampler : null;
|
|
186
|
+
if (!state) continue;
|
|
187
|
+
const axes = [state.addressU, state.addressV, state.addressW];
|
|
188
|
+
if (!NeedsEmulation(axes)) continue;
|
|
189
|
+
samplerModes[binding.registerIndex] = Object.freeze({
|
|
190
|
+
u: axes[0],
|
|
191
|
+
v: axes[1],
|
|
192
|
+
w: axes[2],
|
|
193
|
+
borderColor: Object.freeze([...(state.borderColor ?? [0, 0, 0, 0])])
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const registers = Object.keys(samplerModes).map(Number);
|
|
197
|
+
const sampled = program.instructions.some(instruction => SAMPLE_OPCODES.has(instruction.opcodeName) && registers.includes(instruction.operands?.[3]?.registerIndex));
|
|
198
|
+
if (!sampled) return program;
|
|
199
|
+
if (program.bindings.some(binding => binding.resourceKind === "uniform-buffer" && (binding.range?.registerSpace ?? 0) === 0 && (binding.range?.lowerBound ?? binding.registerIndex) === ADDRESS_MODES_REGISTER)) {
|
|
200
|
+
throw new Error(`WGSL emulated addressing needs constant-buffer register ${ADDRESS_MODES_REGISTER}, which the shader already declares`);
|
|
201
|
+
}
|
|
202
|
+
const modesBuffer = Object.freeze({
|
|
203
|
+
kind: "binding",
|
|
204
|
+
id: `uniform-buffer:space0:range${ADDRESS_MODES_REGISTER}`,
|
|
205
|
+
resourceKind: "uniform-buffer",
|
|
206
|
+
operandType: "constant_buffer",
|
|
207
|
+
declarationOffset: -1,
|
|
208
|
+
registerIndex: ADDRESS_MODES_REGISTER,
|
|
209
|
+
range: Object.freeze({
|
|
210
|
+
bindingModel: "sm5.0-register",
|
|
211
|
+
rangeId: null,
|
|
212
|
+
lowerBound: ADDRESS_MODES_REGISTER,
|
|
213
|
+
upperBound: ADDRESS_MODES_REGISTER,
|
|
214
|
+
unbounded: false,
|
|
215
|
+
registerCount: 1,
|
|
216
|
+
registerSpace: 0
|
|
217
|
+
}),
|
|
218
|
+
accessPattern: "dynamic_indexed",
|
|
219
|
+
resourceDimension: null,
|
|
220
|
+
structureStride: null,
|
|
221
|
+
returnType: null,
|
|
222
|
+
synthetic: "emulated-addressing"
|
|
223
|
+
});
|
|
224
|
+
return Object.freeze({
|
|
225
|
+
...program,
|
|
226
|
+
bindings: Object.freeze([...program.bindings, modesBuffer]),
|
|
227
|
+
emulatedAddressing: Object.freeze({
|
|
228
|
+
samplerModes: Object.freeze(samplerModes),
|
|
229
|
+
bufferRegister: ADDRESS_MODES_REGISTER,
|
|
230
|
+
sizeInVec4: Math.max(...registers) + 1
|
|
231
|
+
})
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export { ADDRESS_BORDER_2, ADDRESS_BORDER_3, ADDRESS_COORD_2, ADDRESS_COORD_3, ADDRESS_MODES_REGISTER, ADDRESS_MODES_SYMBOL, BORDER_MODE, BorderColorLiteral, EmulatedAddressingHelpers, MIRROR_ONCE_MODE, ModesExpression, NeedsEmulation, ShouldEmulate, withEmulatedAddressing };
|
|
147
236
|
//# sourceMappingURL=emulatedAddressing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emulatedAddressing.js","sources":["../../../../../../../src/resource/formats/webgpu/core/wgsl/emulatedAddressing.js"],"sourcesContent":["// Clamp-to-border and mirror-once, emulated in WGSL.\n//\n// WebGPU's GPUAddressMode has exactly three values - clamp-to-edge, repeat and\n// mirror-repeat - and no border colour anywhere in GPUSamplerDescriptor. D3D's\n// TA_BORDER and TA_MIRROR_ONCE therefore cannot be expressed by a sampler at\n// all, and no WebGPU feature adds them. The shader has to do it.\n//\n// TRANSCRIBED FROM `DxbcGlslEmitter`'s helpers so the two backends cannot\n// drift. The semantics are that emitter's, verified there and exercised\n// continuously, since the WebGL2 path emulates border in practice rather than\n// reaching for EXT_texture_border_clamp.\n//\n// Modes are the Trinity enum as stored: 1 wrap, 2 mirror, 3 clamp-edge,\n// 4 border, 5 mirror-once. ZERO MEANS \"NOTHING TO EMULATE\", which is what every\n// failure produces - a zeroed buffer, an absent upload, a texture the consumer\n// did not know about. Carbon's enum starts at 1 and no shipped sampler carries\n// 0, so 0 cannot swallow a real mode.\n//\n// Two named arities rather than an overload: WGSL has no function overloading,\n// and a 2D sample has no third coordinate even though its sampler may still\n// declare a W mode - eight shipped samplers declare border on W - which must\n// not be tested against a component that does not exist.\n\n/** Helper names, so the emitter and its tests cannot disagree about spelling. */\nexport const ADDRESS_COORD_2 = \"cjsAddressCoord2\";\n\n/** @see ADDRESS_COORD_2 */\nexport const ADDRESS_COORD_3 = \"cjsAddressCoord3\";\n\n/** @see ADDRESS_COORD_2 */\nexport const ADDRESS_BORDER_2 = \"cjsAddressBorder2\";\n\n/** @see ADDRESS_COORD_2 */\nexport const ADDRESS_BORDER_3 = \"cjsAddressBorder3\";\n\n/** The two authored modes WebGPU cannot express. */\nexport const BORDER_MODE = 4;\n\n/** @see BORDER_MODE */\nexport const MIRROR_ONCE_MODE = 5;\n\n/**\n * Whether an axis list carries a mode that has to be emulated.\n *\n * @param {number[]} modes Authored `[u, v, w]` modes.\n * @returns {boolean} True when any axis is border or mirror-once.\n */\nexport function NeedsEmulation(modes)\n{\n return (modes ?? []).some((mode) => mode === BORDER_MODE || mode === MIRROR_ONCE_MODE);\n}\n\n/**\n * The helper function sources, emitted once per module that samples through an\n * emulated mode.\n *\n * `cjsAddressCoord*` transforms the coordinate BEFORE the fetch;\n * `cjsAddressBorder*` tests the result AFTER it. That is why they are separate:\n * the border test composes with every sample form the emitter produces -\n * textureSample, textureSampleBias, textureSampleLevel and textureSampleGrad -\n * instead of needing a variant for each.\n *\n * @returns {string[]} WGSL source lines.\n */\nexport function EmulatedAddressingHelpers(used)\n{\n const wanted = used instanceof Set ? used : null;\n const keep = (name, lines) => (!wanted || wanted.has(name) ? lines : []);\n\n return [\n ...keep(ADDRESS_COORD_2, [\n `fn ${ADDRESS_COORD_2}(uv: vec2<f32>, modes: vec2<f32>) -> vec2<f32>`,\n \"{\",\n \" var out = uv;\",\n ` if (i32(modes.x) == ${MIRROR_ONCE_MODE}) { out.x = clamp(abs(out.x), 0.0, 1.0); }`,\n ` if (i32(modes.y) == ${MIRROR_ONCE_MODE}) { out.y = clamp(abs(out.y), 0.0, 1.0); }`,\n \" return out;\",\n \"}\",\n ]),\n ...keep(ADDRESS_COORD_2, [ \"\" ]),\n ...keep(ADDRESS_COORD_3, [\n `fn ${ADDRESS_COORD_3}(uv: vec3<f32>, modes: vec3<f32>) -> vec3<f32>`,\n \"{\",\n \" var out = uv;\",\n ` if (i32(modes.x) == ${MIRROR_ONCE_MODE}) { out.x = clamp(abs(out.x), 0.0, 1.0); }`,\n ` if (i32(modes.y) == ${MIRROR_ONCE_MODE}) { out.y = clamp(abs(out.y), 0.0, 1.0); }`,\n ` if (i32(modes.z) == ${MIRROR_ONCE_MODE}) { out.z = clamp(abs(out.z), 0.0, 1.0); }`,\n \" return out;\",\n \"}\",\n ]),\n ...keep(ADDRESS_COORD_3, [ \"\" ]),\n // Testing the post-transform coordinate is safe: an axis is either\n // mirror-once or border, never both, and mirror-once leaves other axes\n // untouched.\n ...keep(ADDRESS_BORDER_2, [\n `fn ${ADDRESS_BORDER_2}(sampled: vec4<f32>, uv: vec2<f32>, modes: vec2<f32>, borderColor: vec4<f32>) -> vec4<f32>`,\n \"{\",\n ` if (i32(modes.x) == ${BORDER_MODE} && (uv.x < 0.0 || uv.x > 1.0)) { return borderColor; }`,\n ` if (i32(modes.y) == ${BORDER_MODE} && (uv.y < 0.0 || uv.y > 1.0)) { return borderColor; }`,\n \" return sampled;\",\n \"}\",\n ]),\n ...keep(ADDRESS_BORDER_2, [ \"\" ]),\n ...keep(ADDRESS_BORDER_3, [\n `fn ${ADDRESS_BORDER_3}(sampled: vec4<f32>, uv: vec3<f32>, modes: vec3<f32>, borderColor: vec4<f32>) -> vec4<f32>`,\n \"{\",\n ` if (i32(modes.x) == ${BORDER_MODE} && (uv.x < 0.0 || uv.x > 1.0)) { return borderColor; }`,\n ` if (i32(modes.y) == ${BORDER_MODE} && (uv.y < 0.0 || uv.y > 1.0)) { return borderColor; }`,\n ` if (i32(modes.z) == ${BORDER_MODE} && (uv.z < 0.0 || uv.z > 1.0)) { return borderColor; }`,\n \" return sampled;\",\n \"}\",\n ]),\n ...keep(ADDRESS_BORDER_3, [ \"\" ]),\n \"\"\n ];\n}\n\n/**\n * A WGSL literal for one texture's baked border colour.\n *\n * BAKED, NOT READ FROM THE BUFFER. Carbon's `AddSamplerOverride` takes only U\n * and V, so no override can change the colour, and it is not always transparent\n * black: `specialfx/cloud`, `cloudsimple` and `volumetrichalfsphereglow` author\n * opaque white.\n *\n * @param {number[]} color Four authored components.\n * @returns {string} A `vec4<f32>` literal.\n */\nexport function BorderColorLiteral(color)\n{\n const components = (color ?? [ 0, 0, 0, 0 ]).map((value) =>\n {\n const parsed = Number(value);\n\n if (!Number.isFinite(parsed))\n {\n throw new Error(\"WGSL border colour components must be finite numbers\");\n }\n\n return Number.isInteger(parsed) ? parsed.toFixed(1) : String(parsed);\n });\n\n if (components.length !== 4)\n {\n throw new Error(\"WGSL border colour must be four components\");\n }\n\n return `vec4<f32>(${components.join(\", \")})`;\n}\n\n/**\n * A WGSL expression reading one texture's axis modes at draw time.\n *\n * READ, NOT BAKED. A quad pattern's wrap modes are changed by users at will -\n * `EveSOF` writes `projectionAddressModeU`/`V` into a sampler override named\n * after the texture - so a mode baked at translation time would freeze a value\n * the player can still change. The GLSL emitter reads them for the same reason:\n * it \"is what lets an override correct a container that is wrong\".\n *\n * Indexed by RESOURCE register, not sampler register: several textures share\n * one sampler and still resolve to different modes.\n *\n * @param {string} bufferSymbol Generated symbol of the modes buffer.\n * @param {number} resourceRegister Texture register being sampled.\n * @param {number} components 2 or 3.\n * @returns {string} A `vec2<f32>` or `vec3<f32>` expression.\n */\nexport function ModesExpression(bufferSymbol, resourceRegister, components)\n{\n if (components !== 2 && components !== 3)\n {\n throw new Error(\"WGSL emulated addressing takes two or three axes\");\n }\n\n if (!bufferSymbol)\n {\n throw new Error(\"WGSL emulated addressing needs the modes buffer symbol\");\n }\n\n if (!Number.isInteger(resourceRegister) || resourceRegister < 0)\n {\n throw new Error(\"WGSL emulated addressing needs a resource register\");\n }\n\n return `${bufferSymbol}[${resourceRegister}].${components === 2 ? \"xy\" : \"xyz\"}`;\n}\n\n/**\n * Whether a sample must be gated, given what the container says and what the\n * caller forces.\n *\n * Two independent reasons, mirroring the GLSL profile. The container's own\n * modes are the ordinary case. The forced list is for a sampler whose mode can\n * CHANGE - a quad pattern's does - where the container gives no reason to gate\n * but a user can still select border or mirror-once later.\n *\n * @param {number[]} modes Container modes for the sampler, if known.\n * @param {object|null} forced The caller's entry for this texture, if it forced one.\n * @returns {boolean} True when the sample needs the helpers.\n */\nexport function ShouldEmulate(modes, forced)\n{\n return NeedsEmulation(modes) || Boolean(forced);\n}\n"],"names":["ADDRESS_COORD_2","ADDRESS_COORD_3","ADDRESS_BORDER_2","ADDRESS_BORDER_3","BORDER_MODE","MIRROR_ONCE_MODE","NeedsEmulation","modes","some","mode","EmulatedAddressingHelpers","used","wanted","Set","keep","name","lines","has","BorderColorLiteral","color","components","map","value","parsed","Number","isFinite","Error","isInteger","toFixed","String","length","join","ModesExpression","bufferSymbol","resourceRegister","ShouldEmulate","forced","Boolean"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"emulatedAddressing.js","sources":["../../../../../../../src/resource/formats/webgpu/core/wgsl/emulatedAddressing.js"],"sourcesContent":["// Clamp-to-border and mirror-once, emulated in WGSL.\n//\n// WebGPU's GPUAddressMode has exactly three values - clamp-to-edge, repeat and\n// mirror-repeat - and no border colour anywhere in GPUSamplerDescriptor. D3D's\n// TA_BORDER and TA_MIRROR_ONCE therefore cannot be expressed by a sampler at\n// all, and no WebGPU feature adds them. The shader has to do it.\n//\n// TRANSCRIBED FROM `DxbcGlslEmitter`'s helpers so the two backends cannot\n// drift. The semantics are that emitter's, verified there and exercised\n// continuously, since the WebGL2 path emulates border in practice rather than\n// reaching for EXT_texture_border_clamp.\n//\n// Modes are the Trinity enum as stored: 1 wrap, 2 mirror, 3 clamp-edge,\n// 4 border, 5 mirror-once. ZERO MEANS \"NOTHING TO EMULATE\", which is what every\n// failure produces - a zeroed buffer, an absent upload, a texture the consumer\n// did not know about. Carbon's enum starts at 1 and no shipped sampler carries\n// 0, so 0 cannot swallow a real mode.\n//\n// Two named arities rather than an overload: WGSL has no function overloading,\n// and a 2D sample has no third coordinate even though its sampler may still\n// declare a W mode - eight shipped samplers declare border on W - which must\n// not be tested against a component that does not exist.\n\nimport { CARBON_BACKEND_ADDRESS_MODES_SYMBOL } from \"../../../../format/carbonEffect/carbonEffectBackendBlock.js\";\n\n/** Helper names, so the emitter and its tests cannot disagree about spelling. */\nexport const ADDRESS_COORD_2 = \"cjsAddressCoord2\";\n\n/** @see ADDRESS_COORD_2 */\nexport const ADDRESS_COORD_3 = \"cjsAddressCoord3\";\n\n/** @see ADDRESS_COORD_2 */\nexport const ADDRESS_BORDER_2 = \"cjsAddressBorder2\";\n\n/** @see ADDRESS_COORD_2 */\nexport const ADDRESS_BORDER_3 = \"cjsAddressBorder3\";\n\n/** The two authored modes WebGPU cannot express. */\nexport const BORDER_MODE = 4;\n\n/** @see BORDER_MODE */\nexport const MIRROR_ONCE_MODE = 5;\n\n/**\n * Whether an axis list carries a mode that has to be emulated.\n *\n * @param {number[]} modes Authored `[u, v, w]` modes.\n * @returns {boolean} True when any axis is border or mirror-once.\n */\nexport function NeedsEmulation(modes)\n{\n return (modes ?? []).some((mode) => mode === BORDER_MODE || mode === MIRROR_ONCE_MODE);\n}\n\n/**\n * The helper function sources, emitted once per module that samples through an\n * emulated mode.\n *\n * `cjsAddressCoord*` transforms the coordinate BEFORE the fetch;\n * `cjsAddressBorder*` tests the result AFTER it. That is why they are separate:\n * the border test composes with every sample form the emitter produces -\n * textureSample, textureSampleBias, textureSampleLevel and textureSampleGrad -\n * instead of needing a variant for each.\n *\n * @returns {string[]} WGSL source lines.\n */\nexport function EmulatedAddressingHelpers(used)\n{\n const wanted = used instanceof Set ? used : null;\n const keep = (name, lines) => (!wanted || wanted.has(name) ? lines : []);\n\n return [\n ...keep(ADDRESS_COORD_2, [\n `fn ${ADDRESS_COORD_2}(uv: vec2<f32>, modes: vec2<f32>) -> vec2<f32>`,\n \"{\",\n \" var out = uv;\",\n ` if (i32(modes.x) == ${MIRROR_ONCE_MODE}) { out.x = clamp(abs(out.x), 0.0, 1.0); }`,\n ` if (i32(modes.y) == ${MIRROR_ONCE_MODE}) { out.y = clamp(abs(out.y), 0.0, 1.0); }`,\n \" return out;\",\n \"}\",\n ]),\n ...keep(ADDRESS_COORD_2, [ \"\" ]),\n ...keep(ADDRESS_COORD_3, [\n `fn ${ADDRESS_COORD_3}(uv: vec3<f32>, modes: vec3<f32>) -> vec3<f32>`,\n \"{\",\n \" var out = uv;\",\n ` if (i32(modes.x) == ${MIRROR_ONCE_MODE}) { out.x = clamp(abs(out.x), 0.0, 1.0); }`,\n ` if (i32(modes.y) == ${MIRROR_ONCE_MODE}) { out.y = clamp(abs(out.y), 0.0, 1.0); }`,\n ` if (i32(modes.z) == ${MIRROR_ONCE_MODE}) { out.z = clamp(abs(out.z), 0.0, 1.0); }`,\n \" return out;\",\n \"}\",\n ]),\n ...keep(ADDRESS_COORD_3, [ \"\" ]),\n // Testing the post-transform coordinate is safe: an axis is either\n // mirror-once or border, never both, and mirror-once leaves other axes\n // untouched.\n ...keep(ADDRESS_BORDER_2, [\n `fn ${ADDRESS_BORDER_2}(sampled: vec4<f32>, uv: vec2<f32>, modes: vec2<f32>, borderColor: vec4<f32>) -> vec4<f32>`,\n \"{\",\n ` if (i32(modes.x) == ${BORDER_MODE} && (uv.x < 0.0 || uv.x > 1.0)) { return borderColor; }`,\n ` if (i32(modes.y) == ${BORDER_MODE} && (uv.y < 0.0 || uv.y > 1.0)) { return borderColor; }`,\n \" return sampled;\",\n \"}\",\n ]),\n ...keep(ADDRESS_BORDER_2, [ \"\" ]),\n ...keep(ADDRESS_BORDER_3, [\n `fn ${ADDRESS_BORDER_3}(sampled: vec4<f32>, uv: vec3<f32>, modes: vec3<f32>, borderColor: vec4<f32>) -> vec4<f32>`,\n \"{\",\n ` if (i32(modes.x) == ${BORDER_MODE} && (uv.x < 0.0 || uv.x > 1.0)) { return borderColor; }`,\n ` if (i32(modes.y) == ${BORDER_MODE} && (uv.y < 0.0 || uv.y > 1.0)) { return borderColor; }`,\n ` if (i32(modes.z) == ${BORDER_MODE} && (uv.z < 0.0 || uv.z > 1.0)) { return borderColor; }`,\n \" return sampled;\",\n \"}\",\n ]),\n ...keep(ADDRESS_BORDER_3, [ \"\" ]),\n \"\"\n ];\n}\n\n/**\n * A WGSL literal for one texture's baked border colour.\n *\n * BAKED, NOT READ FROM THE BUFFER. Carbon's `AddSamplerOverride` takes only U\n * and V, so no override can change the colour, and it is not always transparent\n * black: `specialfx/cloud`, `cloudsimple` and `volumetrichalfsphereglow` author\n * opaque white.\n *\n * @param {number[]} color Four authored components.\n * @returns {string} A `vec4<f32>` literal.\n */\nexport function BorderColorLiteral(color)\n{\n const components = (color ?? [ 0, 0, 0, 0 ]).map((value) =>\n {\n const parsed = Number(value);\n\n if (!Number.isFinite(parsed))\n {\n throw new Error(\"WGSL border colour components must be finite numbers\");\n }\n\n return Number.isInteger(parsed) ? parsed.toFixed(1) : String(parsed);\n });\n\n if (components.length !== 4)\n {\n throw new Error(\"WGSL border colour must be four components\");\n }\n\n return `vec4<f32>(${components.join(\", \")})`;\n}\n\n/**\n * A WGSL expression reading one texture's axis modes at draw time.\n *\n * READ, NOT BAKED. A quad pattern's wrap modes are changed by users at will -\n * `EveSOF` writes `projectionAddressModeU`/`V` into a sampler override named\n * after the texture - so a mode baked at translation time would freeze a value\n * the player can still change. The GLSL emitter reads them for the same reason:\n * it \"is what lets an override correct a container that is wrong\".\n *\n * The WebGL2 path indexes by resource register; this one passes the SAMPLER\n * register, as Carbon's overrides key the sampler (withEmulatedAddressing).\n *\n * @param {string} bufferSymbol Generated symbol of the modes buffer.\n * @param {number} resourceRegister The register the buffer is indexed by.\n * @param {number} components 2 or 3.\n * @returns {string} A `vec2<f32>` or `vec3<f32>` expression.\n */\nexport function ModesExpression(bufferSymbol, resourceRegister, components)\n{\n if (components !== 2 && components !== 3)\n {\n throw new Error(\"WGSL emulated addressing takes two or three axes\");\n }\n\n if (!bufferSymbol)\n {\n throw new Error(\"WGSL emulated addressing needs the modes buffer symbol\");\n }\n\n if (!Number.isInteger(resourceRegister) || resourceRegister < 0)\n {\n throw new Error(\"WGSL emulated addressing needs a resource register\");\n }\n\n return `${bufferSymbol}[${resourceRegister}].${components === 2 ? \"xy\" : \"xyz\"}`;\n}\n\n/**\n * Whether a sample must be gated, given what the container says and what the\n * caller forces.\n *\n * Two independent reasons, mirroring the GLSL profile. The container's own\n * modes are the ordinary case. The forced list is for a sampler whose mode can\n * CHANGE - a quad pattern's does - where the container gives no reason to gate\n * but a user can still select border or mirror-once later.\n *\n * @param {number[]} modes Container modes for the sampler, if known.\n * @param {object|null} forced The caller's entry for this texture, if it forced one.\n * @returns {boolean} True when the sample needs the helpers.\n */\nexport function ShouldEmulate(modes, forced)\n{\n return NeedsEmulation(modes) || Boolean(forced);\n}\n\n/**\n * The constant-buffer register the modes buffer takes, as the WebGL2 path's\n * `emulatedAddressingRegister` (docs/contracts/webgl2-emulated-addressing.md).\n */\nexport const ADDRESS_MODES_REGISTER = 8;\n\n/**\n * The modes buffer's WGSL symbol. It is not `cb8`, so the backend can tell\n * this buffer, which it fills itself, from a constant buffer the effect binds.\n */\nexport const ADDRESS_MODES_SYMBOL = CARBON_BACKEND_ADDRESS_MODES_SYMBOL;\n\n/** The sample forms the fragment lowering emulates addressing for. */\nconst SAMPLE_OPCODES = new Set([ \"sample\", \"sample_b\", \"sample_l\", \"sample_d\" ]);\n\n/**\n * The pixel program with emulated addressing switched on: when one of its\n * samples goes through a sampler whose AUTHORED state has a border or\n * mirror-once axis, the program gains the modes buffer as a uniform binding\n * at `ADDRESS_MODES_REGISTER`, and `emulatedAddressing` names those samplers.\n *\n * KEYED BY SAMPLER REGISTER, as Carbon keys an override: its\n * `Tr2Effect::RebuildSamplerOverrides` writes the sampler register, so every\n * texture on a shared sampler changes together. The backend fills\n * `modes[samplerRegister]` from the sampler state actually bound there, so an\n * override that keeps an emulated mode is honoured; one that adds border to a\n * sampler the container did not author with it is not gated here.\n *\n * @param {object} program Frozen CJS shader IR.\n * @param {object[]} semanticBindings The stage's effect-description bindings.\n * @returns {object} The program, or a copy with emulated addressing.\n */\nexport function withEmulatedAddressing(program, semanticBindings)\n{\n if (program.stage !== \"pixel\") return program;\n\n const samplerModes = {};\n\n for (const binding of semanticBindings || [])\n {\n const state = binding?.kind === \"sampler\" && (binding.registerSpace ?? 0) === 0 ? binding.carbon?.sampler : null;\n if (!state) continue;\n\n const axes = [ state.addressU, state.addressV, state.addressW ];\n if (!NeedsEmulation(axes)) continue;\n\n samplerModes[binding.registerIndex] = Object.freeze({\n u: axes[0],\n v: axes[1],\n w: axes[2],\n borderColor: Object.freeze([ ...(state.borderColor ?? [ 0, 0, 0, 0 ]) ])\n });\n }\n\n const registers = Object.keys(samplerModes).map(Number);\n const sampled = program.instructions.some((instruction) => SAMPLE_OPCODES.has(instruction.opcodeName)\n && registers.includes(instruction.operands?.[3]?.registerIndex));\n\n if (!sampled) return program;\n\n if (program.bindings.some((binding) => binding.resourceKind === \"uniform-buffer\"\n && (binding.range?.registerSpace ?? 0) === 0\n && (binding.range?.lowerBound ?? binding.registerIndex) === ADDRESS_MODES_REGISTER))\n {\n throw new Error(`WGSL emulated addressing needs constant-buffer register ${ADDRESS_MODES_REGISTER}, which the shader already declares`);\n }\n\n const modesBuffer = Object.freeze({\n kind: \"binding\",\n id: `uniform-buffer:space0:range${ADDRESS_MODES_REGISTER}`,\n resourceKind: \"uniform-buffer\",\n operandType: \"constant_buffer\",\n declarationOffset: -1,\n registerIndex: ADDRESS_MODES_REGISTER,\n range: Object.freeze({\n bindingModel: \"sm5.0-register\",\n rangeId: null,\n lowerBound: ADDRESS_MODES_REGISTER,\n upperBound: ADDRESS_MODES_REGISTER,\n unbounded: false,\n registerCount: 1,\n registerSpace: 0\n }),\n accessPattern: \"dynamic_indexed\",\n resourceDimension: null,\n structureStride: null,\n returnType: null,\n synthetic: \"emulated-addressing\"\n });\n\n return Object.freeze({\n ...program,\n bindings: Object.freeze([ ...program.bindings, modesBuffer ]),\n emulatedAddressing: Object.freeze({\n samplerModes: Object.freeze(samplerModes),\n bufferRegister: ADDRESS_MODES_REGISTER,\n sizeInVec4: Math.max(...registers) + 1\n })\n });\n}\n"],"names":["ADDRESS_COORD_2","ADDRESS_COORD_3","ADDRESS_BORDER_2","ADDRESS_BORDER_3","BORDER_MODE","MIRROR_ONCE_MODE","NeedsEmulation","modes","some","mode","EmulatedAddressingHelpers","used","wanted","Set","keep","name","lines","has","BorderColorLiteral","color","components","map","value","parsed","Number","isFinite","Error","isInteger","toFixed","String","length","join","ModesExpression","bufferSymbol","resourceRegister","ShouldEmulate","forced","Boolean","ADDRESS_MODES_REGISTER","ADDRESS_MODES_SYMBOL","CARBON_BACKEND_ADDRESS_MODES_SYMBOL","SAMPLE_OPCODES","withEmulatedAddressing","program","semanticBindings","stage","samplerModes","binding","state","kind","registerSpace","carbon","sampler","axes","addressU","addressV","addressW","registerIndex","Object","freeze","u","v","w","borderColor","registers","keys","sampled","instructions","instruction","opcodeName","includes","operands","bindings","resourceKind","range","lowerBound","modesBuffer","id","operandType","declarationOffset","bindingModel","rangeId","upperBound","unbounded","registerCount","accessPattern","resourceDimension","structureStride","returnType","synthetic","emulatedAddressing","bufferRegister","sizeInVec4","Math","max"],"mappings":"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"}
|