diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-05-01 16:47:09 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-05-01 16:47:09 -0700 |
commit | f54612a210af5c85071d54d892d533656a940c7c (patch) | |
tree | 9cb2d5a18cc81d8cdc27ae448153d47b966a088e | |
parent | 40b14c18fa3e2e52224fc0de567411d8ffe9f0b2 (diff) |
reuse a buffer for immediate mode rendering
-rw-r--r-- | src/library_gl.js | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/library_gl.js b/src/library_gl.js index de5cf6e8..74715785 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -1311,7 +1311,6 @@ var LibraryGL = { } assert(positionSize > 0); // TODO: verify vertexSize is equal to the stride in enabled client arrays - // XXX TODO: use bufferSubData to prevent reallocation of new buffers? Or all on GPU and doesn't matter? Anyhow, use DYNAMIC as hint var useCurrProgram = !!GL.currProgram; var ret = { vertexSize: vertexSize, @@ -1408,7 +1407,14 @@ var LibraryGL = { this.indexData = new Uint16Array(this.maxElements); this.vertexObject = Module.ctx.createBuffer(); + Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, this.vertexObject); + Module.ctx.bufferData(Module.ctx.ARRAY_BUFFER, this.maxElements*4, Module.ctx.DYNAMIC_DRAW); + Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, null); + this.indexObject = Module.ctx.createBuffer(); + Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, this.indexObject); + Module.ctx.bufferData(Module.ctx.ELEMENT_ARRAY_BUFFER, this.maxElements*2, Module.ctx.DYNAMIC_DRAW); + Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, null); // Replace some functions with immediate-mode aware versions _glDrawArrays = function(mode, first, count) { @@ -1497,7 +1503,6 @@ var LibraryGL = { var renderer = this.setRenderer(this.renderer); // Generate index data in a format suitable for GLES 2.0/WebGL - // TODO: if the mode is one that works in GLES 2.0/WebGL (not GL_QUADS), do not generate indexes at all var numVertexes = 4 * this.vertexCounter / renderer.vertexSize; // XXX assuming float assert(numVertexes % 1 == 0); @@ -1523,12 +1528,12 @@ var LibraryGL = { assert(numIndexes < GL.immediate.maxElements, 'too many immediate mode indexes'); Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, this.indexObject); - Module.ctx.bufferData(Module.ctx.ELEMENT_ARRAY_BUFFER, this.indexData.subarray(0, numIndexes), Module.ctx.STATIC_DRAW); + Module.ctx.bufferSubData(Module.ctx.ELEMENT_ARRAY_BUFFER, 0, this.indexData.subarray(0, numIndexes)); } if (!GL.currArrayBuffer) { Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, this.vertexObject); - Module.ctx.bufferData(Module.ctx.ARRAY_BUFFER, this.vertexData.subarray(0, this.vertexCounter), Module.ctx.STATIC_DRAW); + Module.ctx.bufferSubData(Module.ctx.ARRAY_BUFFER, 0, this.vertexData.subarray(0, this.vertexCounter)); } // Render |