gpu.js/test/internal/mixed-memory-optimize.js
2019-12-25 09:10:56 -05:00

111 lines
3.1 KiB
JavaScript

const { assert, skip, test, module: describe, only } = require('qunit');
const { GPU } = require('../../src');
describe('internal: mixed memory optimize');
function getOffKernel(gpu) {
return gpu.createKernel(function(value) {
return value[this.thread.x];
}) // getFloatFromSampler2D
.setPrecision('single')
.setOutput([10])
.setPipeline(true)
.setOptimizeFloatMemory(false);
}
function getOnKernel(gpu) {
return gpu.createKernel(function(value) {
return value[this.thread.x];
}) // getMemoryOptimized32
.setPrecision('single')
.setOutput([10])
.setPipeline(true)
.setOptimizeFloatMemory(true);
}
function offOnOff(mode) {
const gpu = new GPU({ mode });
const offKernel = getOffKernel(gpu);
const onKernel = getOnKernel(gpu);
const value = [1,2,3,4,5,6,7,8,9,10];
const textureResult = offKernel(value);
assert.deepEqual(Array.from(textureResult.toArray()), value);
assert.deepEqual(Array.from(onKernel(offKernel(value)).toArray()), value);
const result = offKernel(onKernel(offKernel(value))).toArray();
assert.deepEqual(Array.from(result), value);
gpu.destroy();
}
(GPU.isSinglePrecisionSupported ? test : skip)('off on off auto', () => {
offOnOff();
});
(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('off on off gpu', () => {
offOnOff('gpu');
});
(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('off on off webgl', () => {
offOnOff('webgl');
});
(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('off on off webgl2', () => {
offOnOff('webgl2');
});
(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('off on off headlessgl', () => {
offOnOff('headlessgl');
});
test('off on off cpu', () => {
assert.throws(() => {
offOnOff('cpu');
});
});
function onOffOn(mode) {
const gpu = new GPU({ mode });
const onKernel = getOnKernel(gpu);
const offKernel = getOffKernel(gpu);
const value = [1,2,3,4,5,6,7,8,9,10];
const textureResult1 = onKernel(value);
const textureResult2 = offKernel(onKernel(value));
const textureResult3 = onKernel(offKernel(onKernel(value)));
const result1 = Array.from(textureResult1.toArray());
const result2 = Array.from(textureResult2.toArray());
const result3 = Array.from(textureResult3.toArray());
assert.deepEqual(Array.from(result1), value);
assert.deepEqual(Array.from(result2), value);
assert.deepEqual(Array.from(result3), value);
gpu.destroy();
}
(GPU.isSinglePrecisionSupported ? test : skip)('on off on auto', () => {
onOffOn();
});
(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('on off on gpu', () => {
onOffOn('gpu');
});
(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('on off on webgl', () => {
onOffOn('webgl');
});
(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('on off on webgl2', () => {
onOffOn('webgl2');
});
(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('on off on headlessgl', () => {
onOffOn('headlessgl');
});
test('on off on cpu', () => {
assert.throws(() => {
onOffOn('cpu');
});
});