aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-08-04 22:34:40 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-08-05 21:56:54 -0700
commit259415224a44a8a325ef9bb97e423037feda6573 (patch)
tree109b74a66586062155d23385eb915227309ff796
parent6a46d74b73ea522dbf6e96710aaf6fff4b5b7add (diff)
keep GL lookup tables dense
-rw-r--r--src/library_gl.js39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/library_gl.js b/src/library_gl.js
index fb9a57a0..e52d22c3 100644
--- a/src/library_gl.js
+++ b/src/library_gl.js
@@ -10,14 +10,14 @@ var LibraryGL = {
debug: true,
#endif
- counter: 1,
- buffers: {},
- programs: {},
- framebuffers: {},
- renderbuffers: {},
- textures: {},
- uniforms: {},
- shaders: {},
+ counter: 1, // 0 is reserved as 'null' in gl
+ buffers: [],
+ programs: [],
+ framebuffers: [],
+ renderbuffers: [],
+ textures: [],
+ uniforms: [],
+ shaders: [],
packAlignment: 4, // default alignment is 4 bytes
unpackAlignment: 4, // default alignment is 4 bytes
@@ -26,6 +26,15 @@ var LibraryGL = {
Browser.moduleContextCreatedCallbacks.push(GL.initExtensions);
},
+ // Get a new ID for a texture/buffer/etc., while keeping the table dense and fast. Creation is farely rare so it is worth optimizing lookups later.
+ getNewId: function(table) {
+ var ret = GL.counter++;
+ for (var i = table.length; i < ret; i++) {
+ table[i] = null;
+ }
+ return ret;
+ },
+
// Linear lookup in one of the tables (buffers, programs, etc.). TODO: consider using a weakmap to make this faster, if it matters
scan: function(table, object) {
for (var item in table) {
@@ -339,7 +348,7 @@ var LibraryGL = {
glGenTextures: function(n, textures) {
for (var i = 0; i < n; i++) {
- var id = GL.counter++;
+ var id = GL.getNewId(GL.textures);
GL.textures[id] = Module.ctx.createTexture();
{{{ makeSetValue('textures', 'i*4', 'id', 'i32') }}};
}
@@ -420,7 +429,7 @@ var LibraryGL = {
glGenBuffers: function(n, buffers) {
for (var i = 0; i < n; i++) {
- var id = GL.counter++;
+ var id = GL.getNewId(GL.buffers);
GL.buffers[id] = Module.ctx.createBuffer();
{{{ makeSetValue('buffers', 'i*4', 'id', 'i32') }}};
}
@@ -457,7 +466,7 @@ var LibraryGL = {
glGenRenderbuffers: function(n, renderbuffers) {
for (var i = 0; i < n; i++) {
- var id = GL.counter++;
+ var id = GL.getNewId(GL.renderbuffers);
GL.renderbuffers[id] = Module.ctx.createRenderbuffer();
{{{ makeSetValue('renderbuffers', 'i*4', 'id', 'i32') }}};
}
@@ -513,7 +522,7 @@ var LibraryGL = {
name = Pointer_stringify(name);
var loc = Module.ctx.getUniformLocation(GL.programs[program], name);
if (!loc) return -1;
- var id = GL.counter++;
+ var id = GL.getNewId(GL.uniforms);
GL.uniforms[id] = loc;
return id;
},
@@ -726,7 +735,7 @@ var LibraryGL = {
},
glCreateShader: function(shaderType) {
- var id = GL.counter++;
+ var id = GL.getNewId(GL.shaders);
GL.shaders[id] = Module.ctx.createShader(shaderType);
return id;
},
@@ -809,7 +818,7 @@ var LibraryGL = {
},
glCreateProgram: function() {
- var id = GL.counter++;
+ var id = GL.getNewId(GL.programs);
GL.programs[id] = Module.ctx.createProgram();
return id;
},
@@ -875,7 +884,7 @@ var LibraryGL = {
glGenFramebuffers: function(n, ids) {
for (var i = 0; i < n; ++i) {
- var id = GL.counter++;
+ var id = GL.getNewId(GL.framebuffers);
GL.framebuffers[id] = Module.ctx.createFramebuffer();
{{{ makeSetValue('ids', 'i*4', 'id', 'i32') }}};
}