X-Git-Url: http://git.lukelau.me/?p=wasm.git;a=blobdiff_plain;f=main.js;fp=main.js;h=0acc5025a1aa1a139280de5320ede495b87a9922;hp=5ee3c09e5927561e041a73315b5e5367d6b1eba8;hb=aed1f5271c857c3afa085c593d2ca6159770395c;hpb=3ef5cb466b695cba27e45bbb273af1a9aa71bad9 diff --git a/main.js b/main.js index 5ee3c09..0acc502 100644 --- a/main.js +++ b/main.js @@ -1,9 +1,50 @@ -const memory = new WebAssembly.Memory( { initial: 2, maximum: 8 }) +const canvas = document.querySelector('canvas') + +// hidpi +const width = canvas.width, height = canvas.height +canvas.style.width = width + 'px' +canvas.style.height = height + 'px' +canvas.width = width * window.devicePixelRatio +canvas.height = height * window.devicePixelRatio + +const gl = canvas.getContext('webgl') + +const shaderMap = new Map() +var currentShaderId = 0 +function createShaderId() { + const id = currentShaderId + currentShaderId += 1 + return id +} + +var memory +var decoder = new TextDecoder('utf-8') + +function readUint32(buffer, addr) { + const view = new DataView(buffer) + return view.getUint32(addr, true) +} + const imports = { env: { - __syscall1: (n, a) => console.log(n), - __syscall3: (n, a, b, c) => console.log(n), - __syscall5: (n, a, b, c, d, e) => console.log(n) + glCreateShader: shaderType => { + const id = createShaderId() + const shader = gl.createShader(shaderType) + shaderMap.set(id, shader) + return id + }, + glShaderSource: (id, numSrcs, srcs, lens) => { + const shader = shaderMap.get(id) + var totalSource = '' + for (let i = 0; i < numSrcs; i++) { + const addr = srcs + i * 4 + const src = readUint32(memory.buffer, addr) + const len = readUint32(memory.buffer, lens + i * 4) + totalSource += decoder.decode(memory.buffer.slice(src, src + len)) + } + gl.shaderSource(shader, totalSource) + }, + glCompileShader: a => gl.compileShader(shaderMap.get(a)) } } @@ -14,7 +55,11 @@ sock.onmessage = function (e) { function instantiate(bytes) { return WebAssembly.compile(bytes). - then(m => new WebAssembly.Instance(m, imports)); + then(m => { + const inst = new WebAssembly.Instance(m, imports) + memory = inst.exports.memory + return inst + }); } fetch('test.wasm')