package.lib.util.pool.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of regl Show documentation
Show all versions of regl Show documentation
regl is a fast functional WebGL framework.
The newest version!
var loop = require('./loop')
var GL_BYTE = 5120
var GL_UNSIGNED_BYTE = 5121
var GL_SHORT = 5122
var GL_UNSIGNED_SHORT = 5123
var GL_INT = 5124
var GL_UNSIGNED_INT = 5125
var GL_FLOAT = 5126
function nextPow16 (v) {
for (var i = 16; i <= (1 << 28); i *= 16) {
if (v <= i) {
return i
}
}
return 0
}
function log2 (v) {
var r, shift
r = (v > 0xFFFF) << 4
v >>>= r
shift = (v > 0xFF) << 3
v >>>= shift; r |= shift
shift = (v > 0xF) << 2
v >>>= shift; r |= shift
shift = (v > 0x3) << 1
v >>>= shift; r |= shift
return r | (v >> 1)
}
function createPool () {
var bufferPool = loop(8, function () {
return []
})
function alloc (n) {
var sz = nextPow16(n)
var bin = bufferPool[log2(sz) >> 2]
if (bin.length > 0) {
return bin.pop()
}
return new ArrayBuffer(sz)
}
function free (buf) {
bufferPool[log2(buf.byteLength) >> 2].push(buf)
}
function allocType (type, n) {
var result = null
switch (type) {
case GL_BYTE:
result = new Int8Array(alloc(n), 0, n)
break
case GL_UNSIGNED_BYTE:
result = new Uint8Array(alloc(n), 0, n)
break
case GL_SHORT:
result = new Int16Array(alloc(2 * n), 0, n)
break
case GL_UNSIGNED_SHORT:
result = new Uint16Array(alloc(2 * n), 0, n)
break
case GL_INT:
result = new Int32Array(alloc(4 * n), 0, n)
break
case GL_UNSIGNED_INT:
result = new Uint32Array(alloc(4 * n), 0, n)
break
case GL_FLOAT:
result = new Float32Array(alloc(4 * n), 0, n)
break
default:
return null
}
if (result.length !== n) {
return result.subarray(0, n)
}
return result
}
function freeType (array) {
free(array.buffer)
}
return {
alloc: alloc,
free: free,
allocType: allocType,
freeType: freeType
}
}
var pool = createPool()
// zero pool for initial zero data
pool.zero = createPool()
module.exports = pool