1919// SOFTWARE.
2020
2121export class Program {
22- constructor ( gl , vertSrc , fragSrc , attribMap , defines ) {
22+ constructor ( gl , vertSrc , fragSrc , attribMap , defines , extensions , layouts ) {
2323 this . _gl = gl ;
2424 this . program = gl . createProgram ( ) ;
2525 this . attrib = null ;
2626 this . uniform = null ;
2727 this . defines = { } ;
28+ this . extensions = [ ] ;
29+ this . layouts = [ ] ;
2830
2931 this . _firstUse = true ;
3032 this . _nextUseCallbacks = [ ] ;
3133
34+ let extensionsString = '' ;
35+ if ( extensions ) {
36+ for ( let extension of extensions ) {
37+ this . extensions . push ( extension ) ;
38+ extensionsString += `#extension ${ extension } : require\n` ;
39+ }
40+ }
41+ let layoutsString = '' ;
42+ if ( layouts ) {
43+ for ( let layout of layouts ) {
44+ this . layouts . push ( layout ) ;
45+ layoutsString += `layout(${ layout } ) in;\n` ;
46+ }
47+ }
3248 let definesString = '' ;
3349 if ( defines ) {
3450 for ( let define in defines ) {
@@ -39,12 +55,12 @@ export class Program {
3955
4056 this . _vertShader = gl . createShader ( gl . VERTEX_SHADER ) ;
4157 gl . attachShader ( this . program , this . _vertShader ) ;
42- gl . shaderSource ( this . _vertShader , definesString + vertSrc ) ;
58+ gl . shaderSource ( this . _vertShader , '#version 300 es\n' + extensionsString + layoutsString + definesString + vertSrc ) ;
4359 gl . compileShader ( this . _vertShader ) ;
4460
4561 this . _fragShader = gl . createShader ( gl . FRAGMENT_SHADER ) ;
4662 gl . attachShader ( this . program , this . _fragShader ) ;
47- gl . shaderSource ( this . _fragShader , definesString + fragSrc ) ;
63+ gl . shaderSource ( this . _fragShader , '#version 300 es\n' + extensionsString + definesString + fragSrc ) ;
4864 gl . compileShader ( this . _fragShader ) ;
4965
5066 if ( attribMap ) {
0 commit comments