Module['compileGLSLZeroCopy'] = function(glsl, shader_stage, gen_debug) { gen_debug = !!gen_debug; var shader_stage_int; if (shader_stage === 'vertex') { shader_stage_int = 0; } else if (shader_stage === 'fragment') { shader_stage_int = 4; } else if (shader_stage === 'compute') { shader_stage_int = 5; } else { throw new Error("shader_stage must be 'vertex', 'fragment', or 'compute'"); } var p_output = Module['_malloc'](4); var p_output_len = Module['_malloc'](4); var id = ccall('convert_glsl_to_spirv', 'number', ['string', 'number', 'boolean', 'number', 'number'], [glsl, shader_stage_int, gen_debug, p_output, p_output_len]); var output = getValue(p_output, 'i32'); var output_len = getValue(p_output_len, 'i32'); Module['_free'](p_output); Module['_free'](p_output_len); if (id === 0) { throw new Error('GLSL compilation failed'); } var ret = {}; var outputIndexU32 = output / 4; ret.data = Module['HEAPU32'].subarray(outputIndexU32, outputIndexU32 + output_len); ret.free = function() { Module['_destroy_output_buffer'](id); }; return ret; }; Module['compileGLSL'] = function(glsl, shader_stage, gen_debug) { var compiled = Module['compileGLSLZeroCopy'](glsl, shader_stage, gen_debug); var ret = compiled.data.slice() compiled.free(); return ret; };