Start work on WebGL bindings
[wasm.git] / main.js
diff --git a/main.js b/main.js
index 5ee3c09e5927561e041a73315b5e5367d6b1eba8..0acc5025a1aa1a139280de5320ede495b87a9922 100644 (file)
--- 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')