{"version":3,"file":"generateProgram.mjs","sources":["../../../../../../src/rendering/renderers/gl/shader/program/generateProgram.ts"],"sourcesContent":["import { warn } from '../../../../../utils/logging/warn';\nimport { GlProgramData } from '../GlProgramData';\nimport { compileShader } from './compileShader';\nimport { defaultValue } from './defaultValue';\nimport { extractAttributesFromGlProgram } from './extractAttributesFromGlProgram';\nimport { getUboData } from './getUboData';\nimport { getUniformData } from './getUniformData';\nimport { logProgramError } from './logProgramError';\n\nimport type { GlRenderingContext } from '../../context/GlRenderingContext';\nimport type { GlProgram } from '../GlProgram';\nimport type { IGLUniformData } from '../GlProgramData';\n\n/**\n * generates a WebGL Program object from a high level Pixi Program.\n * @param gl - a rendering context on which to generate the program\n * @param program - the high level Pixi Program.\n * @private\n */\nexport function generateProgram(gl: GlRenderingContext, program: GlProgram): GlProgramData\n{\n    const glVertShader = compileShader(gl, gl.VERTEX_SHADER, program.vertex);\n    const glFragShader = compileShader(gl, gl.FRAGMENT_SHADER, program.fragment);\n\n    const webGLProgram = gl.createProgram();\n\n    gl.attachShader(webGLProgram, glVertShader);\n    gl.attachShader(webGLProgram, glFragShader);\n\n    const transformFeedbackVaryings = program.transformFeedbackVaryings;\n\n    if (transformFeedbackVaryings)\n    {\n        if (typeof gl.transformFeedbackVaryings !== 'function')\n        {\n            // #if _DEBUG\n            warn(`TransformFeedback is not supported but TransformFeedbackVaryings are given.`);\n            // #endif\n        }\n        else\n        {\n            gl.transformFeedbackVaryings(\n                webGLProgram,\n                transformFeedbackVaryings.names,\n                transformFeedbackVaryings.bufferMode === 'separate'\n                    ? gl.SEPARATE_ATTRIBS\n                    : gl.INTERLEAVED_ATTRIBS\n            );\n        }\n    }\n\n    gl.linkProgram(webGLProgram);\n\n    if (!gl.getProgramParameter(webGLProgram, gl.LINK_STATUS))\n    {\n        logProgramError(gl, webGLProgram, glVertShader, glFragShader);\n    }\n\n    // GLSL 1.00: bind attributes sorted by name in ascending order\n    // GLSL 3.00: don't change the attribute locations that where chosen by the compiler\n    //            or assigned by the layout specifier in the shader source code\n    program._attributeData = extractAttributesFromGlProgram(\n        webGLProgram,\n        gl,\n        !(/^[ \\t]*#[ \\t]*version[ \\t]+300[ \\t]+es[ \\t]*$/m).test(program.vertex)\n    );\n\n    program._uniformData = getUniformData(webGLProgram, gl);\n    program._uniformBlockData = getUboData(webGLProgram, gl);\n\n    gl.deleteShader(glVertShader);\n    gl.deleteShader(glFragShader);\n\n    const uniformData: {[key: string]: IGLUniformData} = {};\n\n    for (const i in program._uniformData)\n    {\n        const data = program._uniformData[i];\n\n        uniformData[i] = {\n            location: gl.getUniformLocation(webGLProgram, i),\n            value: defaultValue(data.type, data.size),\n        };\n    }\n\n    const glProgram = new GlProgramData(webGLProgram, uniformData);\n\n    return glProgram;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAmBgB,SAAA,eAAA,CAAgB,IAAwB,OACxD,EAAA;AACI,EAAA,MAAM,eAAe,aAAc,CAAA,EAAA,EAAI,EAAG,CAAA,aAAA,EAAe,QAAQ,MAAM,CAAA,CAAA;AACvE,EAAA,MAAM,eAAe,aAAc,CAAA,EAAA,EAAI,EAAG,CAAA,eAAA,EAAiB,QAAQ,QAAQ,CAAA,CAAA;AAE3E,EAAM,MAAA,YAAA,GAAe,GAAG,aAAc,EAAA,CAAA;AAEtC,EAAG,EAAA,CAAA,YAAA,CAAa,cAAc,YAAY,CAAA,CAAA;AAC1C,EAAG,EAAA,CAAA,YAAA,CAAa,cAAc,YAAY,CAAA,CAAA;AAE1C,EAAA,MAAM,4BAA4B,OAAQ,CAAA,yBAAA,CAAA;AAE1C,EAAA,IAAI,yBACJ,EAAA;AACI,IAAI,IAAA,OAAO,EAAG,CAAA,yBAAA,KAA8B,UAC5C,EAAA;AAEI,MAAA,IAAA,CAAK,CAA6E,2EAAA,CAAA,CAAA,CAAA;AAAA,KAItF,MAAA;AACI,MAAG,EAAA,CAAA,yBAAA;AAAA,QACC,YAAA;AAAA,QACA,yBAA0B,CAAA,KAAA;AAAA,QAC1B,yBAA0B,CAAA,UAAA,KAAe,UACnC,GAAA,EAAA,CAAG,mBACH,EAAG,CAAA,mBAAA;AAAA,OACb,CAAA;AAAA,KACJ;AAAA,GACJ;AAEA,EAAA,EAAA,CAAG,YAAY,YAAY,CAAA,CAAA;AAE3B,EAAA,IAAI,CAAC,EAAG,CAAA,mBAAA,CAAoB,YAAc,EAAA,EAAA,CAAG,WAAW,CACxD,EAAA;AACI,IAAgB,eAAA,CAAA,EAAA,EAAI,YAAc,EAAA,YAAA,EAAc,YAAY,CAAA,CAAA;AAAA,GAChE;AAKA,EAAA,OAAA,CAAQ,cAAiB,GAAA,8BAAA;AAAA,IACrB,YAAA;AAAA,IACA,EAAA;AAAA,IACA,CAAE,gDAAA,CAAkD,IAAK,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,GAC3E,CAAA;AAEA,EAAQ,OAAA,CAAA,YAAA,GAAe,cAAe,CAAA,YAAA,EAAc,EAAE,CAAA,CAAA;AACtD,EAAQ,OAAA,CAAA,iBAAA,GAAoB,UAAW,CAAA,YAAA,EAAc,EAAE,CAAA,CAAA;AAEvD,EAAA,EAAA,CAAG,aAAa,YAAY,CAAA,CAAA;AAC5B,EAAA,EAAA,CAAG,aAAa,YAAY,CAAA,CAAA;AAE5B,EAAA,MAAM,cAA+C,EAAC,CAAA;AAEtD,EAAW,KAAA,MAAA,CAAA,IAAK,QAAQ,YACxB,EAAA;AACI,IAAM,MAAA,IAAA,GAAO,OAAQ,CAAA,YAAA,CAAa,CAAC,CAAA,CAAA;AAEnC,IAAA,WAAA,CAAY,CAAC,CAAI,GAAA;AAAA,MACb,QAAU,EAAA,EAAA,CAAG,kBAAmB,CAAA,YAAA,EAAc,CAAC,CAAA;AAAA,MAC/C,KAAO,EAAA,YAAA,CAAa,IAAK,CAAA,IAAA,EAAM,KAAK,IAAI,CAAA;AAAA,KAC5C,CAAA;AAAA,GACJ;AAEA,EAAA,MAAM,SAAY,GAAA,IAAI,aAAc,CAAA,YAAA,EAAc,WAAW,CAAA,CAAA;AAE7D,EAAO,OAAA,SAAA,CAAA;AACX;;;;"}