mirror of
https://github.com/gpujs/gpu.js.git
synced 2025-12-08 20:35:56 +00:00
111 lines
3.1 KiB
JavaScript
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');
|
|
});
|
|
});
|