fix #300 nested array issue

This commit is contained in:
Nick Hingston 2018-07-12 22:17:17 +01:00
commit f658164b40
10 changed files with 166 additions and 122 deletions

View File

@ -5,14 +5,14 @@
* GPU Accelerated JavaScript
*
* @version 1.5.0
* @date Thu Jul 12 2018 16:28:40 GMT-0400 (EDT)
* @date Thu Jul 12 2018 22:03:01 GMT+0100 (BST)
*
* @license MIT
* The MIT License
*
* Copyright (c) 2018 gpu.js Team
*/
"use strict";(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){
"use strict";(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

4
bin/gpu-core.min.js vendored
View File

@ -5,11 +5,11 @@
* GPU Accelerated JavaScript
*
* @version 1.5.0
* @date Thu Jul 12 2018 16:28:40 GMT-0400 (EDT)
* @date Thu Jul 12 2018 22:03:01 GMT+0100 (BST)
*
* @license MIT
* The MIT License
*
* Copyright (c) 2018 gpu.js Team
*/
"use strict";!function(){function e(n,t,r){function i(u,a){if(!t[u]){if(!n[u]){var l="function"==typeof require&&require;if(!a&&l)return l(u,!0);if(o)return o(u,!0);var f=new Error("Cannot find module '"+u+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[u]={exports:{}};n[u][0].call(c.exports,function(e){var t=n[u][1][e];return i(t?t:e)},c,c.exports,e,n,t,r)}return t[u].exports}for(var o="function"==typeof require&&require,u=0;u<r.length;u++)i(r[u]);return i}return e}()({1:[function(e,n,t){function r(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(n,t,r){return t&&e(n.prototype,t),r&&e(n,r),n}}();e("./utils-core");n.exports=function(){function e(){r(this,e)}return i(e,null,[{key:"validateKernelObj",value:function(e){if(null===e)throw"KernelObj being validated is NULL";if("string"==typeof e){try{e=JSON.parse(e)}catch(n){throw console.error(n),"Failed to convert KernelObj from JSON string"}if(null===e)throw"Invalid (NULL) KernelObj JSON string representation"}if(e.isKernelObj!==!0)throw"Failed missing isKernelObj flag check";return e}},{key:"loadKernelObj",value:function(e,n){e=validateKernelObj(e)}}]),e}()},{"./utils-core":2}],2:[function(e,n,t){function r(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(n,t,r){return t&&e(n.prototype,t),r&&e(n,r),n}}(),o=function(){function e(){r(this,e)}return i(e,null,[{key:"isCanvas",value:function(e){return null!==e&&e.nodeName&&e.getContext&&"CANVAS"===e.nodeName.toUpperCase()}},{key:"isCanvasSupported",value:function(){return u}},{key:"initCanvas",value:function(){if(!u)return null;var e=document.createElement("canvas");return e.width=2,e.height=2,e}},{key:"isWebGl",value:function(e){return e&&"function"==typeof e.getExtension}},{key:"isWebGlSupported",value:function(){return l}},{key:"isWebGlDrawBuffersSupported",value:function(){return f}},{key:"initWebGlDefaultOptions",value:function(){return{alpha:!1,depth:!1,antialias:!1}}},{key:"initWebGl",value:function(n){if(("undefined"!=typeof u||null===n)&&!u)return null;if(!e.isCanvas(n))throw new Error("Invalid canvas object - "+n);var t=n.getContext("experimental-webgl",e.initWebGlDefaultOptions())||n.getContext("webgl",e.initWebGlDefaultOptions());return t&&(t.OES_texture_float=t.getExtension("OES_texture_float"),t.OES_texture_float_linear=t.getExtension("OES_texture_float_linear"),t.OES_element_index_uint=t.getExtension("OES_element_index_uint")),t}},{key:"initWebGl2",value:function(n){if(("undefined"!=typeof u||null===n)&&!u)return null;if(!e.isCanvas(n))throw new Error("Invalid canvas object - "+n);return n.getContext("webgl2",e.initWebGlDefaultOptions())}},{key:"checkOutput",value:function(e){for(var n=0;n<e.length;n++)if(isNaN(e[n])||e[n]<1)throw new Error("kernel.output["+n+"] incorrectly defined as `"+e[n]+"`, needs to be numeric, and greater than 0")}}]),e}(),u="undefined"!=typeof document&&o.isCanvas(document.createElement("canvas")),a=o.initWebGl(o.initCanvas()),l=o.isWebGl(a),f=l&&Boolean(a.getExtension("WEBGL_draw_buffers"));l?(o.OES_texture_float=a.OES_texture_float,o.OES_texture_float_linear=a.OES_texture_float_linear,o.OES_element_index_uint=a.OES_element_index_uint):(o.OES_texture_float=!1,o.OES_texture_float_linear=!1,o.OES_element_index_uint=!1),n.exports=o},{}],3:[function(e,n,t){var r=e("./core/gpu-core");"undefined"!=typeof n&&(n.exports=r),"undefined"!=typeof window&&(window.GPUCore=r,null===window.GPU&&(window.GPU=r))},{"./core/gpu-core":1}]},{},[3]);
"use strict";!function(){function e(n,t,r){function i(u,a){if(!t[u]){if(!n[u]){var l="function"==typeof require&&require;if(!a&&l)return l(u,!0);if(o)return o(u,!0);var f=new Error("Cannot find module '"+u+"'");throw f.code="MODULE_NOT_FOUND",f}var c=t[u]={exports:{}};n[u][0].call(c.exports,function(e){var t=n[u][1][e];return i(t||e)},c,c.exports,e,n,t,r)}return t[u].exports}for(var o="function"==typeof require&&require,u=0;u<r.length;u++)i(r[u]);return i}return e}()({1:[function(e,n,t){function r(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(n,t,r){return t&&e(n.prototype,t),r&&e(n,r),n}}();e("./utils-core");n.exports=function(){function e(){r(this,e)}return i(e,null,[{key:"validateKernelObj",value:function(e){if(null===e)throw"KernelObj being validated is NULL";if("string"==typeof e){try{e=JSON.parse(e)}catch(n){throw console.error(n),"Failed to convert KernelObj from JSON string"}if(null===e)throw"Invalid (NULL) KernelObj JSON string representation"}if(e.isKernelObj!==!0)throw"Failed missing isKernelObj flag check";return e}},{key:"loadKernelObj",value:function(e,n){e=validateKernelObj(e)}}]),e}()},{"./utils-core":2}],2:[function(e,n,t){function r(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(n,t,r){return t&&e(n.prototype,t),r&&e(n,r),n}}(),o=function(){function e(){r(this,e)}return i(e,null,[{key:"isCanvas",value:function(e){return null!==e&&e.nodeName&&e.getContext&&"CANVAS"===e.nodeName.toUpperCase()}},{key:"isCanvasSupported",value:function(){return u}},{key:"initCanvas",value:function(){if(!u)return null;var e=document.createElement("canvas");return e.width=2,e.height=2,e}},{key:"isWebGl",value:function(e){return e&&"function"==typeof e.getExtension}},{key:"isWebGlSupported",value:function(){return l}},{key:"isWebGlDrawBuffersSupported",value:function(){return f}},{key:"initWebGlDefaultOptions",value:function(){return{alpha:!1,depth:!1,antialias:!1}}},{key:"initWebGl",value:function(n){if(("undefined"!=typeof u||null===n)&&!u)return null;if(!e.isCanvas(n))throw new Error("Invalid canvas object - "+n);var t=n.getContext("experimental-webgl",e.initWebGlDefaultOptions())||n.getContext("webgl",e.initWebGlDefaultOptions());return t&&(t.OES_texture_float=t.getExtension("OES_texture_float"),t.OES_texture_float_linear=t.getExtension("OES_texture_float_linear"),t.OES_element_index_uint=t.getExtension("OES_element_index_uint")),t}},{key:"initWebGl2",value:function(n){if(("undefined"!=typeof u||null===n)&&!u)return null;if(!e.isCanvas(n))throw new Error("Invalid canvas object - "+n);return n.getContext("webgl2",e.initWebGlDefaultOptions())}},{key:"checkOutput",value:function(e){for(var n=0;n<e.length;n++)if(isNaN(e[n])||e[n]<1)throw new Error("kernel.output["+n+"] incorrectly defined as `"+e[n]+"`, needs to be numeric, and greater than 0")}}]),e}(),u="undefined"!=typeof document&&o.isCanvas(document.createElement("canvas")),a=o.initWebGl(o.initCanvas()),l=o.isWebGl(a),f=l&&Boolean(a.getExtension("WEBGL_draw_buffers"));l?(o.OES_texture_float=a.OES_texture_float,o.OES_texture_float_linear=a.OES_texture_float_linear,o.OES_element_index_uint=a.OES_element_index_uint):(o.OES_texture_float=!1,o.OES_texture_float_linear=!1,o.OES_element_index_uint=!1),n.exports=o},{}],3:[function(e,n,t){var r=e("./core/gpu-core");"undefined"!=typeof n&&(n.exports=r),"undefined"!=typeof window&&(window.GPUCore=r,null===window.GPU&&(window.GPU=r))},{"./core/gpu-core":1}]},{},[3]);

File diff suppressed because one or more lines are too long

14
bin/gpu.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -898,11 +898,12 @@ module.exports = function (_FunctionNodeBase) {
this.astGeneric(mNode.property, retArr);
retArr.push(')]');
} else {
var isInGetParams = this.isState('in-get-call-parameters');
var multiMemberExpression = this.isState('multi-member-expression');
if (multiMemberExpression) {
this.popState('multi-member-expression');
this.pushState('not-in-get-call-parameters');
}
this.pushState('not-in-get-call-parameters');
// This normally refers to the global read only input vars
switch (this.getParamType(mNode.object.name)) {
@ -932,9 +933,7 @@ module.exports = function (_FunctionNodeBase) {
this.astGeneric(mNode.object, retArr);
retArr.push('Dim[2]');
retArr.push('), ');
if (multiMemberExpression) {
this.popState('not-in-get-call-parameters');
}
this.popState('not-in-get-call-parameters');
this.pushState('in-get-call-parameters');
this.astGeneric(mNode.property, retArr);
if (!multiMemberExpression) {
@ -958,9 +957,7 @@ module.exports = function (_FunctionNodeBase) {
this.astGeneric(mNode.object, retArr);
retArr.push('Dim[2]');
retArr.push('), ');
if (multiMemberExpression) {
this.popState('not-in-get-call-parameters');
}
this.popState('not-in-get-call-parameters');
this.pushState('in-get-call-parameters');
this.astGeneric(mNode.property, retArr);
if (!multiMemberExpression) {
@ -970,6 +967,9 @@ module.exports = function (_FunctionNodeBase) {
break;
default:
// Get from texture
if (isInGetParams) {
retArr.push('int(');
}
retArr.push('get(');
this.astGeneric(mNode.object, retArr);
retArr.push(', ivec2(');
@ -984,15 +984,16 @@ module.exports = function (_FunctionNodeBase) {
this.astGeneric(mNode.object, retArr);
retArr.push('Dim[2]');
retArr.push('), ');
if (multiMemberExpression) {
this.popState('not-in-get-call-parameters');
}
this.popState('not-in-get-call-parameters');
this.pushState('in-get-call-parameters');
this.astGeneric(mNode.property, retArr);
if (!multiMemberExpression) {
this.popState('in-get-call-parameters');
}
retArr.push(')');
if (isInGetParams) {
retArr.push(')');
}
break;
}
}

File diff suppressed because one or more lines are too long

View File

@ -862,11 +862,12 @@ module.exports = class WebGLFunctionNode extends FunctionNodeBase {
this.astGeneric(mNode.property, retArr);
retArr.push(')]');
} else {
const isInGetParams = this.isState('in-get-call-parameters');
const multiMemberExpression = this.isState('multi-member-expression');
if (multiMemberExpression) {
this.popState('multi-member-expression');
this.pushState('not-in-get-call-parameters');
}
this.pushState('not-in-get-call-parameters');
// This normally refers to the global read only input vars
switch (this.getParamType(mNode.object.name)) {
@ -896,9 +897,7 @@ module.exports = class WebGLFunctionNode extends FunctionNodeBase {
this.astGeneric(mNode.object, retArr);
retArr.push('Dim[2]');
retArr.push('), ');
if (multiMemberExpression) {
this.popState('not-in-get-call-parameters');
}
this.popState('not-in-get-call-parameters');
this.pushState('in-get-call-parameters');
this.astGeneric(mNode.property, retArr);
if (!multiMemberExpression) {
@ -922,9 +921,7 @@ module.exports = class WebGLFunctionNode extends FunctionNodeBase {
this.astGeneric(mNode.object, retArr);
retArr.push('Dim[2]');
retArr.push('), ');
if (multiMemberExpression) {
this.popState('not-in-get-call-parameters');
}
this.popState('not-in-get-call-parameters');
this.pushState('in-get-call-parameters');
this.astGeneric(mNode.property, retArr);
if (!multiMemberExpression) {
@ -934,6 +931,9 @@ module.exports = class WebGLFunctionNode extends FunctionNodeBase {
break;
default:
// Get from texture
if (isInGetParams) {
retArr.push('int(');
}
retArr.push('get(');
this.astGeneric(mNode.object, retArr);
retArr.push(', ivec2(');
@ -948,15 +948,16 @@ module.exports = class WebGLFunctionNode extends FunctionNodeBase {
this.astGeneric(mNode.object, retArr);
retArr.push('Dim[2]');
retArr.push('), ');
if (multiMemberExpression) {
this.popState('not-in-get-call-parameters');
}
this.popState('not-in-get-call-parameters');
this.pushState('in-get-call-parameters');
this.astGeneric(mNode.property, retArr);
if (!multiMemberExpression) {
this.popState('in-get-call-parameters');
}
retArr.push(')');
if (isInGetParams) {
retArr.push(')');
}
break;
}
}

View File

@ -128,18 +128,6 @@ highp float get(highp sampler2D tex, highp ivec2 texSize, highp ivec3 texDim, hi
return get(tex, texSize, texDim, int(0), int(0), x);
}
highp float get(highp sampler2D tex, highp ivec2 texSize, highp ivec3 texDim, highp float z, highp float y, highp float x) {
return get(tex, texSize, texDim, int(z), int(y), int(x));
}
highp float get(highp sampler2D tex, highp ivec2 texSize, highp ivec3 texDim, highp float y, highp float x) {
return get(tex, texSize, texDim, int(0), int(y), int(x));
}
highp float get(highp sampler2D tex, highp ivec2 texSize, highp ivec3 texDim, highp float x) {
return get(tex, texSize, texDim, int(0), int(0), int(x));
}
highp vec4 getImage2D(highp sampler2D tex, highp ivec2 texSize, highp ivec3 texDim, highp int y, highp int x) {
return getImage2D(tex, texSize, texDim, int(0), y, x);
}

View File

@ -63,6 +63,7 @@
<script src="issues/263-to-string.js"></script>
<script src="issues/267-immutable-sub-kernels.js"></script>
<script src="issues/270-cache.js"></script>
<script src="issues/300-nested-array-index.js"></script>
<script src="issues/313-variable-lookup.js"></script>
<script src="issues/314-large-input-array-addressing.js"></script>
<script src="issues/335-missing-z-index-issue.js"></script>

View File

@ -0,0 +1,41 @@
(function() {
// these 2 should be erquivilent
createNestedKernel = function(mode) {
var gpu = new GPU({ mode });
var broken = gpu.createKernel(function(input, lookup) {
return lookup[input[this.thread.x]];
}).setOutput([1]);
return broken;
}
createTempVarKernel = function(mode) {
var gpu = new GPU({ mode });
var working = gpu.createKernel(function(input, lookup) {
var idx = input[this.thread.x];
return lookup[idx];
}).setOutput([1]);
return working;
}
QUnit.test('Issue #300 nested array index - auto', () => {
QUnit.assert.equal(createNestedKernel()([2], [7, 13, 19, 23])[0], 19);
QUnit.assert.equal(createTempVarKernel()([2], [7, 13, 19, 23])[0], 19);
});
QUnit.test('Issue #300 nested array index - gpu', () => {
QUnit.assert.equal(createNestedKernel('gpu')([2], [7, 13, 19, 23])[0], 19);
QUnit.assert.equal(createTempVarKernel('gpu')([2], [7, 13, 19, 23])[0], 19);
});
QUnit.test('Issue #300 nested array index - webgl', () => {
QUnit.assert.equal(createNestedKernel('webgl')([2], [7, 13, 19, 23])[0], 19);
QUnit.assert.equal(createTempVarKernel('webgl')([2], [7, 13, 19, 23])[0], 19);
});
QUnit.test('Issue #300 nested array index - webgl2', () => {
QUnit.assert.equal(createNestedKernel('webgl2')([2], [7, 13, 19, 23])[0], 19);
QUnit.assert.equal(createTempVarKernel('webgl2')([2], [7, 13, 19, 23])[0], 19);
});
})();