diff --git a/lib/x11/ext/glxrender.js b/lib/x11/ext/glxrender.js index bd83487..0582412 100644 --- a/lib/x11/ext/glxrender.js +++ b/lib/x11/ext/glxrender.js @@ -2,10 +2,24 @@ var constants = require('./glxconstants'); +var MAX_SMALL_RENDER=65000; + module.exports = function(GLX, ctx) { buffers = []; + var currentLength = 0; function commandBuffer(opcode, len) { + if (currentLength + len > MAX_SMALL_RENDER) { + console.log("Flushing buffer ", currentLength); + render(); + } + if (len > MAX_SMALL_RENDER) + { + throw Error('Buffer too big. Please implement RenderLarge request'); + // renderLarge(); + } + + currentLength += len; var res = Buffer(len); res.writeUInt16LE(len, 0); res.writeUInt16LE(opcode, 2); @@ -91,13 +105,17 @@ module.exports = function(GLX, ctx) { buffers.push(res); } + function render(ctxLocal) { + if (!ctxLocal) // ctxLocal overrides ctx passed during creation of renderContext + ctxLocal = ctx; + console.log("render called"); + GLX.Render(ctxLocal, buffers); + buffers = []; + currentLength = 0; + } + var renderContext = { - render: function(ctxLocal) { - if (!ctxLocal) // ctxLocalOverrides ctx passed during creation of renderContext - ctxLocal = ctx; - GLX.Render(ctx, buffers); - buffers = []; - }, + Render: render, Begin: function(what) { serialize1i(4, what); }, @@ -132,12 +150,18 @@ module.exports = function(GLX, ctx) { Vertex3f: function(x, y, z) { serialize3fv(70, x, y, z); }, + Vertex3fv: function(v) { + serialize3fv(70, v[0], v[1], v[2]); + }, Color3f: function(r, g, b) { serialize3fv(8, r, g, b); }, Normal3f: function(x, y, z) { serialize3fv(30, x, y, z); }, + Normal3fv: function(v) { + serialize3fv(70, v[0], v[1], v[2]); + }, Color4f: function(r, g, b, a) { serialize4fv(16, r, g, b, a); }, @@ -191,7 +215,15 @@ module.exports = function(GLX, ctx) { // bind some glx functions 'NewList EndList GenLists SwapBuffers Finish'.split(' ').forEach(function(name) { - renderContext[name] = GLX[name].bind(GLX, ctx); + // todo: small camelCase ? to be consistent with webgl api + //renderContext[name] = GLX[name].bind(GLX, ctx); + + // flush render buffer before glx requests + renderContext[name] = function(p1, p2, p3, p4, p5, p6, p7, p8) { + console.log(name); + renderContext.render(); + GLX[name](ctx, p1, p2, p3, p4, p5, p6, p7, p8); + } }); return renderContext;