use RenderLarge for TexImage2D

This commit is contained in:
Andrey Sidorov 2014-03-03 11:56:33 +11:00
parent bd119318e0
commit a9c2254aed

View file

@ -138,8 +138,16 @@ module.exports = function(GLX, ctx) {
} }
function render(ctxLocal) { function render(ctxLocal) {
if (!ctxLocal) // ctxLocal overrides ctx passed during creation of renderContext if (!ctxLocal) // ctxLocal overrides ctx passed during creation of renderContext
ctxLocal = ctx; ctxLocal = ctx;
if (buffers.length == 0) {
buffers = [];
currentLength = 0;
return;
}
GLX.Render(ctxLocal, buffers); GLX.Render(ctxLocal, buffers);
buffers = []; buffers = [];
currentLength = 0; currentLength = 0;
@ -255,15 +263,20 @@ module.exports = function(GLX, ctx) {
}, },
TexImage2D: function(target, level, internalFormat, width, height, border, format, type, data) { TexImage2D: function(target, level, internalFormat, width, height, border, format, type, data) {
render();
var typeSize = []; var typeSize = [];
typeSize[constants.FLOAT] = 4; typeSize[constants.FLOAT] = 4;
typeSize[constants.BYTE] = 1; typeSize[constants.BYTE] = 1;
typeSize[constants.UNSIGNED_BYTE] = 1; typeSize[constants.UNSIGNED_BYTE] = 1;
var res = commandBuffer(110, 56 + data.length*typeSize[type]); var res = new Buffer(60 + data.length*typeSize[type]);
res[4] = 0; // swapbytes res.writeUInt32LE(res.length, 0);
res[5] = 0; // lsbfirst res.writeUInt32LE(110, 4);
res.writeUInt16LE(0, 6); // unused
res[8] = 0; // swapbytes
res[9] = 0; // lsbfirst
res.writeUInt16LE(0, 10); // unused
/* /*
defaults: (from http://stackoverflow.com/questions/21563590/glteximage2d-protocol-arguments?noredirect=1#comment32577251_21563590 ) defaults: (from http://stackoverflow.com/questions/21563590/glteximage2d-protocol-arguments?noredirect=1#comment32577251_21563590 )
@ -277,35 +290,58 @@ module.exports = function(GLX, ctx) {
*/ */
res.writeUInt32LE(0, 8); // rowlength res.writeUInt32LE(0, 12); // rowlength
res.writeUInt32LE(0, 12); // skiprows res.writeUInt32LE(0, 16); // skiprows
res.writeUInt32LE(0, 16); // skippixels res.writeUInt32LE(0, 20); // skippixels
res.writeUInt32LE(4, 20); // alignment res.writeUInt32LE(4, 24); // alignment
res.writeUInt32LE(target, 24); res.writeUInt32LE(target, 28);
res.writeUInt32LE(level, 28); res.writeUInt32LE(level, 32);
res.writeUInt32LE(internalFormat, 32); res.writeUInt32LE(internalFormat, 36);
res.writeUInt32LE(width, 36); res.writeUInt32LE(width, 40);
res.writeUInt32LE(height, 40); res.writeUInt32LE(height, 44);
res.writeUInt32LE(border, 44); res.writeUInt32LE(border, 48);
res.writeUInt32LE(format, 48); res.writeUInt32LE(format, 52);
res.writeUInt32LE(type, 52); res.writeUInt32LE(type, 56);
switch(type) { switch(type) {
case constants.FLOAT: case constants.FLOAT:
for (var i=0; i < data.length; ++i) for (var i=0; i < data.length; ++i)
res.writeFloatLE(data[i], 56+i*typeSize[type]); res.writeFloatLE(data[i], 60+i*typeSize[type]);
break; break;
case constants.BYTE: case constants.BYTE:
case constants.UNSIGNED_BYTE: case constants.UNSIGNED_BYTE:
for (var i=0; i < data.length; ++i) for (var i=0; i < data.length; ++i)
res[56+i] = data[i]; res[60+i] = data[i];
break; break;
default: default:
throw new Error('unsupported texture type:' + type); throw new Error('unsupported texture type:' + type);
} }
buffers.push(res);
// bake sure buffer for glxRender request is emptied first
render();
var dataLen = res.length;
var maxSize = 65536*4 - 16 - 8;
var totalRequests = 1 + parseInt(dataLen / maxSize) - 1;
if (dataLen % maxSize)
totalRequests++;
var pos = 0;
var reqNum = 1;
while(dataLen > 0) {
if (dataLen < maxSize) {
GLX.RenderLarge(ctx, reqNum, totalRequests, res.slice(pos));
break;
} else {
GLX.RenderLarge(ctx, reqNum, totalRequests, res.slice(pos, pos + maxSize));
pos += maxSize;
dataLen -= maxSize;
reqNum++;
}
}
}, },
TexCoord2f: function(x, y) { TexCoord2f: function(x, y) {
serialize2f(54, x, y); serialize2f(54, x, y);
} }