mirror of
https://github.com/gpujs/gpu.js.git
synced 2025-12-08 20:35:56 +00:00
fix: Modulo negatives fix: Modulo accuracy issue on OSX with `integerCorrectionModulo` fix: Follow naming convention `div_with_int_check` to `divWithIntCheck` fix: Member expression with function fix: CPU variable assignment fix: `gpu.addFunction` needed to be before createKernel and documentation fix: mandelbulb.html from above .addFunction
382 lines
8.1 KiB
JavaScript
382 lines
8.1 KiB
JavaScript
const { assert, skip, test, module: describe, only } = require('qunit');
|
|
const { GPU } = require('../../src');
|
|
|
|
describe('features: arithmetic operators');
|
|
|
|
function addition(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return 3 + 2;
|
|
}, { output: [1] });
|
|
const result = kernel();
|
|
assert.equal(result[0], 3 + 2);
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('addition auto', () => {
|
|
addition();
|
|
});
|
|
|
|
(GPU.isGPUSupported ? test : skip)('addition gpu', () => {
|
|
addition('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('addition webgl', () => {
|
|
addition('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('addition webgl2', () => {
|
|
addition('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('addition headlessgl', () => {
|
|
addition('headlessgl');
|
|
});
|
|
|
|
test('addition cpu', () => {
|
|
addition('cpu');
|
|
});
|
|
|
|
|
|
function subtraction(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return 3 - 2;
|
|
}, { output: [1] });
|
|
const result = kernel();
|
|
assert.equal(result[0], 3 - 2);
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('subtraction auto', () => {
|
|
subtraction();
|
|
});
|
|
|
|
(GPU.isGPUSupported ? test : skip)('subtraction gpu', () => {
|
|
subtraction('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('subtraction webgl', () => {
|
|
subtraction('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('subtraction webgl2', () => {
|
|
subtraction('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('subtraction headlessgl', () => {
|
|
subtraction('headlessgl');
|
|
});
|
|
|
|
test('subtraction cpu', () => {
|
|
subtraction('cpu');
|
|
});
|
|
|
|
function multiplication(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return 3 * 2;
|
|
}, { output: [1] });
|
|
const result = kernel();
|
|
assert.equal(result[0], 3 * 2);
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('multiplication auto', () => {
|
|
multiplication();
|
|
});
|
|
|
|
(GPU.isGPUSupported ? test : skip)('multiplication gpu', () => {
|
|
multiplication('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('multiplication webgl', () => {
|
|
multiplication('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('multiplication webgl2', () => {
|
|
multiplication('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('multiplication headlessgl', () => {
|
|
multiplication('headlessgl');
|
|
});
|
|
|
|
test('multiplication cpu', () => {
|
|
multiplication('cpu');
|
|
});
|
|
|
|
function exponential(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return 3 ** 2;
|
|
}, { output: [1] });
|
|
const result = kernel();
|
|
assert.equal(result[0], 3 ** 2);
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('exponential auto', () => {
|
|
exponential();
|
|
});
|
|
|
|
(GPU.isGPUSupported ? test : skip)('exponential gpu', () => {
|
|
exponential('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('exponential webgl', () => {
|
|
exponential('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('exponential webgl2', () => {
|
|
exponential('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('exponential headlessgl', () => {
|
|
exponential('headlessgl');
|
|
});
|
|
|
|
test('exponential cpu', () => {
|
|
exponential('cpu');
|
|
});
|
|
|
|
function division(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
return 3 / 2;
|
|
}, { output: [1] });
|
|
const result = kernel();
|
|
assert.equal(result[0], 3 / 2);
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('division auto', () => {
|
|
division();
|
|
});
|
|
|
|
(GPU.isGPUSupported ? test : skip)('division gpu', () => {
|
|
division('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('division webgl', () => {
|
|
division('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('division webgl2', () => {
|
|
division('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('division headlessgl', () => {
|
|
division('headlessgl');
|
|
});
|
|
|
|
test('division cpu', () => {
|
|
division('cpu');
|
|
});
|
|
|
|
function modulus(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel1 = gpu.createKernel(function() {
|
|
return 3 % 2;
|
|
}, { output: [1] });
|
|
assert.equal(kernel1()[0], 3 % 2);
|
|
|
|
const kernel2 = gpu.createKernel(function() {
|
|
return -126 % 63.5;
|
|
}, { output: [1] });
|
|
assert.equal(kernel2()[0], -126 % 63.5);
|
|
|
|
const kernel3 = gpu.createKernel(function() {
|
|
return 126 % -63.5;
|
|
}, { output: [1] });
|
|
assert.equal(kernel3()[0], 126 % -63.5);
|
|
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('modulus auto', () => {
|
|
modulus();
|
|
});
|
|
|
|
(GPU.isGPUSupported ? test : skip)('modulus gpu', () => {
|
|
modulus('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('modulus webgl', () => {
|
|
modulus('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('modulus webgl2', () => {
|
|
modulus('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('modulus headlessgl', () => {
|
|
modulus('headlessgl');
|
|
});
|
|
|
|
test('modulus cpu', () => {
|
|
modulus('cpu');
|
|
});
|
|
|
|
function modulusVariable(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function(v) {
|
|
return 91 % 7;
|
|
}, { output: [1] });
|
|
assert.equal(kernel(7)[0], 0);
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('modulus variable auto', () => {
|
|
modulusVariable();
|
|
});
|
|
|
|
|
|
function increment(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
let i = 3;
|
|
i++;
|
|
return i;
|
|
}, { output: [1] });
|
|
const result = kernel();
|
|
let i = 3;
|
|
i++;
|
|
assert.equal(result[0], i);
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('increment auto', () => {
|
|
increment();
|
|
});
|
|
|
|
(GPU.isGPUSupported ? test : skip)('increment gpu', () => {
|
|
increment('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('increment webgl', () => {
|
|
increment('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('increment webgl2', () => {
|
|
increment('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('increment headlessgl', () => {
|
|
increment('headlessgl');
|
|
});
|
|
|
|
test('increment cpu', () => {
|
|
increment('cpu');
|
|
});
|
|
|
|
function incrementEarlyReturn(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
let i = 3;
|
|
return i++;
|
|
}, { output: [1] });
|
|
const result = kernel();
|
|
let i = 3;
|
|
assert.equal(result[0], i++);
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('increment early return auto', () => {
|
|
incrementEarlyReturn();
|
|
});
|
|
|
|
(GPU.isGPUSupported ? test : skip)('increment early return gpu', () => {
|
|
incrementEarlyReturn('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('increment early return webgl', () => {
|
|
incrementEarlyReturn('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('increment early return webgl2', () => {
|
|
incrementEarlyReturn('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('increment early return headlessgl', () => {
|
|
incrementEarlyReturn('headlessgl');
|
|
});
|
|
|
|
test('increment early return cpu', () => {
|
|
incrementEarlyReturn('cpu');
|
|
});
|
|
|
|
function decrement(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
let i = 3;
|
|
i--;
|
|
return i;
|
|
}, { output: [1] });
|
|
const result = kernel();
|
|
let i = 3;
|
|
i--;
|
|
assert.equal(result[0], i);
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('decrement auto', () => {
|
|
decrement();
|
|
});
|
|
|
|
(GPU.isGPUSupported ? test : skip)('decrement gpu', () => {
|
|
decrement('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('decrement webgl', () => {
|
|
decrement('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('decrement webgl2', () => {
|
|
decrement('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('decrement headlessgl', () => {
|
|
decrement('headlessgl');
|
|
});
|
|
|
|
test('decrement cpu', () => {
|
|
decrement('cpu');
|
|
});
|
|
|
|
function decrementEarlyReturn(mode) {
|
|
const gpu = new GPU({ mode });
|
|
const kernel = gpu.createKernel(function() {
|
|
let i = 3;
|
|
return i--;
|
|
}, { output: [1] });
|
|
const result = kernel();
|
|
let i = 3;
|
|
assert.equal(result[0], i--);
|
|
gpu.destroy();
|
|
}
|
|
|
|
test('decrement early return auto', () => {
|
|
decrementEarlyReturn();
|
|
});
|
|
|
|
(GPU.isGPUSupported ? test : skip)('decrement early return gpu', () => {
|
|
decrementEarlyReturn('gpu');
|
|
});
|
|
|
|
(GPU.isWebGLSupported ? test : skip)('decrement early return webgl', () => {
|
|
decrementEarlyReturn('webgl');
|
|
});
|
|
|
|
(GPU.isWebGL2Supported ? test : skip)('decrement early return webgl2', () => {
|
|
decrementEarlyReturn('webgl2');
|
|
});
|
|
|
|
(GPU.isHeadlessGLSupported ? test : skip)('decrement early return headlessgl', () => {
|
|
decrementEarlyReturn('headlessgl');
|
|
});
|
|
|
|
test('decrement early return cpu', () => {
|
|
decrementEarlyReturn('cpu');
|
|
});
|