mirror of
https://github.com/gpujs/gpu.js.git
synced 2025-12-08 20:35:56 +00:00
155 lines
4.4 KiB
JavaScript
155 lines
4.4 KiB
JavaScript
const { assert, test, skip, module: describe, only } = require('qunit');
|
|
const { CPUFunctionNode, FunctionBuilder, GPU, WebGL2FunctionNode, WebGLFunctionNode } = require('../../src');
|
|
|
|
describe('internal: function composition return values');
|
|
|
|
function functionCompositionReturnValuesTest(mode) {
|
|
const gpu = new GPU({ mode });
|
|
return gpu.createKernel(function(oneToFour, fourToOne) {
|
|
function add(left, right) {
|
|
return left[this.thread.x] + right[this.thread.x];
|
|
}
|
|
return add(oneToFour, fourToOne);
|
|
}, { output: [4] })([1,2,3,4], [4,3,2,1]);
|
|
}
|
|
|
|
test('auto', () => {
|
|
assert.deepEqual(Array.from(functionCompositionReturnValuesTest()), [5,5,5,5]);
|
|
});
|
|
test('gpu', () => {
|
|
assert.deepEqual(Array.from(functionCompositionReturnValuesTest('gpu')), [5,5,5,5]);
|
|
});
|
|
(GPU.isWebGLSupported ? test : skip)('webgl', () => {
|
|
assert.deepEqual(Array.from(functionCompositionReturnValuesTest('webgl')), [5,5,5,5]);
|
|
});
|
|
(GPU.isWebGL2Supported ? test : skip)('webgl2', () => {
|
|
assert.deepEqual(Array.from(functionCompositionReturnValuesTest('webgl2')), [5,5,5,5]);
|
|
});
|
|
(GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => {
|
|
assert.deepEqual(Array.from(functionCompositionReturnValuesTest('headlessgl')), [5,5,5,5]);
|
|
});
|
|
test('cpu', () => {
|
|
assert.deepEqual(Array.from(functionCompositionReturnValuesTest('cpu')), [5,5,5,5]);
|
|
});
|
|
|
|
|
|
describe('internal: function composition FunctionNode');
|
|
|
|
function functionCompositionFunctionNode(FunctionNode) {
|
|
const output = [1];
|
|
const node = new FunctionNode(`function kernel() {
|
|
function inner() { return 1; }
|
|
|
|
return inner();
|
|
}`, {
|
|
output
|
|
});
|
|
|
|
return node.toString();
|
|
}
|
|
|
|
test('CPUFunctionNode', () => {
|
|
assert.equal(functionCompositionFunctionNode(CPUFunctionNode), 'function kernel() {'
|
|
+ '\n'
|
|
+ '\nreturn inner();'
|
|
+ '\n}');
|
|
});
|
|
test('WebGLFunctionNode', () => {
|
|
assert.equal(functionCompositionFunctionNode(WebGLFunctionNode), 'float kernel() {'
|
|
+ '\n'
|
|
+ '\nreturn inner();'
|
|
+ '\n}');
|
|
});
|
|
test('WebGL2FunctionNode', () => {
|
|
assert.equal(functionCompositionFunctionNode(WebGL2FunctionNode), 'float kernel() {'
|
|
+ '\n'
|
|
+ '\nreturn inner();'
|
|
+ '\n}');
|
|
});
|
|
|
|
describe('internal: number function composition FunctionBuilder');
|
|
|
|
function numberFunctionCompositionFunctionBuilder(FunctionNode) {
|
|
const output = [1];
|
|
const builder = FunctionBuilder.fromKernel({
|
|
source: `function kernel() {
|
|
function inner() { return 1; }
|
|
|
|
return inner();
|
|
}`,
|
|
argumentTypes: [],
|
|
argumentNames: [],
|
|
output,
|
|
}, FunctionNode);
|
|
|
|
return builder.getPrototypeString('kernel');
|
|
}
|
|
|
|
test('CPUFunctionNode', () => {
|
|
assert.equal(numberFunctionCompositionFunctionBuilder(CPUFunctionNode), 'function inner() {'
|
|
+ '\nreturn 1;'
|
|
+ '\n}'
|
|
+ '\nkernelResult = inner();');
|
|
});
|
|
test('WebGLFunctionNode', () => {
|
|
assert.equal(numberFunctionCompositionFunctionBuilder(WebGLFunctionNode), 'float inner() {'
|
|
+ '\nreturn 1.0;'
|
|
+ '\n}'
|
|
+ '\nvoid kernel() {'
|
|
+ '\n'
|
|
+ '\nkernelResult = inner();return;'
|
|
+ '\n}');
|
|
});
|
|
test('WebGL2FunctionNode', () => {
|
|
assert.equal(numberFunctionCompositionFunctionBuilder(WebGL2FunctionNode), 'float inner() {'
|
|
+ '\nreturn 1.0;'
|
|
+ '\n}'
|
|
+ '\nvoid kernel() {'
|
|
+ '\n'
|
|
+ '\nkernelResult = inner();return;'
|
|
+ '\n}');
|
|
});
|
|
|
|
describe('internal: Array(2) function composition FunctionBuilder');
|
|
|
|
function array2FunctionCompositionFunctionBuilder(FunctionNode) {
|
|
const output = [1];
|
|
const builder = FunctionBuilder.fromKernel({
|
|
source: `function kernel() {
|
|
function inner() { return [1,2,3,4]; }
|
|
|
|
return inner()[0];
|
|
}`,
|
|
argumentTypes: [],
|
|
argumentNames: [],
|
|
output,
|
|
}, FunctionNode);
|
|
|
|
return builder.getPrototypeString('kernel');
|
|
}
|
|
|
|
test('CPUFunctionNode', () => {
|
|
assert.equal(array2FunctionCompositionFunctionBuilder(CPUFunctionNode), 'function inner() {'
|
|
+ '\nreturn [1, 2, 3, 4];'
|
|
+ '\n}'
|
|
+ '\nkernelResult = inner()[0];');
|
|
});
|
|
test('WebGLFunctionNode', () => {
|
|
assert.equal(array2FunctionCompositionFunctionBuilder(WebGLFunctionNode), 'vec4 inner() {'
|
|
+ '\nreturn vec4(1.0, 2.0, 3.0, 4.0);'
|
|
+ '\n}'
|
|
+ '\nvoid kernel() {'
|
|
+ '\n'
|
|
+ '\nkernelResult = inner()[0];return;'
|
|
+ '\n}');
|
|
});
|
|
test('WebGL2FunctionNode', () => {
|
|
assert.equal(array2FunctionCompositionFunctionBuilder(WebGL2FunctionNode), 'vec4 inner() {'
|
|
+ '\nreturn vec4(1.0, 2.0, 3.0, 4.0);'
|
|
+ '\n}'
|
|
+ '\nvoid kernel() {'
|
|
+ '\n'
|
|
+ '\nkernelResult = inner()[0];return;'
|
|
+ '\n}');
|
|
});
|