+ glCompileShader: id => gl.compileShader(shaderMap.get(id)),
+ glCreateProgram: () => {
+ const id = createProgramId()
+ const prog = gl.createProgram()
+ programMap.set(id, prog)
+ return id
+ },
+ glAttachShader: (progId, shaderId) => {
+ gl.attachShader(programMap.get(progId), shaderMap.get(shaderId))
+ },
+ glLinkProgram: (progId) => gl.linkProgram(programMap.get(progId)),
+ glUseProgram: (progId) => gl.useProgram(programMap.get(progId)),
+ glGetAttribLocation: (progId, name) => {
+ const prog = programMap.get(progId)
+ return gl.getAttribLocation(prog, getString(name))
+ },
+ glEnableVertexAttribArray: (loc) => gl.enableVertexAttribArray(loc),
+ glVertexAttribPointer: (loc, size, type, normalized, stride, offset) => {
+ gl.vertexAttribPointer(loc, size, type, normalized, stride, offset)
+ },
+ glGenBuffers: (num, addr) => {
+ for (let i = 0; i < num; i++) {
+ const id = createBufferId()
+ const buffer = gl.createBuffer()
+ bufferMap.set(id, buffer)
+ setUint32(addr + i * 4, id)
+ }
+ },
+ glBindBuffer: (target, bufferId) => gl.bindBuffer(target, bufferMap.get(bufferId)),
+ glBufferData: (target, size, addr, usage) => {
+ const data = new Float32Array(memory.buffer.slice(addr, addr + size * 4))
+ gl.bufferData(target, data, usage)
+ }