the math didn't end up being wrong, but found an issue with argument type, and went ahead and fixed it
This commit is contained in:
Robert Plummer 2019-05-24 09:36:28 -04:00
parent 1c96c40bd2
commit 49a06ba305
9 changed files with 206 additions and 59 deletions

View File

@ -5,7 +5,7 @@
* GPU Accelerated JavaScript
*
* @version 2.0.0-rc.14
* @date Thu May 23 2019 20:48:22 GMT-0400 (Eastern Daylight Time)
* @date Thu May 23 2019 21:45:45 GMT-0400 (Eastern Daylight Time)
*
* @license MIT
* The MIT License
@ -4581,7 +4581,6 @@ class HeadlessGLKernel extends WebGLKernel {
module.exports = {
HeadlessGLKernel
};
},{"../gl/kernel-string":10,"../web-gl/kernel":55,"gl":2}],32:[function(require,module,exports){
const { utils } = require('../utils');
@ -4785,10 +4784,12 @@ class Kernel {
setupArguments(args) {
if (!this.argumentTypes) {
this.kernelArguments = [];
this.argumentTypes = [];
for (let i = 0; i < args.length; i++) {
const argType = utils.getVariableType(args[i], this.strictIntegers);
this.argumentTypes.push(argType === 'Integer' ? 'Number' : argType);
if (!this.argumentTypes) {
this.argumentTypes = [];
for (let i = 0; i < args.length; i++) {
const argType = utils.getVariableType(args[i], this.strictIntegers);
this.argumentTypes.push(argType === 'Integer' ? 'Number' : argType);
}
}
}
@ -6405,7 +6406,6 @@ const operatorMap = {
module.exports = {
WebGLFunctionNode
};
},{"../function-node":9}],36:[function(require,module,exports){
const { WebGLKernelValueBoolean } = require('./kernel-value/boolean');
const { WebGLKernelValueFloat } = require('./kernel-value/float');
@ -7548,7 +7548,10 @@ class WebGLKernel extends GLKernel {
setupArguments(args) {
this.kernelArguments = [];
this.argumentTextureCount = 0;
this.argumentTypes = [];
const needsArgumentTypes = this.argumentTypes === null;
if (needsArgumentTypes) {
this.argumentTypes = [];
}
this.argumentSizes = [];
this.argumentBitRatios = [];
if (!this.precision) {
@ -7565,8 +7568,13 @@ class WebGLKernel extends GLKernel {
for (let index = 0; index < args.length; index++) {
const value = args[index];
const name = this.argumentNames[index];
const type = utils.getVariableType(value, this.strictIntegers);
this.argumentTypes.push(type);
let type;
if (needsArgumentTypes) {
type = utils.getVariableType(value, this.strictIntegers);
this.argumentTypes.push(type);
} else {
type = this.argumentTypes[index];
}
const KernelValue = this.constructor.lookupKernelValueType(type, this.dynamicArguments ? 'dynamic' : 'static', this.precision);
if (KernelValue === null) {
throw new Error('unsupported argument');
@ -9990,6 +9998,10 @@ class GPU {
source = typeof source === 'function' ? source.toString() : source;
const switchableKernels = {};
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings) || {};
if (settings && typeof settings.argumentTypes === 'object') {
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
}
const mergedSettings = Object.assign({
context: this.context,
canvas: this.canvas,
@ -10046,7 +10058,7 @@ class GPU {
return newKernel.renderOutput();
}
}
}, upgradeDeprecatedCreateKernelSettings(settings) || {});
}, settingsCopy);
const kernel = kernelRunShortcut(new this.Kernel(source, mergedSettings));
@ -10079,7 +10091,12 @@ class GPU {
}
}
const kernel = this.createKernel(fn, upgradeDeprecatedCreateKernelSettings(settings));
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings);
if (settings && typeof settings.argumentTypes === 'object') {
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
}
const kernel = this.createKernel(fn, settingsCopy);
if (Array.isArray(arguments[0])) {
const functions = arguments[0];
for (let i = 0; i < functions.length; i++) {
@ -10194,6 +10211,7 @@ module.exports = {
kernelOrder,
kernelTypes
};
},{"./backend/cpu/kernel":7,"./backend/headless-gl/kernel":31,"./backend/web-gl/kernel":55,"./backend/web-gl2/kernel":79,"./kernel-run-shortcut":85,"./utils":88,"gpu-mock.js":3}],83:[function(require,module,exports){
const { GPU } = require('./gpu');
const { alias } = require('./alias');

View File

@ -5,7 +5,7 @@
* GPU Accelerated JavaScript
*
* @version 2.0.0-rc.14
* @date Thu May 23 2019 20:48:24 GMT-0400 (Eastern Daylight Time)
* @date Thu May 23 2019 21:45:47 GMT-0400 (Eastern Daylight Time)
*
* @license MIT
* The MIT License
@ -18,7 +18,7 @@
* GPU Accelerated JavaScript
*
* @version 2.0.0-rc.14
* @date Thu May 23 2019 20:48:22 GMT-0400 (Eastern Daylight Time)
* @date Thu May 23 2019 21:45:45 GMT-0400 (Eastern Daylight Time)
*
* @license MIT
* The MIT License
@ -4594,7 +4594,6 @@ class HeadlessGLKernel extends WebGLKernel {
module.exports = {
HeadlessGLKernel
};
},{"../gl/kernel-string":10,"../web-gl/kernel":55,"gl":2}],32:[function(require,module,exports){
const { utils } = require('../utils');
@ -4798,10 +4797,12 @@ class Kernel {
setupArguments(args) {
if (!this.argumentTypes) {
this.kernelArguments = [];
this.argumentTypes = [];
for (let i = 0; i < args.length; i++) {
const argType = utils.getVariableType(args[i], this.strictIntegers);
this.argumentTypes.push(argType === 'Integer' ? 'Number' : argType);
if (!this.argumentTypes) {
this.argumentTypes = [];
for (let i = 0; i < args.length; i++) {
const argType = utils.getVariableType(args[i], this.strictIntegers);
this.argumentTypes.push(argType === 'Integer' ? 'Number' : argType);
}
}
}
@ -6418,7 +6419,6 @@ const operatorMap = {
module.exports = {
WebGLFunctionNode
};
},{"../function-node":9}],36:[function(require,module,exports){
const { WebGLKernelValueBoolean } = require('./kernel-value/boolean');
const { WebGLKernelValueFloat } = require('./kernel-value/float');
@ -7561,7 +7561,10 @@ class WebGLKernel extends GLKernel {
setupArguments(args) {
this.kernelArguments = [];
this.argumentTextureCount = 0;
this.argumentTypes = [];
const needsArgumentTypes = this.argumentTypes === null;
if (needsArgumentTypes) {
this.argumentTypes = [];
}
this.argumentSizes = [];
this.argumentBitRatios = [];
if (!this.precision) {
@ -7578,8 +7581,13 @@ class WebGLKernel extends GLKernel {
for (let index = 0; index < args.length; index++) {
const value = args[index];
const name = this.argumentNames[index];
const type = utils.getVariableType(value, this.strictIntegers);
this.argumentTypes.push(type);
let type;
if (needsArgumentTypes) {
type = utils.getVariableType(value, this.strictIntegers);
this.argumentTypes.push(type);
} else {
type = this.argumentTypes[index];
}
const KernelValue = this.constructor.lookupKernelValueType(type, this.dynamicArguments ? 'dynamic' : 'static', this.precision);
if (KernelValue === null) {
throw new Error('unsupported argument');
@ -10003,6 +10011,10 @@ class GPU {
source = typeof source === 'function' ? source.toString() : source;
const switchableKernels = {};
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings) || {};
if (settings && typeof settings.argumentTypes === 'object') {
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
}
const mergedSettings = Object.assign({
context: this.context,
canvas: this.canvas,
@ -10059,7 +10071,7 @@ class GPU {
return newKernel.renderOutput();
}
}
}, upgradeDeprecatedCreateKernelSettings(settings) || {});
}, settingsCopy);
const kernel = kernelRunShortcut(new this.Kernel(source, mergedSettings));
@ -10092,7 +10104,12 @@ class GPU {
}
}
const kernel = this.createKernel(fn, upgradeDeprecatedCreateKernelSettings(settings));
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings);
if (settings && typeof settings.argumentTypes === 'object') {
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
}
const kernel = this.createKernel(fn, settingsCopy);
if (Array.isArray(arguments[0])) {
const functions = arguments[0];
for (let i = 0; i < functions.length; i++) {
@ -10207,6 +10224,7 @@ module.exports = {
kernelOrder,
kernelTypes
};
},{"./backend/cpu/kernel":7,"./backend/headless-gl/kernel":31,"./backend/web-gl/kernel":55,"./backend/web-gl2/kernel":79,"./kernel-run-shortcut":85,"./utils":88,"gpu-mock.js":3}],83:[function(require,module,exports){
const { GPU } = require('./gpu');
const { alias } = require('./alias');

View File

@ -5,7 +5,7 @@
* GPU Accelerated JavaScript
*
* @version 2.0.0-rc.14
* @date Thu May 23 2019 20:48:22 GMT-0400 (Eastern Daylight Time)
* @date Thu May 23 2019 21:45:45 GMT-0400 (Eastern Daylight Time)
*
* @license MIT
* The MIT License
@ -9345,7 +9345,6 @@ class HeadlessGLKernel extends WebGLKernel {
module.exports = {
HeadlessGLKernel
};
},{"../gl/kernel-string":11,"../web-gl/kernel":56,"gl":3}],33:[function(require,module,exports){
const { utils } = require('../utils');
@ -9549,10 +9548,12 @@ class Kernel {
setupArguments(args) {
if (!this.argumentTypes) {
this.kernelArguments = [];
this.argumentTypes = [];
for (let i = 0; i < args.length; i++) {
const argType = utils.getVariableType(args[i], this.strictIntegers);
this.argumentTypes.push(argType === 'Integer' ? 'Number' : argType);
if (!this.argumentTypes) {
this.argumentTypes = [];
for (let i = 0; i < args.length; i++) {
const argType = utils.getVariableType(args[i], this.strictIntegers);
this.argumentTypes.push(argType === 'Integer' ? 'Number' : argType);
}
}
}
@ -11169,7 +11170,6 @@ const operatorMap = {
module.exports = {
WebGLFunctionNode
};
},{"../function-node":10}],37:[function(require,module,exports){
const { WebGLKernelValueBoolean } = require('./kernel-value/boolean');
const { WebGLKernelValueFloat } = require('./kernel-value/float');
@ -12312,7 +12312,10 @@ class WebGLKernel extends GLKernel {
setupArguments(args) {
this.kernelArguments = [];
this.argumentTextureCount = 0;
this.argumentTypes = [];
const needsArgumentTypes = this.argumentTypes === null;
if (needsArgumentTypes) {
this.argumentTypes = [];
}
this.argumentSizes = [];
this.argumentBitRatios = [];
if (!this.precision) {
@ -12329,8 +12332,13 @@ class WebGLKernel extends GLKernel {
for (let index = 0; index < args.length; index++) {
const value = args[index];
const name = this.argumentNames[index];
const type = utils.getVariableType(value, this.strictIntegers);
this.argumentTypes.push(type);
let type;
if (needsArgumentTypes) {
type = utils.getVariableType(value, this.strictIntegers);
this.argumentTypes.push(type);
} else {
type = this.argumentTypes[index];
}
const KernelValue = this.constructor.lookupKernelValueType(type, this.dynamicArguments ? 'dynamic' : 'static', this.precision);
if (KernelValue === null) {
throw new Error('unsupported argument');
@ -14754,6 +14762,10 @@ class GPU {
source = typeof source === 'function' ? source.toString() : source;
const switchableKernels = {};
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings) || {};
if (settings && typeof settings.argumentTypes === 'object') {
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
}
const mergedSettings = Object.assign({
context: this.context,
canvas: this.canvas,
@ -14810,7 +14822,7 @@ class GPU {
return newKernel.renderOutput();
}
}
}, upgradeDeprecatedCreateKernelSettings(settings) || {});
}, settingsCopy);
const kernel = kernelRunShortcut(new this.Kernel(source, mergedSettings));
@ -14843,7 +14855,12 @@ class GPU {
}
}
const kernel = this.createKernel(fn, upgradeDeprecatedCreateKernelSettings(settings));
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings);
if (settings && typeof settings.argumentTypes === 'object') {
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
}
const kernel = this.createKernel(fn, settingsCopy);
if (Array.isArray(arguments[0])) {
const functions = arguments[0];
for (let i = 0; i < functions.length; i++) {
@ -14958,6 +14975,7 @@ module.exports = {
kernelOrder,
kernelTypes
};
},{"./backend/cpu/kernel":8,"./backend/headless-gl/kernel":32,"./backend/web-gl/kernel":56,"./backend/web-gl2/kernel":80,"./kernel-run-shortcut":86,"./utils":89,"gpu-mock.js":4}],84:[function(require,module,exports){
const { GPU } = require('./gpu');
const { alias } = require('./alias');

View File

@ -5,7 +5,7 @@
* GPU Accelerated JavaScript
*
* @version 2.0.0-rc.14
* @date Thu May 23 2019 20:48:24 GMT-0400 (Eastern Daylight Time)
* @date Thu May 23 2019 21:45:47 GMT-0400 (Eastern Daylight Time)
*
* @license MIT
* The MIT License
@ -18,7 +18,7 @@
* GPU Accelerated JavaScript
*
* @version 2.0.0-rc.14
* @date Thu May 23 2019 20:48:22 GMT-0400 (Eastern Daylight Time)
* @date Thu May 23 2019 21:45:45 GMT-0400 (Eastern Daylight Time)
*
* @license MIT
* The MIT License
@ -9358,7 +9358,6 @@ class HeadlessGLKernel extends WebGLKernel {
module.exports = {
HeadlessGLKernel
};
},{"../gl/kernel-string":11,"../web-gl/kernel":56,"gl":3}],33:[function(require,module,exports){
const { utils } = require('../utils');
@ -9562,10 +9561,12 @@ class Kernel {
setupArguments(args) {
if (!this.argumentTypes) {
this.kernelArguments = [];
this.argumentTypes = [];
for (let i = 0; i < args.length; i++) {
const argType = utils.getVariableType(args[i], this.strictIntegers);
this.argumentTypes.push(argType === 'Integer' ? 'Number' : argType);
if (!this.argumentTypes) {
this.argumentTypes = [];
for (let i = 0; i < args.length; i++) {
const argType = utils.getVariableType(args[i], this.strictIntegers);
this.argumentTypes.push(argType === 'Integer' ? 'Number' : argType);
}
}
}
@ -11182,7 +11183,6 @@ const operatorMap = {
module.exports = {
WebGLFunctionNode
};
},{"../function-node":10}],37:[function(require,module,exports){
const { WebGLKernelValueBoolean } = require('./kernel-value/boolean');
const { WebGLKernelValueFloat } = require('./kernel-value/float');
@ -12325,7 +12325,10 @@ class WebGLKernel extends GLKernel {
setupArguments(args) {
this.kernelArguments = [];
this.argumentTextureCount = 0;
this.argumentTypes = [];
const needsArgumentTypes = this.argumentTypes === null;
if (needsArgumentTypes) {
this.argumentTypes = [];
}
this.argumentSizes = [];
this.argumentBitRatios = [];
if (!this.precision) {
@ -12342,8 +12345,13 @@ class WebGLKernel extends GLKernel {
for (let index = 0; index < args.length; index++) {
const value = args[index];
const name = this.argumentNames[index];
const type = utils.getVariableType(value, this.strictIntegers);
this.argumentTypes.push(type);
let type;
if (needsArgumentTypes) {
type = utils.getVariableType(value, this.strictIntegers);
this.argumentTypes.push(type);
} else {
type = this.argumentTypes[index];
}
const KernelValue = this.constructor.lookupKernelValueType(type, this.dynamicArguments ? 'dynamic' : 'static', this.precision);
if (KernelValue === null) {
throw new Error('unsupported argument');
@ -14767,6 +14775,10 @@ class GPU {
source = typeof source === 'function' ? source.toString() : source;
const switchableKernels = {};
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings) || {};
if (settings && typeof settings.argumentTypes === 'object') {
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
}
const mergedSettings = Object.assign({
context: this.context,
canvas: this.canvas,
@ -14823,7 +14835,7 @@ class GPU {
return newKernel.renderOutput();
}
}
}, upgradeDeprecatedCreateKernelSettings(settings) || {});
}, settingsCopy);
const kernel = kernelRunShortcut(new this.Kernel(source, mergedSettings));
@ -14856,7 +14868,12 @@ class GPU {
}
}
const kernel = this.createKernel(fn, upgradeDeprecatedCreateKernelSettings(settings));
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings);
if (settings && typeof settings.argumentTypes === 'object') {
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
}
const kernel = this.createKernel(fn, settingsCopy);
if (Array.isArray(arguments[0])) {
const functions = arguments[0];
for (let i = 0; i < functions.length; i++) {
@ -14971,6 +14988,7 @@ module.exports = {
kernelOrder,
kernelTypes
};
},{"./backend/cpu/kernel":8,"./backend/headless-gl/kernel":32,"./backend/web-gl/kernel":56,"./backend/web-gl2/kernel":80,"./kernel-run-shortcut":86,"./utils":89,"gpu-mock.js":4}],84:[function(require,module,exports){
const { GPU } = require('./gpu');
const { alias } = require('./alias');

View File

@ -258,10 +258,12 @@ class Kernel {
setupArguments(args) {
if (!this.argumentTypes) {
this.kernelArguments = [];
this.argumentTypes = [];
for (let i = 0; i < args.length; i++) {
const argType = utils.getVariableType(args[i], this.strictIntegers);
this.argumentTypes.push(argType === 'Integer' ? 'Number' : argType);
if (!this.argumentTypes) {
this.argumentTypes = [];
for (let i = 0; i < args.length; i++) {
const argType = utils.getVariableType(args[i], this.strictIntegers);
this.argumentTypes.push(argType === 'Integer' ? 'Number' : argType);
}
}
}

View File

@ -359,8 +359,11 @@ class WebGLKernel extends GLKernel {
setupArguments(args) {
this.kernelArguments = [];
this.argumentTextureCount = 0;
const needsArgumentTypes = this.argumentTypes === null;
// TODO: remove
this.argumentTypes = [];
if (needsArgumentTypes) {
this.argumentTypes = [];
}
this.argumentSizes = [];
this.argumentBitRatios = [];
// TODO: end remove
@ -379,8 +382,13 @@ class WebGLKernel extends GLKernel {
for (let index = 0; index < args.length; index++) {
const value = args[index];
const name = this.argumentNames[index];
const type = utils.getVariableType(value, this.strictIntegers);
this.argumentTypes.push(type);
let type;
if (needsArgumentTypes) {
type = utils.getVariableType(value, this.strictIntegers);
this.argumentTypes.push(type);
} else {
type = this.argumentTypes[index];
}
const KernelValue = this.constructor.lookupKernelValueType(type, this.dynamicArguments ? 'dynamic' : 'static', this.precision);
if (KernelValue === null) {
throw new Error('unsupported argument');

View File

@ -210,6 +210,11 @@ class GPU {
source = typeof source === 'function' ? source.toString() : source;
const switchableKernels = {};
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings) || {};
// handle conversion of argumentTypes
if (settings && typeof settings.argumentTypes === 'object') {
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
}
const mergedSettings = Object.assign({
context: this.context,
canvas: this.canvas,
@ -266,7 +271,7 @@ class GPU {
return newKernel.renderOutput();
}
}
}, upgradeDeprecatedCreateKernelSettings(settings) || {});
}, settingsCopy);
const kernel = kernelRunShortcut(new this.Kernel(source, mergedSettings));
@ -331,7 +336,13 @@ class GPU {
}
}
const kernel = this.createKernel(fn, upgradeDeprecatedCreateKernelSettings(settings));
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings);
// handle conversion of argumentTypes
if (settings && typeof settings.argumentTypes === 'object') {
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
}
const kernel = this.createKernel(fn, settingsCopy);
if (Array.isArray(arguments[0])) {
const functions = arguments[0];
for (let i = 0; i < functions.length; i++) {

View File

@ -163,6 +163,7 @@
<script type="module" src="issues/401-cpu-canvas-check.js"></script>
<script type="module" src="issues/410-if-statement.js"></script>
<script type="module" src="issues/422-warnings.js"></script>
<script type="module" src="issues/470-modulus-wrong.js"></script>
<script type="module" src="issues/471-canvas-issue.js"></script>
<script type="module" src="issues/472-compilation-issue.js"></script>
<script type="module" src="issues/473-4-pixels.js"></script>

View File

@ -0,0 +1,53 @@
const { assert, skip, test, module: describe } = require('qunit');
const { GPU } = require('../../src');
describe('issue #470 - modulus wrong');
function testModulusWrong(mode) {
const gpu = new GPU({ mode });
const kernel = gpu.createKernel(function(mod) {
return this.thread.x % mod;
}, {
output: [10],
argumentTypes: {
mod: 'Integer',
},
});
const result = kernel(6);
assert.equal(kernel.argumentTypes[0], 'Integer');
assert.equal(result[0], 0 % 6);
assert.equal(result[1], 1 % 6);
assert.equal(result[2], 2 % 6);
assert.equal(result[3], 3 % 6);
assert.equal(result[4], 4 % 6);
assert.equal(result[5], 5 % 6);
assert.equal(result[6], 6 % 6);
assert.equal(result[7], 7 % 6);
assert.equal(result[8], 8 % 6);
assert.equal(result[9], 9 % 6);
}
test('auto', () => {
testModulusWrong();
});
test('gpu', () => {
testModulusWrong('gpu');
});
(GPU.isWebGLSupported ? test : skip)('webgl', () => {
testModulusWrong('webgl');
});
(GPU.isWebGL2Supported ? test : skip)('webgl2', () => {
testModulusWrong('webgl2');
});
(GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => {
testModulusWrong('headlessgl');
});
test('cpu', () => {
testModulusWrong('cpu');
});