UNPKG

nornenjs

Version:

Implement volume rendering. Use NIVIDA CUDA and Byte stremaing

94 lines (70 loc) 1.79 kB
module.exports = require('./../build/Release/cuda.node'); // Type names follow the W3C typed array specs, not NodeJS's Buffer library var typeByteSize = { Uint8: 1, Uint16: 2, Uint32: 4, Int8: 1, Int16: 2, Int32: 4, Float32: 4, Float64: 8, DevicePtr: 4, DevicePtr8: 1 }; var typeAlignment = { Uint8: 1, Uint16: 2, Uint32: 4, Int8: 1, Int16: 2, Int32: 4, Float32: 4, Float64: 8, DevicePtr: 4, DevicePtr8: 1 }; var typeBufferFunc = { Uint8: 'UInt8', Uint16: 'UInt16LE', Uint32: 'UInt32LE', Int8: 'Int8', Int16: 'Int16LE', Int32: 'Int32LE', Float32: 'FloatLE', Float64: 'DoubleLE' } function alignUp(offset, alignment) { return (((offset) + (alignment) - 1) & ~((alignment) - 1)); } module.exports.prepareArguments = function (args) { var paramBufferSize = 0; for (var i in args) { var type = args[i].type; paramBufferSize = alignUp(paramBufferSize, typeAlignment[type]); if (typeof(typeByteSize[type]) != 'number') throw 'Invalid type given'; paramBufferSize += typeByteSize[type]; } var paramBuffer = new Buffer(paramBufferSize); var offset = 0; for (var i in args) { var type = args[i].type; offset = alignUp(offset, typeAlignment[type]); if (type == 'DevicePtr' || type == 'DevicePtr8') { args[i].value.copy(paramBuffer, offset); } else { paramBuffer['write' + typeBufferFunc[type]](args[i].value, offset); } offset += typeByteSize[type]; } return paramBuffer; } module.exports.launch = function () { var func = arguments[0]; var gridDim = arguments[1]; var blockDim = arguments[2]; var args = arguments[3]; args = module.exports.prepareArguments(args); return func.launchKernel(gridDim, blockDim, args); }