@pixi/core
Version:
Core PixiJS
1 lines • 4.57 kB
Source Map (JSON)
{"version":3,"file":"generateProgram.mjs","sources":["../../../src/shader/utils/generateProgram.ts"],"sourcesContent":["import { GLProgram } from '../GLProgram';\nimport { compileShader } from './compileShader';\nimport { defaultValue } from './defaultValue';\nimport { getAttributeData } from './getAttributeData';\nimport { getUniformData } from './getUniformData';\nimport { logProgramError } from './logProgramError';\n\nimport type { IRenderingContext } from '../../IRenderer';\nimport type { IGLUniformData } from '../GLProgram';\nimport type { Program } from '../Program';\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 */\nexport function generateProgram(gl: IRenderingContext, program: Program): GLProgram\n{\n const glVertShader = compileShader(gl, gl.VERTEX_SHADER, program.vertexSrc);\n const glFragShader = compileShader(gl, gl.FRAGMENT_SHADER, program.fragmentSrc);\n\n const webGLProgram = gl.createProgram();\n\n gl.attachShader(webGLProgram, glVertShader);\n gl.attachShader(webGLProgram, glFragShader);\n\n const transformFeedbackVaryings = program.extra?.transformFeedbackVaryings;\n\n if (transformFeedbackVaryings)\n {\n if (typeof gl.transformFeedbackVaryings !== 'function')\n {\n if (process.env.DEBUG)\n {\n console.warn(`TransformFeedback is not supported but TransformFeedbackVaryings are given.`);\n }\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 program.attributeData = getAttributeData(webGLProgram, gl);\n program.uniformData = getUniformData(webGLProgram, gl);\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 if (!(/^[ \\t]*#[ \\t]*version[ \\t]+300[ \\t]+es[ \\t]*$/m).test(program.vertexSrc))\n {\n const keys = Object.keys(program.attributeData);\n\n keys.sort((a, b) => (a > b) ? 1 : -1); // eslint-disable-line no-confusing-arrow\n\n for (let i = 0; i < keys.length; i++)\n {\n program.attributeData[keys[i]].location = i;\n\n gl.bindAttribLocation(webGLProgram, i, keys[i]);\n }\n\n gl.linkProgram(webGLProgram);\n }\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 GLProgram(webGLProgram, uniformData);\n\n return glProgram;\n}\n"],"names":[],"mappings":";;;;;;AAgBgB,SAAA,gBAAgB,IAAuB,SACvD;AACI,QAAM,eAAe,cAAc,IAAI,GAAG,eAAe,QAAQ,SAAS,GACpE,eAAe,cAAc,IAAI,GAAG,iBAAiB,QAAQ,WAAW,GAExE,eAAe,GAAG;AAExB,KAAG,aAAa,cAAc,YAAY,GAC1C,GAAG,aAAa,cAAc,YAAY;AAEpC,QAAA,4BAA4B,QAAQ,OAAO;AAE7C,MAAA,8BAEI,OAAO,GAAG,6BAA8B,aAIpC,QAAQ,KAAK,6EAA6E,IAK9F,GAAG;AAAA,IACC;AAAA,IACA,0BAA0B;AAAA,IAC1B,0BAA0B,eAAe,aACnC,GAAG,mBACH,GAAG;AAAA,EAAA,IAKrB,GAAG,YAAY,YAAY,GAEtB,GAAG,oBAAoB,cAAc,GAAG,WAAW,KAEpD,gBAAgB,IAAI,cAAc,cAAc,YAAY,GAGhE,QAAQ,gBAAgB,iBAAiB,cAAc,EAAE,GACzD,QAAQ,cAAc,eAAe,cAAc,EAAE,GAKjD,CAAE,iDAAkD,KAAK,QAAQ,SAAS,GAC9E;AACI,UAAM,OAAO,OAAO,KAAK,QAAQ,aAAa;AAE9C,SAAK,KAAK,CAAC,GAAG,MAAO,IAAI,IAAK,IAAI,EAAE;AAEpC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ;AAE7B,cAAQ,cAAc,KAAK,CAAC,CAAC,EAAE,WAAW,GAE1C,GAAG,mBAAmB,cAAc,GAAG,KAAK,CAAC,CAAC;AAGlD,OAAG,YAAY,YAAY;AAAA,EAC/B;AAEA,KAAG,aAAa,YAAY,GAC5B,GAAG,aAAa,YAAY;AAE5B,QAAM,cAA+C,CAAA;AAE1C,aAAA,KAAK,QAAQ,aACxB;AACU,UAAA,OAAO,QAAQ,YAAY,CAAC;AAElC,gBAAY,CAAC,IAAI;AAAA,MACb,UAAU,GAAG,mBAAmB,cAAc,CAAC;AAAA,MAC/C,OAAO,aAAa,KAAK,MAAM,KAAK,IAAI;AAAA,IAAA;AAAA,EAEhD;AAEkB,SAAA,IAAI,UAAU,cAAc,WAAW;AAG7D;"}