mirror of
https://github.com/gpujs/gpu.js.git
synced 2025-12-08 20:35:56 +00:00
Also fix default dynamicOutput = true, it should be false Also add .DS_Store to .gitignore Also update package-lock.json Also fix some unit tests that deal with dynamic output Also add `setDynamicOutput` and `setDynamicArguments` to typescript Also fix issue where `uOutputDim` needs `Int32Array` in `.toString()` Also added some spaces for `.toString()` to look more pretty
821 lines
22 KiB
JavaScript
821 lines
22 KiB
JavaScript
const { assert, skip, test, module: describe, only } = require('qunit');
|
|
const { GPU } = require('../../src');
|
|
|
|
describe('features: dynamic output');
|
|
|
|
function dynamicOutput1DGrows(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return this.output.x + this.thread.x;
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([5]);
|
|
let result = kernel();
|
|
assert.equal(result.length, 5);
|
|
assert.deepEqual(Array.from(result), [5,6,7,8,9]);
|
|
assert.deepEqual(Array.from(kernel.output), [5]);
|
|
|
|
kernel.setOutput([10]);
|
|
result = kernel();
|
|
assert.equal(result.length, 10);
|
|
assert.deepEqual(Array.from(result), [10,11,12,13,14,15,16,17,18,19]);
|
|
assert.deepEqual(Array.from(kernel.output), [10]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 1d grows auto', () => {
|
|
dynamicOutput1DGrows();
|
|
});
|
|
|
|
test('dynamic output 1d grows gpu', () => {
|
|
dynamicOutput1DGrows('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 1d grows webgl', () => {
|
|
dynamicOutput1DGrows('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 1d grows webgl2', () => {
|
|
dynamicOutput1DGrows('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 1d grows headlessgl', () => {
|
|
dynamicOutput1DGrows('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 1d grows cpu', () => {
|
|
dynamicOutput1DGrows('cpu');
|
|
});
|
|
|
|
|
|
function dynamicOutput1DShrinks(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return this.output.x + this.thread.x;
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([10]);
|
|
let result = kernel();
|
|
assert.equal(result.length, 10);
|
|
assert.deepEqual(Array.from(result), [10,11,12,13,14,15,16,17,18,19]);
|
|
assert.deepEqual(Array.from(kernel.output), [10]);
|
|
|
|
kernel.setOutput([5]);
|
|
result = kernel();
|
|
assert.equal(result.length, 5);
|
|
assert.deepEqual(Array.from(result), [5,6,7,8,9]);
|
|
assert.deepEqual(Array.from(kernel.output), [5]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 1d shrinks auto', () => {
|
|
dynamicOutput1DShrinks();
|
|
});
|
|
|
|
test('dynamic output 1d shrinks gpu', () => {
|
|
dynamicOutput1DShrinks('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 1d shrinks webgl', () => {
|
|
dynamicOutput1DShrinks('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 1d shrinks webgl2', () => {
|
|
dynamicOutput1DShrinks('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 1d shrinks headlessgl', () => {
|
|
dynamicOutput1DShrinks('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 1d shrinks cpu', () => {
|
|
dynamicOutput1DShrinks('cpu');
|
|
});
|
|
|
|
function dynamicOutput1DKernelMapGrows(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernelMap({
|
|
result2: function map(v) {
|
|
return v;
|
|
}
|
|
}, function() {
|
|
return map(this.output.x + this.thread.x);
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([5]);
|
|
let result = kernel();
|
|
assert.equal(result.result.length, 5);
|
|
assert.equal(result.result2.length, 5);
|
|
assert.deepEqual(Array.from(result.result), [5,6,7,8,9]);
|
|
assert.deepEqual(Array.from(result.result2), [5,6,7,8,9]);
|
|
assert.deepEqual(Array.from(kernel.output), [5]);
|
|
|
|
kernel.setOutput([10]);
|
|
result = kernel();
|
|
assert.equal(result.result.length, 10);
|
|
assert.equal(result.result2.length, 10);
|
|
assert.deepEqual(Array.from(result.result), [10,11,12,13,14,15,16,17,18,19]);
|
|
assert.deepEqual(Array.from(result.result2), [10,11,12,13,14,15,16,17,18,19]);
|
|
assert.deepEqual(Array.from(kernel.output), [10]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 1d kernel map grows auto', () => {
|
|
dynamicOutput1DKernelMapGrows();
|
|
});
|
|
|
|
test('dynamic output 1d kernel map grows gpu', () => {
|
|
dynamicOutput1DKernelMapGrows('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 1d kernel map grows webgl', () => {
|
|
dynamicOutput1DKernelMapGrows('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 1d kernel map grows webgl2', () => {
|
|
dynamicOutput1DKernelMapGrows('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 1d kernel map grows headlessgl', () => {
|
|
dynamicOutput1DKernelMapGrows('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 1d kernel map grows cpu', () => {
|
|
dynamicOutput1DKernelMapGrows('cpu');
|
|
});
|
|
|
|
|
|
function dynamicOutput1DKernelMapShrinks(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernelMap({
|
|
result2: function map(v) {
|
|
return v;
|
|
}
|
|
}, function() {
|
|
return map(this.output.x + this.thread.x);
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([10]);
|
|
let result = kernel();
|
|
assert.equal(result.result.length, 10);
|
|
assert.equal(result.result2.length, 10);
|
|
assert.deepEqual(Array.from(result.result), [10,11,12,13,14,15,16,17,18,19]);
|
|
assert.deepEqual(Array.from(result.result2), [10,11,12,13,14,15,16,17,18,19]);
|
|
assert.deepEqual(Array.from(kernel.output), [10]);
|
|
|
|
kernel.setOutput([5]);
|
|
result = kernel();
|
|
assert.equal(result.result.length, 5);
|
|
assert.equal(result.result2.length, 5);
|
|
assert.deepEqual(Array.from(result.result), [5,6,7,8,9]);
|
|
assert.deepEqual(Array.from(result.result2), [5,6,7,8,9]);
|
|
assert.deepEqual(Array.from(kernel.output), [5]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 1d kernel map shrinks auto', () => {
|
|
dynamicOutput1DKernelMapShrinks();
|
|
});
|
|
|
|
test('dynamic output 1d kernel map shrinks gpu', () => {
|
|
dynamicOutput1DKernelMapShrinks('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 1d kernel map shrinks webgl', () => {
|
|
dynamicOutput1DKernelMapShrinks('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 1d kernel map shrinks webgl2', () => {
|
|
dynamicOutput1DKernelMapShrinks('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 1d kernel map shrinks headlessgl', () => {
|
|
dynamicOutput1DKernelMapShrinks('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 1d kernel map shrinks cpu', () => {
|
|
dynamicOutput1DKernelMapShrinks('cpu');
|
|
});
|
|
|
|
function dynamicOutput2DGrows(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return this.output.x + this.output.y + this.thread.x + this.thread.y;
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([2,2]);
|
|
let result = kernel();
|
|
assert.equal(result.length, 2);
|
|
assert.deepEqual(result.map(row => Array.from(row)), [[4,5],[5,6]]);
|
|
assert.deepEqual(Array.from(kernel.output), [2,2]);
|
|
|
|
kernel.setOutput([3,3]);
|
|
result = kernel();
|
|
assert.equal(result.length, 3);
|
|
assert.deepEqual(result.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]);
|
|
assert.deepEqual(Array.from(kernel.output), [3,3]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 2d grows auto', () => {
|
|
dynamicOutput2DGrows();
|
|
});
|
|
|
|
test('dynamic output 2d grows gpu', () => {
|
|
dynamicOutput2DGrows('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 2d grows webgl', () => {
|
|
dynamicOutput2DGrows('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d grows webgl2', () => {
|
|
dynamicOutput2DGrows('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d grows headlessgl', () => {
|
|
dynamicOutput2DGrows('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 2d grows cpu', () => {
|
|
dynamicOutput2DGrows('cpu');
|
|
});
|
|
|
|
|
|
function dynamicOutput2DShrinks(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return this.output.x + this.output.y + this.thread.x + this.thread.y;
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([3,3]);
|
|
let result = kernel();
|
|
assert.equal(result.length, 3);
|
|
assert.deepEqual(result.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]);
|
|
assert.deepEqual(Array.from(kernel.output), [3,3]);
|
|
|
|
kernel.setOutput([2,2]);
|
|
result = kernel();
|
|
assert.equal(result.length, 2);
|
|
assert.deepEqual(result.map(row => Array.from(row)), [[4,5],[5,6]]);
|
|
assert.deepEqual(Array.from(kernel.output), [2,2]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 2d shrinks auto', () => {
|
|
dynamicOutput2DShrinks();
|
|
});
|
|
|
|
test('dynamic output 2d shrinks gpu', () => {
|
|
dynamicOutput2DShrinks('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 2d shrinks webgl', () => {
|
|
dynamicOutput2DShrinks('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d shrinks webgl2', () => {
|
|
dynamicOutput2DShrinks('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d shrinks headlessgl', () => {
|
|
dynamicOutput2DShrinks('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 2d shrinks cpu', () => {
|
|
dynamicOutput2DShrinks('cpu');
|
|
});
|
|
|
|
function dynamicOutput2DKernelMapGrows(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernelMap({
|
|
result1: function map(v) {
|
|
return v;
|
|
}
|
|
}, function() {
|
|
return map(this.output.x + this.output.y + this.thread.x + this.thread.y);
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([2,2]);
|
|
let result = kernel();
|
|
assert.equal(result.result.length, 2);
|
|
assert.equal(result.result1.length, 2);
|
|
assert.deepEqual(result.result.map(row => Array.from(row)), [[4,5],[5,6]]);
|
|
assert.deepEqual(result.result1.map(row => Array.from(row)), [[4,5],[5,6]]);
|
|
assert.deepEqual(Array.from(kernel.output), [2,2]);
|
|
|
|
kernel.setOutput([3,3]);
|
|
result = kernel();
|
|
assert.equal(result.result.length, 3);
|
|
assert.equal(result.result1.length, 3);
|
|
assert.deepEqual(result.result.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]);
|
|
assert.deepEqual(result.result1.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]);
|
|
assert.deepEqual(Array.from(kernel.output), [3,3]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 2d kernel map grows auto', () => {
|
|
dynamicOutput2DKernelMapGrows();
|
|
});
|
|
|
|
test('dynamic output 2d kernel map grows gpu', () => {
|
|
dynamicOutput2DKernelMapGrows('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 2d kernel map grows webgl', () => {
|
|
dynamicOutput2DKernelMapGrows('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d kernel map grows webgl2', () => {
|
|
dynamicOutput2DKernelMapGrows('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d kernel map grows headlessgl', () => {
|
|
dynamicOutput2DKernelMapGrows('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 2d kernel map grows cpu', () => {
|
|
dynamicOutput2DKernelMapGrows('cpu');
|
|
});
|
|
|
|
|
|
function dynamicOutput2DKernelMapShrinks(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernelMap({
|
|
result1: function map(v) {
|
|
return v;
|
|
}
|
|
}, function() {
|
|
return map(this.output.x + this.output.y + this.thread.x + this.thread.y);
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([3,3]);
|
|
let result = kernel();
|
|
assert.equal(result.result.length, 3);
|
|
assert.equal(result.result1.length, 3);
|
|
assert.deepEqual(result.result.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]);
|
|
assert.deepEqual(result.result1.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]);
|
|
assert.deepEqual(Array.from(kernel.output), [3,3]);
|
|
|
|
kernel.setOutput([2,2]);
|
|
result = kernel();
|
|
assert.equal(result.result.length, 2);
|
|
assert.equal(result.result1.length, 2);
|
|
assert.deepEqual(result.result.map(row => Array.from(row)), [[4,5],[5,6]]);
|
|
assert.deepEqual(result.result1.map(row => Array.from(row)), [[4,5],[5,6]]);
|
|
assert.deepEqual(Array.from(kernel.output), [2,2]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 2d shrinks auto', () => {
|
|
dynamicOutput2DShrinks();
|
|
});
|
|
|
|
test('dynamic output 2d shrinks gpu', () => {
|
|
dynamicOutput2DShrinks('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 2d shrinks webgl', () => {
|
|
dynamicOutput2DShrinks('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d shrinks webgl2', () => {
|
|
dynamicOutput2DShrinks('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d shrinks headlessgl', () => {
|
|
dynamicOutput2DShrinks('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 2d shrinks cpu', () => {
|
|
dynamicOutput2DShrinks('cpu');
|
|
});
|
|
//TODO:
|
|
|
|
function dynamicOutput2DGraphicalGrows(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
this.color(1,1,1,1);
|
|
}, { graphical: true, dynamicOutput: true });
|
|
|
|
kernel.setOutput([2,2]);
|
|
kernel();
|
|
let result = kernel.getPixels();
|
|
assert.equal(result.length, 2 * 2 * 4);
|
|
assert.deepEqual(Array.from(result), [
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255
|
|
]);
|
|
assert.deepEqual(Array.from(kernel.output), [2,2]);
|
|
|
|
kernel.setOutput([3,3]);
|
|
kernel();
|
|
result = kernel.getPixels();
|
|
assert.equal(result.length, 3 * 3 * 4);
|
|
assert.deepEqual(Array.from(result), [
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
]);
|
|
assert.deepEqual(Array.from(kernel.output), [3,3]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 2d graphical grows auto', () => {
|
|
dynamicOutput2DGraphicalGrows();
|
|
});
|
|
|
|
test('dynamic output 2d graphical grows gpu', () => {
|
|
dynamicOutput2DGraphicalGrows('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 2d graphical grows webgl', () => {
|
|
dynamicOutput2DGraphicalGrows('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d graphical grows webgl2', () => {
|
|
dynamicOutput2DGraphicalGrows('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d graphical grows headlessgl', () => {
|
|
dynamicOutput2DGraphicalGrows('headlessgl');
|
|
});
|
|
|
|
(GPU.isCanvasSupported ? test : skip)('dynamic output 2d graphical grows cpu', () => {
|
|
dynamicOutput2DGraphicalGrows('cpu');
|
|
});
|
|
|
|
|
|
function dynamicOutput2DGraphicalShrinks(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
this.color(1,1,1,1);
|
|
}, { graphical: true, dynamicOutput: true });
|
|
|
|
kernel.setOutput([3,3]);
|
|
kernel();
|
|
let result = kernel.getPixels();
|
|
assert.equal(result.length, 3 * 3 * 4);
|
|
assert.deepEqual(Array.from(result), [
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
]);
|
|
assert.deepEqual(Array.from(kernel.output), [3,3]);
|
|
|
|
kernel.setOutput([2,2]);
|
|
kernel();
|
|
result = kernel.getPixels();
|
|
assert.equal(result.length, 2 * 2 * 4);
|
|
assert.deepEqual(Array.from(result), [
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255,
|
|
255, 255, 255, 255
|
|
]);
|
|
assert.deepEqual(Array.from(kernel.output), [2,2]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 2d graphical shrinks auto', () => {
|
|
dynamicOutput2DGraphicalShrinks();
|
|
});
|
|
|
|
test('dynamic output 2d graphical shrinks gpu', () => {
|
|
dynamicOutput2DGraphicalShrinks('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 2d graphical shrinks webgl', () => {
|
|
dynamicOutput2DGraphicalShrinks('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d graphical shrinks webgl2', () => {
|
|
dynamicOutput2DGraphicalShrinks('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d graphical shrinks headlessgl', () => {
|
|
dynamicOutput2DGraphicalShrinks('headlessgl');
|
|
});
|
|
|
|
(GPU.isCanvasSupported ? test : skip)('dynamic output 2d graphical shrinks cpu', () => {
|
|
dynamicOutput2DGraphicalShrinks('cpu');
|
|
});
|
|
|
|
function dynamicOutput3DGrows(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return this.output.x + this.output.y + this.thread.z + this.thread.x + this.thread.y + this.thread.z;
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([2,2,2]);
|
|
let result = kernel();
|
|
assert.equal(result.length, 2);
|
|
assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]);
|
|
assert.deepEqual(Array.from(kernel.output), [2,2,2]);
|
|
|
|
kernel.setOutput([3,3,3]);
|
|
result = kernel();
|
|
assert.equal(result.length, 3);
|
|
assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), [
|
|
[
|
|
[6,7,8],
|
|
[7,8,9],
|
|
[8,9,10]
|
|
],
|
|
[
|
|
[8,9,10],
|
|
[9,10,11],
|
|
[10,11,12]
|
|
],
|
|
[
|
|
[10,11,12],
|
|
[11,12,13],
|
|
[12,13,14]
|
|
]
|
|
]);
|
|
assert.deepEqual(Array.from(kernel.output), [3,3,3]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 3d grows auto', () => {
|
|
dynamicOutput3DGrows();
|
|
});
|
|
|
|
test('dynamic output 3d grows gpu', () => {
|
|
dynamicOutput3DGrows('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 3d grows webgl', () => {
|
|
dynamicOutput3DGrows('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 3d grows webgl2', () => {
|
|
dynamicOutput3DGrows('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 3d grows headlessgl', () => {
|
|
dynamicOutput3DGrows('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 3d grows cpu', () => {
|
|
dynamicOutput3DGrows('cpu');
|
|
});
|
|
|
|
|
|
function dynamicOutput3DShrinks(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return this.output.x + this.output.y + this.thread.z + this.thread.x + this.thread.y + this.thread.z;
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([3,3,3]);
|
|
let result = kernel();
|
|
assert.equal(result.length, 3);
|
|
assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), [
|
|
[
|
|
[6,7,8],
|
|
[7,8,9],
|
|
[8,9,10]
|
|
],
|
|
[
|
|
[8,9,10],
|
|
[9,10,11],
|
|
[10,11,12]
|
|
],
|
|
[
|
|
[10,11,12],
|
|
[11,12,13],
|
|
[12,13,14]
|
|
]
|
|
]);
|
|
assert.deepEqual(Array.from(kernel.output), [3,3,3]);
|
|
|
|
kernel.setOutput([2,2,2]);
|
|
result = kernel();
|
|
assert.equal(result.length, 2);
|
|
assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]);
|
|
assert.deepEqual(Array.from(kernel.output), [2,2,2]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 3d shrinks auto', () => {
|
|
dynamicOutput3DShrinks();
|
|
});
|
|
|
|
test('dynamic output 3d shrinks gpu', () => {
|
|
dynamicOutput3DShrinks('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 3d shrinks webgl', () => {
|
|
dynamicOutput3DShrinks('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 3d shrinks webgl2', () => {
|
|
dynamicOutput3DShrinks('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 3d shrinks headlessgl', () => {
|
|
dynamicOutput3DShrinks('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 3d shrinks cpu', () => {
|
|
dynamicOutput3DShrinks('cpu');
|
|
});
|
|
|
|
function dynamicOutput3DKernelMapGrows(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernelMap({
|
|
result1: function map(v) {
|
|
return v;
|
|
}
|
|
}, function() {
|
|
return map(this.output.x + this.output.y + this.thread.z + this.thread.x + this.thread.y + this.thread.z);
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([2,2,2]);
|
|
let result = kernel();
|
|
assert.equal(result.result.length, 2);
|
|
assert.equal(result.result1.length, 2);
|
|
assert.deepEqual(result.result.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]);
|
|
assert.deepEqual(result.result1.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]);
|
|
assert.deepEqual(Array.from(kernel.output), [2,2,2]);
|
|
|
|
kernel.setOutput([3,3,3]);
|
|
result = kernel();
|
|
assert.equal(result.result.length, 3);
|
|
assert.equal(result.result1.length, 3);
|
|
assert.deepEqual(result.result.map(matrix => matrix.map(row => Array.from(row))), [
|
|
[
|
|
[6,7,8],
|
|
[7,8,9],
|
|
[8,9,10]
|
|
],
|
|
[
|
|
[8,9,10],
|
|
[9,10,11],
|
|
[10,11,12]
|
|
],
|
|
[
|
|
[10,11,12],
|
|
[11,12,13],
|
|
[12,13,14]
|
|
]
|
|
]);
|
|
assert.deepEqual(result.result1.map(matrix => matrix.map(row => Array.from(row))), [
|
|
[
|
|
[6,7,8],
|
|
[7,8,9],
|
|
[8,9,10]
|
|
],
|
|
[
|
|
[8,9,10],
|
|
[9,10,11],
|
|
[10,11,12]
|
|
],
|
|
[
|
|
[10,11,12],
|
|
[11,12,13],
|
|
[12,13,14]
|
|
]
|
|
]);
|
|
assert.deepEqual(Array.from(kernel.output), [3,3,3]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 3d kernel map grows auto', () => {
|
|
dynamicOutput3DKernelMapGrows();
|
|
});
|
|
|
|
test('dynamic output 3d kernel map grows gpu', () => {
|
|
dynamicOutput3DKernelMapGrows('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 3d kernel map grows webgl', () => {
|
|
dynamicOutput3DKernelMapGrows('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 3d kernel map grows webgl2', () => {
|
|
dynamicOutput3DKernelMapGrows('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 3d kernel map grows headlessgl', () => {
|
|
dynamicOutput3DKernelMapGrows('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 3d kernel map grows cpu', () => {
|
|
dynamicOutput3DKernelMapGrows('cpu');
|
|
});
|
|
|
|
|
|
function dynamicOutput3DKernelMapShrinks(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernelMap({
|
|
result1: function map(v) {
|
|
return v;
|
|
}
|
|
}, function() {
|
|
return map(this.output.x + this.output.y + this.thread.z + this.thread.x + this.thread.y + this.thread.z);
|
|
}, { dynamicOutput: true });
|
|
|
|
kernel.setOutput([3,3,3]);
|
|
let result = kernel();
|
|
assert.equal(result.result.length, 3);
|
|
assert.equal(result.result1.length, 3);
|
|
assert.deepEqual(result.result.map(matrix => matrix.map(row => Array.from(row))), [
|
|
[
|
|
[6,7,8],
|
|
[7,8,9],
|
|
[8,9,10]
|
|
],
|
|
[
|
|
[8,9,10],
|
|
[9,10,11],
|
|
[10,11,12]
|
|
],
|
|
[
|
|
[10,11,12],
|
|
[11,12,13],
|
|
[12,13,14]
|
|
]
|
|
]);
|
|
assert.deepEqual(result.result1.map(matrix => matrix.map(row => Array.from(row))), [
|
|
[
|
|
[6,7,8],
|
|
[7,8,9],
|
|
[8,9,10]
|
|
],
|
|
[
|
|
[8,9,10],
|
|
[9,10,11],
|
|
[10,11,12]
|
|
],
|
|
[
|
|
[10,11,12],
|
|
[11,12,13],
|
|
[12,13,14]
|
|
]
|
|
]);
|
|
assert.deepEqual(Array.from(kernel.output), [3,3,3]);
|
|
|
|
kernel.setOutput([2,2,2]);
|
|
result = kernel();
|
|
assert.equal(result.result.length, 2);
|
|
assert.equal(result.result1.length, 2);
|
|
assert.deepEqual(result.result.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]);
|
|
assert.deepEqual(result.result1.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]);
|
|
assert.deepEqual(Array.from(kernel.output), [2,2,2]);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('dynamic output 3d kernel map shrinks auto', () => {
|
|
dynamicOutput3DKernelMapShrinks();
|
|
});
|
|
|
|
test('dynamic output 3d kernel map shrinks gpu', () => {
|
|
dynamicOutput3DKernelMapShrinks('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('dynamic output 3d kernel map shrinks webgl', () => {
|
|
dynamicOutput3DKernelMapShrinks('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('dynamic output 3d kernel map shrinks webgl2', () => {
|
|
dynamicOutput3DKernelMapShrinks('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 3d kernel map shrinks headlessgl', () => {
|
|
dynamicOutput3DKernelMapShrinks('headlessgl');
|
|
});
|
|
|
|
test('dynamic output 3d kernel map shrinks cpu', () => {
|
|
dynamicOutput3DKernelMapShrinks('cpu');
|
|
});
|