1 |
- {"ast":null,"code":"import { WebGPUShaderProcessingContext } from \"./webgpuShaderProcessingContext.js\";\nimport { Logger } from \"../../Misc/logger.js\";\nimport { WebGPUShaderProcessor } from \"./webgpuShaderProcessor.js\";\nimport { RemoveComments, InjectStartingAndEndingCode } from \"../../Misc/codeStringParsingTools.js\";\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.js\";\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimation.js\";\nimport \"../../ShadersWGSL/ShadersInclude/instancesDeclaration.js\";\nimport \"../../ShadersWGSL/ShadersInclude/instancesVertex.js\";\nimport \"../../ShadersWGSL/ShadersInclude/helperFunctions.js\";\nimport \"../../ShadersWGSL/ShadersInclude/fresnelFunction.js\";\nimport \"../../ShadersWGSL/ShadersInclude/meshUboDeclaration.js\";\nimport \"../../ShadersWGSL/ShadersInclude/sceneUboDeclaration.js\";\nimport \"../../ShadersWGSL/ShadersInclude/decalFragment.js\";\nconst builtInName_frag_depth = \"fragmentOutputs.fragDepth\";\nconst leftOverVarName = \"uniforms\";\nconst internalsVarName = \"internals\";\nconst gpuTextureViewDimensionByWebGPUTextureFunction = {\n texture_1d: \"1d\" /* WebGPUConstants.TextureViewDimension.E1d */,\n texture_2d: \"2d\" /* WebGPUConstants.TextureViewDimension.E2d */,\n texture_2d_array: \"2d-array\" /* WebGPUConstants.TextureViewDimension.E2dArray */,\n texture_3d: \"3d\" /* WebGPUConstants.TextureViewDimension.E3d */,\n texture_cube: \"cube\" /* WebGPUConstants.TextureViewDimension.Cube */,\n texture_cube_array: \"cube-array\" /* WebGPUConstants.TextureViewDimension.CubeArray */,\n texture_multisampled_2d: \"2d\" /* WebGPUConstants.TextureViewDimension.E2d */,\n texture_depth_2d: \"2d\" /* WebGPUConstants.TextureViewDimension.E2d */,\n texture_depth_2d_array: \"2d-array\" /* WebGPUConstants.TextureViewDimension.E2dArray */,\n texture_depth_cube: \"cube\" /* WebGPUConstants.TextureViewDimension.Cube */,\n texture_depth_cube_array: \"cube-array\" /* WebGPUConstants.TextureViewDimension.CubeArray */,\n texture_depth_multisampled_2d: \"2d\" /* WebGPUConstants.TextureViewDimension.E2d */,\n texture_storage_1d: \"1d\" /* WebGPUConstants.TextureViewDimension.E1d */,\n texture_storage_2d: \"2d\" /* WebGPUConstants.TextureViewDimension.E2d */,\n texture_storage_2d_array: \"2d-array\" /* WebGPUConstants.TextureViewDimension.E2dArray */,\n texture_storage_3d: \"3d\" /* WebGPUConstants.TextureViewDimension.E3d */,\n texture_external: null\n};\n/** @internal */\nexport class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {\n constructor() {\n super(...arguments);\n this.shaderLanguage = 1 /* ShaderLanguage.WGSL */;\n this.uniformRegexp = /uniform\\s+(\\w+)\\s*:\\s*(.+)\\s*;/;\n this.textureRegexp = /var\\s+(\\w+)\\s*:\\s*((array<\\s*)?(texture_\\w+)\\s*(<\\s*(.+)\\s*>)?\\s*(,\\s*\\w+\\s*>\\s*)?);/;\n this.noPrecision = true;\n this.pureMode = false;\n }\n preProcessor(code, defines, preProcessors, isFragment, processingContext) {\n // Convert defines into const\n for (const key in preProcessors) {\n if (key === \"__VERSION__\") {\n continue;\n }\n const value = preProcessors[key];\n if (!isNaN(parseInt(value)) || !isNaN(parseFloat(value))) {\n code = `const ${key} = ${value};\\n` + code;\n }\n }\n return code;\n }\n _getArraySize(name, uniformType, preProcessors) {\n let length = 0;\n const endArray = uniformType.lastIndexOf(\">\");\n if (uniformType.indexOf(\"array\") >= 0 && endArray > 0) {\n let startArray = endArray;\n while (startArray > 0 && uniformType.charAt(startArray) !== \" \" && uniformType.charAt(startArray) !== \",\") {\n startArray--;\n }\n const lengthInString = uniformType.substring(startArray + 1, endArray);\n length = +lengthInString;\n if (isNaN(length)) {\n length = +preProcessors[lengthInString.trim()];\n }\n while (startArray > 0 && (uniformType.charAt(startArray) === \" \" || uniformType.charAt(startArray) === \",\")) {\n startArray--;\n }\n uniformType = uniformType.substring(uniformType.indexOf(\"<\") + 1, startArray + 1);\n }\n return [name, uniformType, length];\n }\n initializeShaders(processingContext) {\n this._webgpuProcessingContext = processingContext;\n this._attributesInputWGSL = [];\n this._attributesWGSL = [];\n this._attributesConversionCodeWGSL = [];\n this._hasNonFloatAttribute = false;\n this._varyingsWGSL = [];\n this._varyingNamesWGSL = [];\n this._stridedUniformArrays = [];\n }\n preProcessShaderCode(code) {\n // Same check as in webgpuShaderProcessorsGLSL to avoid same ubDelcaration to be injected twice.\n const ubDeclaration = this.pureMode ? \"\" : `struct ${WebGPUShaderProcessor.InternalsUBOName} {\\n yFactor_: f32,\\n textureOutputHeight_: f32,\\n};\\nvar<uniform> ${internalsVarName} : ${WebGPUShaderProcessor.InternalsUBOName};\\n`;\n const alreadyInjected = code.indexOf(ubDeclaration) !== -1;\n return alreadyInjected ? code : ubDeclaration + RemoveComments(code);\n }\n varyingCheck(varying) {\n const regex = /(flat|linear|perspective)?\\s*(center|centroid|sample)?\\s*\\bvarying\\b/;\n return regex.test(varying);\n }\n varyingProcessor(varying, isFragment, preProcessors) {\n const varyingRegex = /\\s*(flat|linear|perspective)?\\s*(center|centroid|sample)?\\s*varying\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s*:\\s*(.+)\\s*;/gm;\n const match = varyingRegex.exec(varying);\n if (match !== null) {\n var _match$, _match$2;\n const interpolationType = (_match$ = match[1]) !== null && _match$ !== void 0 ? _match$ : \"perspective\";\n const interpolationSampling = (_match$2 = match[2]) !== null && _match$2 !== void 0 ? _match$2 : \"center\";\n const varyingType = match[4];\n const name = match[3];\n const interpolation = interpolationType === \"flat\" ? `@interpolate(${interpolationType})` : `@interpolate(${interpolationType}, ${interpolationSampling})`;\n let location;\n if (isFragment) {\n location = this._webgpuProcessingContext.availableVaryings[name];\n if (location === undefined) {\n Logger.Warn(`Invalid fragment shader: The varying named \"${name}\" is not declared in the vertex shader! This declaration will be ignored.`);\n }\n } else {\n location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);\n this._webgpuProcessingContext.availableVaryings[name] = location;\n this._varyingsWGSL.push(` @location(${location}) ${interpolation} ${name} : ${varyingType},`);\n this._varyingNamesWGSL.push(name);\n }\n varying = \"\";\n }\n return varying;\n }\n attributeProcessor(attribute, preProcessors) {\n const attribRegex = /\\s*attribute\\s+(\\S+)\\s*:\\s*(.+)\\s*;/gm;\n const match = attribRegex.exec(attribute);\n if (match !== null) {\n const attributeType = match[2];\n const name = match[1];\n const location = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name, attributeType, preProcessors)[2]);\n this._webgpuProcessingContext.availableAttributes[name] = location;\n this._webgpuProcessingContext.orderedAttributes[location] = name;\n const numComponents = this._webgpuProcessingContext.vertexBufferKindToNumberOfComponents[name];\n if (numComponents !== undefined) {\n // Special case for an int/ivecX vertex buffer that is used as a float/vecX attribute in the shader.\n const newType = numComponents < 0 ? numComponents === -1 ? \"i32\" : \"vec\" + -numComponents + \"<i32>\" : numComponents === 1 ? \"u32\" : \"vec\" + numComponents + \"<u32>\";\n const newName = `_int_${name}_`;\n this._attributesInputWGSL.push(`@location(${location}) ${newName} : ${newType},`);\n this._attributesWGSL.push(`${name} : ${attributeType},`);\n this._attributesConversionCodeWGSL.push(`vertexInputs.${name} = ${attributeType}(vertexInputs_.${newName});`);\n this._hasNonFloatAttribute = true;\n } else {\n this._attributesInputWGSL.push(`@location(${location}) ${name} : ${attributeType},`);\n this._attributesWGSL.push(`${name} : ${attributeType},`);\n this._attributesConversionCodeWGSL.push(`vertexInputs.${name} = vertexInputs_.${name};`);\n }\n attribute = \"\";\n }\n return attribute;\n }\n uniformProcessor(uniform, isFragment, preProcessors) {\n const match = this.uniformRegexp.exec(uniform);\n if (match !== null) {\n const uniformType = match[2];\n const name = match[1];\n this._addUniformToLeftOverUBO(name, uniformType, preProcessors);\n uniform = \"\";\n }\n return uniform;\n }\n textureProcessor(texture, isFragment, preProcessors) {\n const match = this.textureRegexp.exec(texture);\n if (match !== null) {\n const name = match[1]; // name of the variable\n const type = match[2]; // texture_2d<f32> or array<texture_2d_array<f32>, 5> for eg\n const isArrayOfTexture = !!match[3];\n const textureFunc = match[4]; // texture_2d, texture_depth_2d, etc\n const isStorageTexture = textureFunc.indexOf(\"storage\") > 0;\n const componentType = match[6]; // f32 or i32 or u32 or undefined\n const storageTextureFormat = isStorageTexture ? componentType.substring(0, componentType.indexOf(\",\")).trim() : null;\n let arraySize = isArrayOfTexture ? this._getArraySize(name, type, preProcessors)[2] : 0;\n let textureInfo = this._webgpuProcessingContext.availableTextures[name];\n if (!textureInfo) {\n textureInfo = {\n isTextureArray: arraySize > 0,\n isStorageTexture,\n textures: [],\n sampleType: \"float\" /* WebGPUConstants.TextureSampleType.Float */\n };\n arraySize = arraySize || 1;\n for (let i = 0; i < arraySize; ++i) {\n textureInfo.textures.push(this._webgpuProcessingContext.getNextFreeUBOBinding());\n }\n } else {\n arraySize = textureInfo.textures.length;\n }\n this._webgpuProcessingContext.availableTextures[name] = textureInfo;\n const isDepthTexture = textureFunc.indexOf(\"depth\") > 0;\n const textureDimension = gpuTextureViewDimensionByWebGPUTextureFunction[textureFunc];\n const sampleType = isDepthTexture ? \"depth\" /* WebGPUConstants.TextureSampleType.Depth */ : componentType === \"u32\" ? \"uint\" /* WebGPUConstants.TextureSampleType.Uint */ : componentType === \"i32\" ? \"sint\" /* WebGPUConstants.TextureSampleType.Sint */ : \"float\" /* WebGPUConstants.TextureSampleType.Float */;\n textureInfo.sampleType = sampleType;\n if (textureDimension === undefined) {\n // eslint-disable-next-line no-throw-literal\n throw `Can't get the texture dimension corresponding to the texture function \"${textureFunc}\"!`;\n }\n for (let i = 0; i < arraySize; ++i) {\n const {\n groupIndex,\n bindingIndex\n } = textureInfo.textures[i];\n if (i === 0) {\n texture = `@group(${groupIndex}) @binding(${bindingIndex}) ${texture}`;\n }\n this._addTextureBindingDescription(name, textureInfo, i, textureDimension, storageTextureFormat, !isFragment);\n }\n }\n return texture;\n }\n // We need to process defines which are directly in the files themselves\n postProcessor(code) {\n const definePattern = /#define (.+?) (.+?)$/gm;\n let match;\n while ((match = definePattern.exec(code)) !== null) {\n code = code.replace(new RegExp(match[1], \"g\"), match[2]);\n }\n return code;\n }\n finalizeShaders(vertexCode, fragmentCode) {\n const fragCoordCode = fragmentCode.indexOf(\"fragmentInputs.position\") >= 0 && !this.pureMode ? `\n if (internals.yFactor_ == 1.) {\n fragmentInputs.position.y = internals.textureOutputHeight_ - fragmentInputs.position.y;\n }\n ` : \"\";\n // Add the group/binding info to the sampler declaration (var xxx: sampler|sampler_comparison)\n vertexCode = this._processSamplers(vertexCode, true);\n fragmentCode = this._processSamplers(fragmentCode, false);\n // Add the group/binding info to the uniform/storage buffer declarations (var<uniform> XXX:YYY or var<storage(,read_write|read)> XXX:YYY)\n vertexCode = this._processCustomBuffers(vertexCode, true);\n fragmentCode = this._processCustomBuffers(fragmentCode, false);\n // Builds the leftover UBOs.\n const leftOverUBO = this._buildLeftOverUBO();\n vertexCode = leftOverUBO + vertexCode;\n fragmentCode = leftOverUBO + fragmentCode;\n // Vertex code\n vertexCode = vertexCode.replace(/#define (\\w+)\\s+(\\d+\\.?\\d*)/g, \"const $1 = $2;\");\n vertexCode = vertexCode.replace(/#define /g, \"//#define \");\n vertexCode = this._processStridedUniformArrays(vertexCode);\n let vertexInputs = \"struct VertexInputs {\\n @builtin(vertex_index) vertexIndex : u32,\\n @builtin(instance_index) instanceIndex : u32,\\n\";\n if (this._attributesInputWGSL.length > 0) {\n vertexInputs += this._attributesInputWGSL.join(\"\\n\");\n }\n vertexInputs += \"\\n};\\nvar<private> vertexInputs\" + (this._hasNonFloatAttribute ? \"_\" : \"\") + \" : VertexInputs;\\n\";\n if (this._hasNonFloatAttribute) {\n vertexInputs += \"struct VertexInputs_ {\\n vertexIndex : u32, instanceIndex : u32,\\n\";\n vertexInputs += this._attributesWGSL.join(\"\\n\");\n vertexInputs += \"\\n};\\nvar<private> vertexInputs : VertexInputs_;\\n\";\n }\n let vertexOutputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>,\\n\";\n if (this._varyingsWGSL.length > 0) {\n vertexOutputs += this._varyingsWGSL.join(\"\\n\");\n }\n vertexOutputs += \"\\n};\\nvar<private> vertexOutputs : FragmentInputs;\\n\";\n vertexCode = vertexInputs + vertexOutputs + vertexCode;\n let vertexMainStartingCode = `\\n vertexInputs${this._hasNonFloatAttribute ? \"_\" : \"\"} = input;\\n`;\n if (this._hasNonFloatAttribute) {\n vertexMainStartingCode += \"vertexInputs.vertexIndex = vertexInputs_.vertexIndex;\\nvertexInputs.instanceIndex = vertexInputs_.instanceIndex;\\n\";\n vertexMainStartingCode += this._attributesConversionCodeWGSL.join(\"\\n\");\n vertexMainStartingCode += \"\\n\";\n }\n const vertexMainEndingCode = this.pureMode ? ` return vertexOutputs;` : ` vertexOutputs.position.y = vertexOutputs.position.y * internals.yFactor_;\\n return vertexOutputs;`;\n let needDiagnosticOff = vertexCode.indexOf(`#define DISABLE_UNIFORMITY_ANALYSIS`) !== -1;\n vertexCode = (needDiagnosticOff ? \"diagnostic(off, derivative_uniformity);\\n\" : \"\") + \"diagnostic(off, chromium.unreachable_code);\\n\" + InjectStartingAndEndingCode(vertexCode, \"fn main\", vertexMainStartingCode, vertexMainEndingCode);\n // fragment code\n fragmentCode = fragmentCode.replace(/#define (\\w+)\\s+(\\d+\\.?\\d*)/g, \"const $1 = $2;\");\n fragmentCode = fragmentCode.replace(/#define /g, \"//#define \");\n fragmentCode = this._processStridedUniformArrays(fragmentCode);\n if (!this.pureMode) {\n fragmentCode = fragmentCode.replace(/dpdy/g, \"(-internals.yFactor_)*dpdy\"); // will also handle dpdyCoarse and dpdyFine\n }\n let fragmentInputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>,\\n @builtin(front_facing) frontFacing : bool,\\n\";\n if (this._varyingsWGSL.length > 0) {\n fragmentInputs += this._varyingsWGSL.join(\"\\n\");\n }\n fragmentInputs += \"\\n};\\nvar<private> fragmentInputs : FragmentInputs;\\n\";\n let fragmentOutputs = \"struct FragmentOutputs {\\n\";\n // Adding fragData output locations\n const regexRoot = \"fragmentOutputs\\\\.fragData\";\n let match = fragmentCode.match(new RegExp(regexRoot + \"0\", \"g\"));\n let indexLocation = 0;\n if (match) {\n fragmentOutputs += ` @location(${indexLocation}) fragData0 : vec4<f32>,\\n`;\n indexLocation++;\n for (let index = 1; index < 8; index++) {\n match = fragmentCode.match(new RegExp(regexRoot + index, \"g\"));\n if (match) {\n fragmentOutputs += ` @location(${indexLocation}) fragData${indexLocation} : vec4<f32>,\\n`;\n indexLocation++;\n }\n }\n if (fragmentCode.indexOf(\"MRT_AND_COLOR\") !== -1) {\n fragmentOutputs += ` @location(${indexLocation}) color : vec4<f32>,\\n`;\n indexLocation++;\n }\n }\n // Adding fragData output locations\n const regex = /oitDepthSampler/;\n match = fragmentCode.match(regex);\n if (match) {\n fragmentOutputs += ` @location(${indexLocation++}) depth : vec2<f32>,\\n`;\n fragmentOutputs += ` @location(${indexLocation++}) frontColor : vec4<f32>,\\n`;\n fragmentOutputs += ` @location(${indexLocation++}) backColor : vec4<f32>,\\n`;\n }\n if (indexLocation === 0) {\n fragmentOutputs += \" @location(0) color : vec4<f32>,\\n\";\n indexLocation++;\n }\n // FragDepth\n let hasFragDepth = false;\n let idx = 0;\n while (!hasFragDepth) {\n idx = fragmentCode.indexOf(builtInName_frag_depth, idx);\n if (idx < 0) {\n break;\n }\n const saveIndex = idx;\n hasFragDepth = true;\n while (idx > 1 && fragmentCode.charAt(idx) !== \"\\n\") {\n if (fragmentCode.charAt(idx) === \"/\" && fragmentCode.charAt(idx - 1) === \"/\") {\n hasFragDepth = false;\n break;\n }\n idx--;\n }\n idx = saveIndex + builtInName_frag_depth.length;\n }\n if (hasFragDepth) {\n fragmentOutputs += \" @builtin(frag_depth) fragDepth: f32,\\n\";\n }\n fragmentOutputs += \"};\\nvar<private> fragmentOutputs : FragmentOutputs;\\n\";\n fragmentCode = fragmentInputs + fragmentOutputs + fragmentCode;\n const fragmentStartingCode = \" fragmentInputs = input;\\n \" + fragCoordCode;\n const fragmentEndingCode = \" return fragmentOutputs;\";\n needDiagnosticOff = fragmentCode.indexOf(`#define DISABLE_UNIFORMITY_ANALYSIS`) !== -1;\n fragmentCode = (needDiagnosticOff ? \"diagnostic(off, derivative_uniformity);\\n\" : \"\") + \"diagnostic(off, chromium.unreachable_code);\\n\" + InjectStartingAndEndingCode(fragmentCode, \"fn main\", fragmentStartingCode, fragmentEndingCode);\n this._collectBindingNames();\n this._preCreateBindGroupEntries();\n this._webgpuProcessingContext.vertexBufferKindToNumberOfComponents = {};\n return {\n vertexCode,\n fragmentCode\n };\n }\n _generateLeftOverUBOCode(name, uniformBufferDescription) {\n let stridedArrays = \"\";\n let ubo = `struct ${name} {\\n`;\n for (const leftOverUniform of this._webgpuProcessingContext.leftOverUniforms) {\n const type = leftOverUniform.type.replace(/^(.*?)(<.*>)?$/, \"$1\");\n const size = WebGPUShaderProcessor.UniformSizes[type];\n if (leftOverUniform.length > 0) {\n if (size <= 2) {\n const stridedArrayType = `${name}_${this._stridedUniformArrays.length}_strided_arr`;\n stridedArrays += `struct ${stridedArrayType} {\n @size(16)\n el: ${type},\n }`;\n this._stridedUniformArrays.push(leftOverUniform.name);\n ubo += ` @align(16) ${leftOverUniform.name} : array<${stridedArrayType}, ${leftOverUniform.length}>,\\n`;\n } else {\n ubo += ` ${leftOverUniform.name} : array<${leftOverUniform.type}, ${leftOverUniform.length}>,\\n`;\n }\n } else {\n ubo += ` ${leftOverUniform.name} : ${leftOverUniform.type},\\n`;\n }\n }\n ubo += \"};\\n\";\n ubo = `${stridedArrays}\\n${ubo}`;\n ubo += `@group(${uniformBufferDescription.binding.groupIndex}) @binding(${uniformBufferDescription.binding.bindingIndex}) var<uniform> ${leftOverVarName} : ${name};\\n`;\n return ubo;\n }\n _processSamplers(code, isVertex) {\n const samplerRegexp = /var\\s+(\\w+Sampler)\\s*:\\s*(sampler|sampler_comparison)\\s*;/gm;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const match = samplerRegexp.exec(code);\n if (match === null) {\n break;\n }\n const name = match[1]; // name of the variable\n const samplerType = match[2]; // sampler or sampler_comparison\n const suffixLessLength = name.length - `Sampler`.length;\n const textureName = name.lastIndexOf(`Sampler`) === suffixLessLength ? name.substring(0, suffixLessLength) : null;\n const samplerBindingType = samplerType === \"sampler_comparison\" ? \"comparison\" /* WebGPUConstants.SamplerBindingType.Comparison */ : \"filtering\" /* WebGPUConstants.SamplerBindingType.Filtering */;\n if (textureName) {\n const textureInfo = this._webgpuProcessingContext.availableTextures[textureName];\n if (textureInfo) {\n textureInfo.autoBindSampler = true;\n }\n }\n let samplerInfo = this._webgpuProcessingContext.availableSamplers[name];\n if (!samplerInfo) {\n samplerInfo = {\n binding: this._webgpuProcessingContext.getNextFreeUBOBinding(),\n type: samplerBindingType\n };\n this._webgpuProcessingContext.availableSamplers[name] = samplerInfo;\n }\n this._addSamplerBindingDescription(name, samplerInfo, isVertex);\n const part1 = code.substring(0, match.index);\n const insertPart = `@group(${samplerInfo.binding.groupIndex}) @binding(${samplerInfo.binding.bindingIndex}) `;\n const part2 = code.substring(match.index);\n code = part1 + insertPart + part2;\n samplerRegexp.lastIndex += insertPart.length;\n }\n return code;\n }\n _processCustomBuffers(code, isVertex) {\n const instantiateBufferRegexp = /var<\\s*(uniform|storage)\\s*(,\\s*(read|read_write)\\s*)?>\\s+(\\S+)\\s*:\\s*(\\S+)\\s*;/gm;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const match = instantiateBufferRegexp.exec(code);\n if (match === null) {\n break;\n }\n const type = match[1];\n const decoration = match[3];\n let name = match[4];\n const structName = match[5];\n let bufferInfo = this._webgpuProcessingContext.availableBuffers[name];\n if (!bufferInfo) {\n const knownUBO = type === \"uniform\" ? WebGPUShaderProcessingContext.KnownUBOs[structName] : null;\n let binding;\n if (knownUBO) {\n name = structName;\n binding = knownUBO.binding;\n if (binding.groupIndex === -1) {\n var _this$_webgpuProcessi;\n binding = (_this$_webgpuProcessi = this._webgpuProcessingContext.availableBuffers[name]) === null || _this$_webgpuProcessi === void 0 ? void 0 : _this$_webgpuProcessi.binding;\n if (!binding) {\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\n }\n }\n } else {\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\n }\n bufferInfo = {\n binding\n };\n this._webgpuProcessingContext.availableBuffers[name] = bufferInfo;\n }\n this._addBufferBindingDescription(name, this._webgpuProcessingContext.availableBuffers[name], decoration === \"read_write\" ? \"storage\" /* WebGPUConstants.BufferBindingType.Storage */ : type === \"storage\" ? \"read-only-storage\" /* WebGPUConstants.BufferBindingType.ReadOnlyStorage */ : \"uniform\" /* WebGPUConstants.BufferBindingType.Uniform */, isVertex);\n const groupIndex = bufferInfo.binding.groupIndex;\n const bindingIndex = bufferInfo.binding.bindingIndex;\n const part1 = code.substring(0, match.index);\n const insertPart = `@group(${groupIndex}) @binding(${bindingIndex}) `;\n const part2 = code.substring(match.index);\n code = part1 + insertPart + part2;\n instantiateBufferRegexp.lastIndex += insertPart.length;\n }\n return code;\n }\n _processStridedUniformArrays(code) {\n for (const uniformArrayName of this._stridedUniformArrays) {\n code = code.replace(new RegExp(`${uniformArrayName}\\\\s*\\\\[(.*?)\\\\]`, \"g\"), `${uniformArrayName}[$1].el`);\n }\n return code;\n }\n}","map":{"version":3,"names":["WebGPUShaderProcessingContext","Logger","WebGPUShaderProcessor","RemoveComments","InjectStartingAndEndingCode","builtInName_frag_depth","leftOverVarName","internalsVarName","gpuTextureViewDimensionByWebGPUTextureFunction","texture_1d","texture_2d","texture_2d_array","texture_3d","texture_cube","texture_cube_array","texture_multisampled_2d","texture_depth_2d","texture_depth_2d_array","texture_depth_cube","texture_depth_cube_array","texture_depth_multisampled_2d","texture_storage_1d","texture_storage_2d","texture_storage_2d_array","texture_storage_3d","texture_external","WebGPUShaderProcessorWGSL","constructor","arguments","shaderLanguage","uniformRegexp","textureRegexp","noPrecision","pureMode","preProcessor","code","defines","preProcessors","isFragment","processingContext","key","value","isNaN","parseInt","parseFloat","_getArraySize","name","uniformType","length","endArray","lastIndexOf","indexOf","startArray","charAt","lengthInString","substring","trim","initializeShaders","_webgpuProcessingContext","_attributesInputWGSL","_attributesWGSL","_attributesConversionCodeWGSL","_hasNonFloatAttribute","_varyingsWGSL","_varyingNamesWGSL","_stridedUniformArrays","preProcessShaderCode","ubDeclaration","InternalsUBOName","alreadyInjected","varyingCheck","varying","regex","test","varyingProcessor","varyingRegex","match","exec","_match$","_match$2","interpolationType","interpolationSampling","varyingType","interpolation","location","availableVaryings","undefined","Warn","getVaryingNextLocation","push","attributeProcessor","attribute","attribRegex","attributeType","getAttributeNextLocation","availableAttributes","orderedAttributes","numComponents","vertexBufferKindToNumberOfComponents","newType","newName","uniformProcessor","uniform","_addUniformToLeftOverUBO","textureProcessor","texture","type","isArrayOfTexture","textureFunc","isStorageTexture","componentType","storageTextureFormat","arraySize","textureInfo","availableTextures","isTextureArray","textures","sampleType","i","getNextFreeUBOBinding","isDepthTexture","textureDimension","groupIndex","bindingIndex","_addTextureBindingDescription","postProcessor","definePattern","replace","RegExp","finalizeShaders","vertexCode","fragmentCode","fragCoordCode","_processSamplers","_processCustomBuffers","leftOverUBO","_buildLeftOverUBO","_processStridedUniformArrays","vertexInputs","join","vertexOutputs","vertexMainStartingCode","vertexMainEndingCode","needDiagnosticOff","fragmentInputs","fragmentOutputs","regexRoot","indexLocation","index","hasFragDepth","idx","saveIndex","fragmentStartingCode","fragmentEndingCode","_collectBindingNames","_preCreateBindGroupEntries","_generateLeftOverUBOCode","uniformBufferDescription","stridedArrays","ubo","leftOverUniform","leftOverUniforms","size","UniformSizes","stridedArrayType","binding","isVertex","samplerRegexp","samplerType","suffixLessLength","textureName","samplerBindingType","autoBindSampler","samplerInfo","availableSamplers","_addSamplerBindingDescription","part1","insertPart","part2","lastIndex","instantiateBufferRegexp","decoration","structName","bufferInfo","availableBuffers","knownUBO","KnownUBOs","_this$_webgpuProcessi","_addBufferBindingDescription","uniformArrayName"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Engines/WebGPU/webgpuShaderProcessorsWGSL.js"],"sourcesContent":["import { WebGPUShaderProcessingContext } from \"./webgpuShaderProcessingContext.js\";\nimport { Logger } from \"../../Misc/logger.js\";\nimport { WebGPUShaderProcessor } from \"./webgpuShaderProcessor.js\";\nimport { RemoveComments, InjectStartingAndEndingCode } from \"../../Misc/codeStringParsingTools.js\";\n\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.js\";\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimation.js\";\nimport \"../../ShadersWGSL/ShadersInclude/instancesDeclaration.js\";\nimport \"../../ShadersWGSL/ShadersInclude/instancesVertex.js\";\nimport \"../../ShadersWGSL/ShadersInclude/helperFunctions.js\";\nimport \"../../ShadersWGSL/ShadersInclude/fresnelFunction.js\";\nimport \"../../ShadersWGSL/ShadersInclude/meshUboDeclaration.js\";\nimport \"../../ShadersWGSL/ShadersInclude/sceneUboDeclaration.js\";\nimport \"../../ShadersWGSL/ShadersInclude/decalFragment.js\";\nconst builtInName_frag_depth = \"fragmentOutputs.fragDepth\";\nconst leftOverVarName = \"uniforms\";\nconst internalsVarName = \"internals\";\nconst gpuTextureViewDimensionByWebGPUTextureFunction = {\n texture_1d: \"1d\" /* WebGPUConstants.TextureViewDimension.E1d */,\n texture_2d: \"2d\" /* WebGPUConstants.TextureViewDimension.E2d */,\n texture_2d_array: \"2d-array\" /* WebGPUConstants.TextureViewDimension.E2dArray */,\n texture_3d: \"3d\" /* WebGPUConstants.TextureViewDimension.E3d */,\n texture_cube: \"cube\" /* WebGPUConstants.TextureViewDimension.Cube */,\n texture_cube_array: \"cube-array\" /* WebGPUConstants.TextureViewDimension.CubeArray */,\n texture_multisampled_2d: \"2d\" /* WebGPUConstants.TextureViewDimension.E2d */,\n texture_depth_2d: \"2d\" /* WebGPUConstants.TextureViewDimension.E2d */,\n texture_depth_2d_array: \"2d-array\" /* WebGPUConstants.TextureViewDimension.E2dArray */,\n texture_depth_cube: \"cube\" /* WebGPUConstants.TextureViewDimension.Cube */,\n texture_depth_cube_array: \"cube-array\" /* WebGPUConstants.TextureViewDimension.CubeArray */,\n texture_depth_multisampled_2d: \"2d\" /* WebGPUConstants.TextureViewDimension.E2d */,\n texture_storage_1d: \"1d\" /* WebGPUConstants.TextureViewDimension.E1d */,\n texture_storage_2d: \"2d\" /* WebGPUConstants.TextureViewDimension.E2d */,\n texture_storage_2d_array: \"2d-array\" /* WebGPUConstants.TextureViewDimension.E2dArray */,\n texture_storage_3d: \"3d\" /* WebGPUConstants.TextureViewDimension.E3d */,\n texture_external: null,\n};\n/** @internal */\nexport class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {\n constructor() {\n super(...arguments);\n this.shaderLanguage = 1 /* ShaderLanguage.WGSL */;\n this.uniformRegexp = /uniform\\s+(\\w+)\\s*:\\s*(.+)\\s*;/;\n this.textureRegexp = /var\\s+(\\w+)\\s*:\\s*((array<\\s*)?(texture_\\w+)\\s*(<\\s*(.+)\\s*>)?\\s*(,\\s*\\w+\\s*>\\s*)?);/;\n this.noPrecision = true;\n this.pureMode = false;\n }\n preProcessor(code, defines, preProcessors, isFragment, processingContext) {\n // Convert defines into const\n for (const key in preProcessors) {\n if (key === \"__VERSION__\") {\n continue;\n }\n const value = preProcessors[key];\n if (!isNaN(parseInt(value)) || !isNaN(parseFloat(value))) {\n code = `const ${key} = ${value};\\n` + code;\n }\n }\n return code;\n }\n _getArraySize(name, uniformType, preProcessors) {\n let length = 0;\n const endArray = uniformType.lastIndexOf(\">\");\n if (uniformType.indexOf(\"array\") >= 0 && endArray > 0) {\n let startArray = endArray;\n while (startArray > 0 && uniformType.charAt(startArray) !== \" \" && uniformType.charAt(startArray) !== \",\") {\n startArray--;\n }\n const lengthInString = uniformType.substring(startArray + 1, endArray);\n length = +lengthInString;\n if (isNaN(length)) {\n length = +preProcessors[lengthInString.trim()];\n }\n while (startArray > 0 && (uniformType.charAt(startArray) === \" \" || uniformType.charAt(startArray) === \",\")) {\n startArray--;\n }\n uniformType = uniformType.substring(uniformType.indexOf(\"<\") + 1, startArray + 1);\n }\n return [name, uniformType, length];\n }\n initializeShaders(processingContext) {\n this._webgpuProcessingContext = processingContext;\n this._attributesInputWGSL = [];\n this._attributesWGSL = [];\n this._attributesConversionCodeWGSL = [];\n this._hasNonFloatAttribute = false;\n this._varyingsWGSL = [];\n this._varyingNamesWGSL = [];\n this._stridedUniformArrays = [];\n }\n preProcessShaderCode(code) {\n // Same check as in webgpuShaderProcessorsGLSL to avoid same ubDelcaration to be injected twice.\n const ubDeclaration = this.pureMode\n ? \"\"\n : `struct ${WebGPUShaderProcessor.InternalsUBOName} {\\n yFactor_: f32,\\n textureOutputHeight_: f32,\\n};\\nvar<uniform> ${internalsVarName} : ${WebGPUShaderProcessor.InternalsUBOName};\\n`;\n const alreadyInjected = code.indexOf(ubDeclaration) !== -1;\n return alreadyInjected ? code : ubDeclaration + RemoveComments(code);\n }\n varyingCheck(varying) {\n const regex = /(flat|linear|perspective)?\\s*(center|centroid|sample)?\\s*\\bvarying\\b/;\n return regex.test(varying);\n }\n varyingProcessor(varying, isFragment, preProcessors) {\n const varyingRegex = /\\s*(flat|linear|perspective)?\\s*(center|centroid|sample)?\\s*varying\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s*:\\s*(.+)\\s*;/gm;\n const match = varyingRegex.exec(varying);\n if (match !== null) {\n const interpolationType = match[1] ?? \"perspective\";\n const interpolationSampling = match[2] ?? \"center\";\n const varyingType = match[4];\n const name = match[3];\n const interpolation = interpolationType === \"flat\" ? `@interpolate(${interpolationType})` : `@interpolate(${interpolationType}, ${interpolationSampling})`;\n let location;\n if (isFragment) {\n location = this._webgpuProcessingContext.availableVaryings[name];\n if (location === undefined) {\n Logger.Warn(`Invalid fragment shader: The varying named \"${name}\" is not declared in the vertex shader! This declaration will be ignored.`);\n }\n }\n else {\n location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);\n this._webgpuProcessingContext.availableVaryings[name] = location;\n this._varyingsWGSL.push(` @location(${location}) ${interpolation} ${name} : ${varyingType},`);\n this._varyingNamesWGSL.push(name);\n }\n varying = \"\";\n }\n return varying;\n }\n attributeProcessor(attribute, preProcessors) {\n const attribRegex = /\\s*attribute\\s+(\\S+)\\s*:\\s*(.+)\\s*;/gm;\n const match = attribRegex.exec(attribute);\n if (match !== null) {\n const attributeType = match[2];\n const name = match[1];\n const location = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name, attributeType, preProcessors)[2]);\n this._webgpuProcessingContext.availableAttributes[name] = location;\n this._webgpuProcessingContext.orderedAttributes[location] = name;\n const numComponents = this._webgpuProcessingContext.vertexBufferKindToNumberOfComponents[name];\n if (numComponents !== undefined) {\n // Special case for an int/ivecX vertex buffer that is used as a float/vecX attribute in the shader.\n const newType = numComponents < 0 ? (numComponents === -1 ? \"i32\" : \"vec\" + -numComponents + \"<i32>\") : numComponents === 1 ? \"u32\" : \"vec\" + numComponents + \"<u32>\";\n const newName = `_int_${name}_`;\n this._attributesInputWGSL.push(`@location(${location}) ${newName} : ${newType},`);\n this._attributesWGSL.push(`${name} : ${attributeType},`);\n this._attributesConversionCodeWGSL.push(`vertexInputs.${name} = ${attributeType}(vertexInputs_.${newName});`);\n this._hasNonFloatAttribute = true;\n }\n else {\n this._attributesInputWGSL.push(`@location(${location}) ${name} : ${attributeType},`);\n this._attributesWGSL.push(`${name} : ${attributeType},`);\n this._attributesConversionCodeWGSL.push(`vertexInputs.${name} = vertexInputs_.${name};`);\n }\n attribute = \"\";\n }\n return attribute;\n }\n uniformProcessor(uniform, isFragment, preProcessors) {\n const match = this.uniformRegexp.exec(uniform);\n if (match !== null) {\n const uniformType = match[2];\n const name = match[1];\n this._addUniformToLeftOverUBO(name, uniformType, preProcessors);\n uniform = \"\";\n }\n return uniform;\n }\n textureProcessor(texture, isFragment, preProcessors) {\n const match = this.textureRegexp.exec(texture);\n if (match !== null) {\n const name = match[1]; // name of the variable\n const type = match[2]; // texture_2d<f32> or array<texture_2d_array<f32>, 5> for eg\n const isArrayOfTexture = !!match[3];\n const textureFunc = match[4]; // texture_2d, texture_depth_2d, etc\n const isStorageTexture = textureFunc.indexOf(\"storage\") > 0;\n const componentType = match[6]; // f32 or i32 or u32 or undefined\n const storageTextureFormat = isStorageTexture ? componentType.substring(0, componentType.indexOf(\",\")).trim() : null;\n let arraySize = isArrayOfTexture ? this._getArraySize(name, type, preProcessors)[2] : 0;\n let textureInfo = this._webgpuProcessingContext.availableTextures[name];\n if (!textureInfo) {\n textureInfo = {\n isTextureArray: arraySize > 0,\n isStorageTexture,\n textures: [],\n sampleType: \"float\" /* WebGPUConstants.TextureSampleType.Float */,\n };\n arraySize = arraySize || 1;\n for (let i = 0; i < arraySize; ++i) {\n textureInfo.textures.push(this._webgpuProcessingContext.getNextFreeUBOBinding());\n }\n }\n else {\n arraySize = textureInfo.textures.length;\n }\n this._webgpuProcessingContext.availableTextures[name] = textureInfo;\n const isDepthTexture = textureFunc.indexOf(\"depth\") > 0;\n const textureDimension = gpuTextureViewDimensionByWebGPUTextureFunction[textureFunc];\n const sampleType = isDepthTexture\n ? \"depth\" /* WebGPUConstants.TextureSampleType.Depth */\n : componentType === \"u32\"\n ? \"uint\" /* WebGPUConstants.TextureSampleType.Uint */\n : componentType === \"i32\"\n ? \"sint\" /* WebGPUConstants.TextureSampleType.Sint */\n : \"float\" /* WebGPUConstants.TextureSampleType.Float */;\n textureInfo.sampleType = sampleType;\n if (textureDimension === undefined) {\n // eslint-disable-next-line no-throw-literal\n throw `Can't get the texture dimension corresponding to the texture function \"${textureFunc}\"!`;\n }\n for (let i = 0; i < arraySize; ++i) {\n const { groupIndex, bindingIndex } = textureInfo.textures[i];\n if (i === 0) {\n texture = `@group(${groupIndex}) @binding(${bindingIndex}) ${texture}`;\n }\n this._addTextureBindingDescription(name, textureInfo, i, textureDimension, storageTextureFormat, !isFragment);\n }\n }\n return texture;\n }\n // We need to process defines which are directly in the files themselves\n postProcessor(code) {\n const definePattern = /#define (.+?) (.+?)$/gm;\n let match;\n while ((match = definePattern.exec(code)) !== null) {\n code = code.replace(new RegExp(match[1], \"g\"), match[2]);\n }\n return code;\n }\n finalizeShaders(vertexCode, fragmentCode) {\n const fragCoordCode = fragmentCode.indexOf(\"fragmentInputs.position\") >= 0 && !this.pureMode\n ? `\r\n if (internals.yFactor_ == 1.) {\r\n fragmentInputs.position.y = internals.textureOutputHeight_ - fragmentInputs.position.y;\r\n }\r\n `\n : \"\";\n // Add the group/binding info to the sampler declaration (var xxx: sampler|sampler_comparison)\n vertexCode = this._processSamplers(vertexCode, true);\n fragmentCode = this._processSamplers(fragmentCode, false);\n // Add the group/binding info to the uniform/storage buffer declarations (var<uniform> XXX:YYY or var<storage(,read_write|read)> XXX:YYY)\n vertexCode = this._processCustomBuffers(vertexCode, true);\n fragmentCode = this._processCustomBuffers(fragmentCode, false);\n // Builds the leftover UBOs.\n const leftOverUBO = this._buildLeftOverUBO();\n vertexCode = leftOverUBO + vertexCode;\n fragmentCode = leftOverUBO + fragmentCode;\n // Vertex code\n vertexCode = vertexCode.replace(/#define (\\w+)\\s+(\\d+\\.?\\d*)/g, \"const $1 = $2;\");\n vertexCode = vertexCode.replace(/#define /g, \"//#define \");\n vertexCode = this._processStridedUniformArrays(vertexCode);\n let vertexInputs = \"struct VertexInputs {\\n @builtin(vertex_index) vertexIndex : u32,\\n @builtin(instance_index) instanceIndex : u32,\\n\";\n if (this._attributesInputWGSL.length > 0) {\n vertexInputs += this._attributesInputWGSL.join(\"\\n\");\n }\n vertexInputs += \"\\n};\\nvar<private> vertexInputs\" + (this._hasNonFloatAttribute ? \"_\" : \"\") + \" : VertexInputs;\\n\";\n if (this._hasNonFloatAttribute) {\n vertexInputs += \"struct VertexInputs_ {\\n vertexIndex : u32, instanceIndex : u32,\\n\";\n vertexInputs += this._attributesWGSL.join(\"\\n\");\n vertexInputs += \"\\n};\\nvar<private> vertexInputs : VertexInputs_;\\n\";\n }\n let vertexOutputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>,\\n\";\n if (this._varyingsWGSL.length > 0) {\n vertexOutputs += this._varyingsWGSL.join(\"\\n\");\n }\n vertexOutputs += \"\\n};\\nvar<private> vertexOutputs : FragmentInputs;\\n\";\n vertexCode = vertexInputs + vertexOutputs + vertexCode;\n let vertexMainStartingCode = `\\n vertexInputs${this._hasNonFloatAttribute ? \"_\" : \"\"} = input;\\n`;\n if (this._hasNonFloatAttribute) {\n vertexMainStartingCode += \"vertexInputs.vertexIndex = vertexInputs_.vertexIndex;\\nvertexInputs.instanceIndex = vertexInputs_.instanceIndex;\\n\";\n vertexMainStartingCode += this._attributesConversionCodeWGSL.join(\"\\n\");\n vertexMainStartingCode += \"\\n\";\n }\n const vertexMainEndingCode = this.pureMode\n ? ` return vertexOutputs;`\n : ` vertexOutputs.position.y = vertexOutputs.position.y * internals.yFactor_;\\n return vertexOutputs;`;\n let needDiagnosticOff = vertexCode.indexOf(`#define DISABLE_UNIFORMITY_ANALYSIS`) !== -1;\n vertexCode =\n (needDiagnosticOff ? \"diagnostic(off, derivative_uniformity);\\n\" : \"\") +\n \"diagnostic(off, chromium.unreachable_code);\\n\" +\n InjectStartingAndEndingCode(vertexCode, \"fn main\", vertexMainStartingCode, vertexMainEndingCode);\n // fragment code\n fragmentCode = fragmentCode.replace(/#define (\\w+)\\s+(\\d+\\.?\\d*)/g, \"const $1 = $2;\");\n fragmentCode = fragmentCode.replace(/#define /g, \"//#define \");\n fragmentCode = this._processStridedUniformArrays(fragmentCode);\n if (!this.pureMode) {\n fragmentCode = fragmentCode.replace(/dpdy/g, \"(-internals.yFactor_)*dpdy\"); // will also handle dpdyCoarse and dpdyFine\n }\n let fragmentInputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>,\\n @builtin(front_facing) frontFacing : bool,\\n\";\n if (this._varyingsWGSL.length > 0) {\n fragmentInputs += this._varyingsWGSL.join(\"\\n\");\n }\n fragmentInputs += \"\\n};\\nvar<private> fragmentInputs : FragmentInputs;\\n\";\n let fragmentOutputs = \"struct FragmentOutputs {\\n\";\n // Adding fragData output locations\n const regexRoot = \"fragmentOutputs\\\\.fragData\";\n let match = fragmentCode.match(new RegExp(regexRoot + \"0\", \"g\"));\n let indexLocation = 0;\n if (match) {\n fragmentOutputs += ` @location(${indexLocation}) fragData0 : vec4<f32>,\\n`;\n indexLocation++;\n for (let index = 1; index < 8; index++) {\n match = fragmentCode.match(new RegExp(regexRoot + index, \"g\"));\n if (match) {\n fragmentOutputs += ` @location(${indexLocation}) fragData${indexLocation} : vec4<f32>,\\n`;\n indexLocation++;\n }\n }\n if (fragmentCode.indexOf(\"MRT_AND_COLOR\") !== -1) {\n fragmentOutputs += ` @location(${indexLocation}) color : vec4<f32>,\\n`;\n indexLocation++;\n }\n }\n // Adding fragData output locations\n const regex = /oitDepthSampler/;\n match = fragmentCode.match(regex);\n if (match) {\n fragmentOutputs += ` @location(${indexLocation++}) depth : vec2<f32>,\\n`;\n fragmentOutputs += ` @location(${indexLocation++}) frontColor : vec4<f32>,\\n`;\n fragmentOutputs += ` @location(${indexLocation++}) backColor : vec4<f32>,\\n`;\n }\n if (indexLocation === 0) {\n fragmentOutputs += \" @location(0) color : vec4<f32>,\\n\";\n indexLocation++;\n }\n // FragDepth\n let hasFragDepth = false;\n let idx = 0;\n while (!hasFragDepth) {\n idx = fragmentCode.indexOf(builtInName_frag_depth, idx);\n if (idx < 0) {\n break;\n }\n const saveIndex = idx;\n hasFragDepth = true;\n while (idx > 1 && fragmentCode.charAt(idx) !== \"\\n\") {\n if (fragmentCode.charAt(idx) === \"/\" && fragmentCode.charAt(idx - 1) === \"/\") {\n hasFragDepth = false;\n break;\n }\n idx--;\n }\n idx = saveIndex + builtInName_frag_depth.length;\n }\n if (hasFragDepth) {\n fragmentOutputs += \" @builtin(frag_depth) fragDepth: f32,\\n\";\n }\n fragmentOutputs += \"};\\nvar<private> fragmentOutputs : FragmentOutputs;\\n\";\n fragmentCode = fragmentInputs + fragmentOutputs + fragmentCode;\n const fragmentStartingCode = \" fragmentInputs = input;\\n \" + fragCoordCode;\n const fragmentEndingCode = \" return fragmentOutputs;\";\n needDiagnosticOff = fragmentCode.indexOf(`#define DISABLE_UNIFORMITY_ANALYSIS`) !== -1;\n fragmentCode =\n (needDiagnosticOff ? \"diagnostic(off, derivative_uniformity);\\n\" : \"\") +\n \"diagnostic(off, chromium.unreachable_code);\\n\" +\n InjectStartingAndEndingCode(fragmentCode, \"fn main\", fragmentStartingCode, fragmentEndingCode);\n this._collectBindingNames();\n this._preCreateBindGroupEntries();\n this._webgpuProcessingContext.vertexBufferKindToNumberOfComponents = {};\n return { vertexCode, fragmentCode };\n }\n _generateLeftOverUBOCode(name, uniformBufferDescription) {\n let stridedArrays = \"\";\n let ubo = `struct ${name} {\\n`;\n for (const leftOverUniform of this._webgpuProcessingContext.leftOverUniforms) {\n const type = leftOverUniform.type.replace(/^(.*?)(<.*>)?$/, \"$1\");\n const size = WebGPUShaderProcessor.UniformSizes[type];\n if (leftOverUniform.length > 0) {\n if (size <= 2) {\n const stridedArrayType = `${name}_${this._stridedUniformArrays.length}_strided_arr`;\n stridedArrays += `struct ${stridedArrayType} {\r\n @size(16)\r\n el: ${type},\r\n }`;\n this._stridedUniformArrays.push(leftOverUniform.name);\n ubo += ` @align(16) ${leftOverUniform.name} : array<${stridedArrayType}, ${leftOverUniform.length}>,\\n`;\n }\n else {\n ubo += ` ${leftOverUniform.name} : array<${leftOverUniform.type}, ${leftOverUniform.length}>,\\n`;\n }\n }\n else {\n ubo += ` ${leftOverUniform.name} : ${leftOverUniform.type},\\n`;\n }\n }\n ubo += \"};\\n\";\n ubo = `${stridedArrays}\\n${ubo}`;\n ubo += `@group(${uniformBufferDescription.binding.groupIndex}) @binding(${uniformBufferDescription.binding.bindingIndex}) var<uniform> ${leftOverVarName} : ${name};\\n`;\n return ubo;\n }\n _processSamplers(code, isVertex) {\n const samplerRegexp = /var\\s+(\\w+Sampler)\\s*:\\s*(sampler|sampler_comparison)\\s*;/gm;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const match = samplerRegexp.exec(code);\n if (match === null) {\n break;\n }\n const name = match[1]; // name of the variable\n const samplerType = match[2]; // sampler or sampler_comparison\n const suffixLessLength = name.length - `Sampler`.length;\n const textureName = name.lastIndexOf(`Sampler`) === suffixLessLength ? name.substring(0, suffixLessLength) : null;\n const samplerBindingType = samplerType === \"sampler_comparison\" ? \"comparison\" /* WebGPUConstants.SamplerBindingType.Comparison */ : \"filtering\" /* WebGPUConstants.SamplerBindingType.Filtering */;\n if (textureName) {\n const textureInfo = this._webgpuProcessingContext.availableTextures[textureName];\n if (textureInfo) {\n textureInfo.autoBindSampler = true;\n }\n }\n let samplerInfo = this._webgpuProcessingContext.availableSamplers[name];\n if (!samplerInfo) {\n samplerInfo = {\n binding: this._webgpuProcessingContext.getNextFreeUBOBinding(),\n type: samplerBindingType,\n };\n this._webgpuProcessingContext.availableSamplers[name] = samplerInfo;\n }\n this._addSamplerBindingDescription(name, samplerInfo, isVertex);\n const part1 = code.substring(0, match.index);\n const insertPart = `@group(${samplerInfo.binding.groupIndex}) @binding(${samplerInfo.binding.bindingIndex}) `;\n const part2 = code.substring(match.index);\n code = part1 + insertPart + part2;\n samplerRegexp.lastIndex += insertPart.length;\n }\n return code;\n }\n _processCustomBuffers(code, isVertex) {\n const instantiateBufferRegexp = /var<\\s*(uniform|storage)\\s*(,\\s*(read|read_write)\\s*)?>\\s+(\\S+)\\s*:\\s*(\\S+)\\s*;/gm;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const match = instantiateBufferRegexp.exec(code);\n if (match === null) {\n break;\n }\n const type = match[1];\n const decoration = match[3];\n let name = match[4];\n const structName = match[5];\n let bufferInfo = this._webgpuProcessingContext.availableBuffers[name];\n if (!bufferInfo) {\n const knownUBO = type === \"uniform\" ? WebGPUShaderProcessingContext.KnownUBOs[structName] : null;\n let binding;\n if (knownUBO) {\n name = structName;\n binding = knownUBO.binding;\n if (binding.groupIndex === -1) {\n binding = this._webgpuProcessingContext.availableBuffers[name]?.binding;\n if (!binding) {\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\n }\n }\n }\n else {\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\n }\n bufferInfo = { binding };\n this._webgpuProcessingContext.availableBuffers[name] = bufferInfo;\n }\n this._addBufferBindingDescription(name, this._webgpuProcessingContext.availableBuffers[name], decoration === \"read_write\"\n ? \"storage\" /* WebGPUConstants.BufferBindingType.Storage */\n : type === \"storage\"\n ? \"read-only-storage\" /* WebGPUConstants.BufferBindingType.ReadOnlyStorage */\n : \"uniform\" /* WebGPUConstants.BufferBindingType.Uniform */, isVertex);\n const groupIndex = bufferInfo.binding.groupIndex;\n const bindingIndex = bufferInfo.binding.bindingIndex;\n const part1 = code.substring(0, match.index);\n const insertPart = `@group(${groupIndex}) @binding(${bindingIndex}) `;\n const part2 = code.substring(match.index);\n code = part1 + insertPart + part2;\n instantiateBufferRegexp.lastIndex += insertPart.length;\n }\n return code;\n }\n _processStridedUniformArrays(code) {\n for (const uniformArrayName of this._stridedUniformArrays) {\n code = code.replace(new RegExp(`${uniformArrayName}\\\\s*\\\\[(.*?)\\\\]`, \"g\"), `${uniformArrayName}[$1].el`);\n }\n return code;\n }\n}\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}
|