aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-06-06 20:25:53 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-06-06 20:25:53 -0700
commitd6ca15264496c425b6d4ff6b939d5dbf2ad6533e (patch)
tree99bd33a1a38cdf99f07f538edca07b0d031b5085
parentf5fc497c1be48e4718cb4a0259c127223840bb74 (diff)
clean up last renderer right before preparing the new one, and preparations for skipping preparation altogether when possible
-rw-r--r--src/library_gl.js29
1 files changed, 25 insertions, 4 deletions
diff --git a/src/library_gl.js b/src/library_gl.js
index 2a70503a..1ceee42c 100644
--- a/src/library_gl.js
+++ b/src/library_gl.js
@@ -1269,6 +1269,8 @@ var LibraryGL = {
rendererCache: {},
rendererComponents: {}, // small cache for calls inside glBegin/end. counts how many times the element was seen
rendererComponentPointer: 0, // next place to start a glBegin/end component
+ lastRenderer: null, // used to avoid cleaning up and re-preparing the same renderer
+ lastArrayBuffer: null, // used in conjunction with lastRenderer
// The following data structures are used for OpenGL Immediate Mode matrix routines.
matrix: {},
@@ -1535,14 +1537,32 @@ var LibraryGL = {
},
prepare: function() {
+ // Calculate the array buffer
+ var arrayBuffer;
if (!GL.currArrayBuffer) {
var start = GL.immediate.firstVertex*GL.immediate.stride;
var end = GL.immediate.lastVertex*GL.immediate.stride;
assert(end <= GL.immediate.MAX_TEMP_BUFFER_SIZE, 'too much vertex data');
- var vertexBuffer = GL.immediate.tempVertexBuffers[GL.immediate.tempBufferIndexLookup[end]];
- Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, vertexBuffer);
+ arrayBuffer = GL.immediate.tempVertexBuffers[GL.immediate.tempBufferIndexLookup[end]];
+ } else {
+ arrayBuffer = GL.currArrayBuffer;
+ }
+
+ // If the array buffer is unchanged and the renderer as well, then we can avoid all the work here
+ var lastRenderer = GL.immediate.lastRenderer;
+ var canSkip = false; // XXX TODO this == lastRenderer && arrayBuffer == GL.immediate.lastArrayBuffer;
+ if (!canSkip && lastRenderer) lastRenderer.cleanup();
+ if (!GL.currArrayBuffer) {
+ // Bind the array buffer and upload data after cleaning up the previous renderer
+ if (arrayBuffer != GL.immediate.lastArrayBuffer) {
+ Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, arrayBuffer);
+ }
Module.ctx.bufferSubData(Module.ctx.ARRAY_BUFFER, start, GL.immediate.vertexData.subarray(start >> 2, end >> 2));
}
+ if (canSkip) return;
+ GL.immediate.lastRenderer = this;
+ GL.immediate.lastArrayBuffer = arrayBuffer;
+
if (!GL.currProgram) {
Module.ctx.useProgram(this.program);
}
@@ -1610,6 +1630,9 @@ var LibraryGL = {
if (!GL.currArrayBuffer) {
Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, null);
}
+
+ GL.immediate.lastRenderer = null;
+ GL.immediate.lastArrayBuffer = null;
}
};
ret.init();
@@ -1807,8 +1830,6 @@ var LibraryGL = {
Module.ctx.drawArrays(GL.immediate.mode, startIndex, numVertexes);
}
- renderer.cleanup();
-
if (emulatedElementArrayBuffer) {
Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, GL.buffers[GL.currElementArrayBuffer] || null);
}