1Module['compileGLSLZeroCopy'] = function(glsl, shader_stage, gen_debug, spirv_version) { 2 gen_debug = !!gen_debug; 3 4 var shader_stage_int; // EShLanguage 5 switch (shader_stage) { 6 case 'vertex': shader_stage_int = 0; break; 7 case 'fragment': shader_stage_int = 4; break; 8 case 'compute': shader_stage_int = 5; break; 9 default: 10 throw new Error("shader_stage must be 'vertex', 'fragment', or 'compute'."); 11 } 12 13 spirv_version = spirv_version || '1.0'; 14 var spirv_version_int; // EShTargetLanguageVersion 15 switch (spirv_version) { 16 case '1.0': spirv_version_int = (1 << 16) | (0 << 8); break; 17 case '1.1': spirv_version_int = (1 << 16) | (1 << 8); break; 18 case '1.2': spirv_version_int = (1 << 16) | (2 << 8); break; 19 case '1.3': spirv_version_int = (1 << 16) | (3 << 8); break; 20 case '1.4': spirv_version_int = (1 << 16) | (4 << 8); break; 21 case '1.5': spirv_version_int = (1 << 16) | (5 << 8); break; 22 default: 23 throw new Error("spirv_version must be '1.0' ~ '1.5'."); 24 } 25 26 var p_output = Module['_malloc'](4); 27 var p_output_len = Module['_malloc'](4); 28 var id = ccall('convert_glsl_to_spirv', 29 'number', 30 ['string', 'number', 'boolean', 'number', 'number', 'number'], 31 [glsl, shader_stage_int, gen_debug, spirv_version_int, p_output, p_output_len]); 32 var output = getValue(p_output, 'i32'); 33 var output_len = getValue(p_output_len, 'i32'); 34 Module['_free'](p_output); 35 Module['_free'](p_output_len); 36 37 if (id === 0) { 38 throw new Error('GLSL compilation failed'); 39 } 40 41 var ret = {}; 42 var outputIndexU32 = output / 4; 43 ret['data'] = Module['HEAPU32'].subarray(outputIndexU32, outputIndexU32 + output_len); 44 ret['free'] = function() { 45 Module['_destroy_output_buffer'](id); 46 }; 47 48 return ret; 49}; 50 51Module['compileGLSL'] = function(glsl, shader_stage, gen_debug, spirv_version) { 52 var compiled = Module['compileGLSLZeroCopy'](glsl, shader_stage, gen_debug, spirv_version); 53 var ret = compiled['data'].slice() 54 compiled['free'](); 55 return ret; 56}; 57