Skip to content

Commit 7589551

Browse files
fix: dev mode for adding functions
fix: dev mode kernel to be added to GPU.kernels fix: Array switching with array type is not defined in single precision mode fix: GPU.destroy when no context is set
1 parent fe9b801 commit 7589551

File tree

10 files changed

+243
-29
lines changed

10 files changed

+243
-29
lines changed

dist/gpu-browser-core.js

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
*
55
* GPU Accelerated JavaScript
66
*
7-
* @version 2.0.0-rc.24
8-
* @date Mon Jul 29 2019 16:04:14 GMT-0400 (Eastern Daylight Time)
7+
* @version 2.0.0-rc.25
8+
* @date Tue Aug 06 2019 16:11:03 GMT-0400 (Eastern Daylight Time)
99
*
1010
* @license MIT
1111
* The MIT License
@@ -12407,11 +12407,11 @@ class GPU {
1240712407
this.canvas = settings.canvas || null;
1240812408
this.context = settings.context || null;
1240912409
this.mode = settings.mode;
12410-
if (this.mode === 'dev') return;
1241112410
this.Kernel = null;
1241212411
this.kernels = [];
1241312412
this.functions = [];
1241412413
this.nativeFunctions = [];
12414+
if (this.mode === 'dev') return;
1241512415
this.chooseKernel();
1241612416
if (settings.functions) {
1241712417
for (let i = 0; i < settings.functions.length; i++) {
@@ -12490,7 +12490,9 @@ class GPU {
1249012490
}
1249112491

1249212492
if (this.mode === 'dev') {
12493-
return gpuMock(source, upgradeDeprecatedCreateKernelSettings(settings));
12493+
const devKernel = gpuMock(source, upgradeDeprecatedCreateKernelSettings(settings));
12494+
this.kernels.push(devKernel);
12495+
return devKernel;
1249412496
}
1249512497

1249612498
source = typeof source === 'function' ? source.toString() : source;
@@ -12540,6 +12542,7 @@ class GPU {
1254012542
case 'Number':
1254112543
case 'Integer':
1254212544
case 'Float':
12545+
case 'ArrayTexture(1)':
1254312546
argumentTypes[i] = utils.getVariableType(arg);
1254412547
break;
1254512548
default:
@@ -12631,16 +12634,19 @@ class GPU {
1263112634
fn = arguments[arguments.length - 1];
1263212635
}
1263312636

12634-
if (!this.Kernel.isSupported || !this.Kernel.features.kernelMap) {
12635-
if (this.mode && kernelTypes.indexOf(this.mode) < 0) {
12636-
throw new Error(`kernelMap not supported on ${this.Kernel.name}`);
12637+
if (this.mode !== 'dev') {
12638+
if (!this.Kernel.isSupported || !this.Kernel.features.kernelMap) {
12639+
if (this.mode && kernelTypes.indexOf(this.mode) < 0) {
12640+
throw new Error(`kernelMap not supported on ${this.Kernel.name}`);
12641+
}
1263712642
}
1263812643
}
1263912644

1264012645
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings);
1264112646
if (settings && typeof settings.argumentTypes === 'object') {
1264212647
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
1264312648
}
12649+
1264412650
if (Array.isArray(arguments[0])) {
1264512651
settingsCopy.subKernels = [];
1264612652
const functions = arguments[0];
@@ -12723,7 +12729,15 @@ class GPU {
1272312729
for (let i = 0; i < this.kernels.length; i++) {
1272412730
this.kernels[i].destroy(true);
1272512731
}
12726-
this.kernels[0].kernel.constructor.destroyContext(this.context);
12732+
let firstKernel = this.kernels[0];
12733+
if (firstKernel) {
12734+
if (firstKernel.kernel) {
12735+
firstKernel = firstKernel.kernel;
12736+
}
12737+
if (firstKernel.constructor.destroyContext) {
12738+
firstKernel.constructor.destroyContext(this.context);
12739+
}
12740+
}
1272712741
}, 0);
1272812742
}
1272912743
}

dist/gpu-browser-core.min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/gpu-browser.js

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
*
55
* GPU Accelerated JavaScript
66
*
7-
* @version 2.0.0-rc.24
8-
* @date Mon Jul 29 2019 16:04:14 GMT-0400 (Eastern Daylight Time)
7+
* @version 2.0.0-rc.25
8+
* @date Tue Aug 06 2019 16:11:04 GMT-0400 (Eastern Daylight Time)
99
*
1010
* @license MIT
1111
* The MIT License
@@ -17171,11 +17171,11 @@ class GPU {
1717117171
this.canvas = settings.canvas || null;
1717217172
this.context = settings.context || null;
1717317173
this.mode = settings.mode;
17174-
if (this.mode === 'dev') return;
1717517174
this.Kernel = null;
1717617175
this.kernels = [];
1717717176
this.functions = [];
1717817177
this.nativeFunctions = [];
17178+
if (this.mode === 'dev') return;
1717917179
this.chooseKernel();
1718017180
if (settings.functions) {
1718117181
for (let i = 0; i < settings.functions.length; i++) {
@@ -17254,7 +17254,9 @@ class GPU {
1725417254
}
1725517255

1725617256
if (this.mode === 'dev') {
17257-
return gpuMock(source, upgradeDeprecatedCreateKernelSettings(settings));
17257+
const devKernel = gpuMock(source, upgradeDeprecatedCreateKernelSettings(settings));
17258+
this.kernels.push(devKernel);
17259+
return devKernel;
1725817260
}
1725917261

1726017262
source = typeof source === 'function' ? source.toString() : source;
@@ -17304,6 +17306,7 @@ class GPU {
1730417306
case 'Number':
1730517307
case 'Integer':
1730617308
case 'Float':
17309+
case 'ArrayTexture(1)':
1730717310
argumentTypes[i] = utils.getVariableType(arg);
1730817311
break;
1730917312
default:
@@ -17395,16 +17398,19 @@ class GPU {
1739517398
fn = arguments[arguments.length - 1];
1739617399
}
1739717400

17398-
if (!this.Kernel.isSupported || !this.Kernel.features.kernelMap) {
17399-
if (this.mode && kernelTypes.indexOf(this.mode) < 0) {
17400-
throw new Error(`kernelMap not supported on ${this.Kernel.name}`);
17401+
if (this.mode !== 'dev') {
17402+
if (!this.Kernel.isSupported || !this.Kernel.features.kernelMap) {
17403+
if (this.mode && kernelTypes.indexOf(this.mode) < 0) {
17404+
throw new Error(`kernelMap not supported on ${this.Kernel.name}`);
17405+
}
1740117406
}
1740217407
}
1740317408

1740417409
const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings);
1740517410
if (settings && typeof settings.argumentTypes === 'object') {
1740617411
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
1740717412
}
17413+
1740817414
if (Array.isArray(arguments[0])) {
1740917415
settingsCopy.subKernels = [];
1741017416
const functions = arguments[0];
@@ -17487,7 +17493,15 @@ class GPU {
1748717493
for (let i = 0; i < this.kernels.length; i++) {
1748817494
this.kernels[i].destroy(true);
1748917495
}
17490-
this.kernels[0].kernel.constructor.destroyContext(this.context);
17496+
let firstKernel = this.kernels[0];
17497+
if (firstKernel) {
17498+
if (firstKernel.kernel) {
17499+
firstKernel = firstKernel.kernel;
17500+
}
17501+
if (firstKernel.constructor.destroyContext) {
17502+
firstKernel.constructor.destroyContext(this.context);
17503+
}
17504+
}
1749117505
}, 0);
1749217506
}
1749317507
}

dist/gpu-browser.min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "gpu.js",
3-
"version": "2.0.0-rc.24",
3+
"version": "2.0.0-rc.25",
44
"description": "GPU Accelerated JavaScript",
55
"engines": {
66
"node": ">=8.0.0"

src/gpu.js

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,11 @@ class GPU {
111111
this.canvas = settings.canvas || null;
112112
this.context = settings.context || null;
113113
this.mode = settings.mode;
114-
if (this.mode === 'dev') return;
115114
this.Kernel = null;
116115
this.kernels = [];
117116
this.functions = [];
118117
this.nativeFunctions = [];
118+
if (this.mode === 'dev') return;
119119
this.chooseKernel();
120120
// add functions from settings
121121
if (settings.functions) {
@@ -205,7 +205,9 @@ class GPU {
205205
}
206206

207207
if (this.mode === 'dev') {
208-
return gpuMock(source, upgradeDeprecatedCreateKernelSettings(settings));
208+
const devKernel = gpuMock(source, upgradeDeprecatedCreateKernelSettings(settings));
209+
this.kernels.push(devKernel);
210+
return devKernel;
209211
}
210212

211213
source = typeof source === 'function' ? source.toString() : source;
@@ -256,6 +258,7 @@ class GPU {
256258
case 'Number':
257259
case 'Integer':
258260
case 'Float':
261+
case 'ArrayTexture(1)':
259262
argumentTypes[i] = utils.getVariableType(arg);
260263
break;
261264
default:
@@ -379,9 +382,11 @@ class GPU {
379382
fn = arguments[arguments.length - 1];
380383
}
381384

382-
if (!this.Kernel.isSupported || !this.Kernel.features.kernelMap) {
383-
if (this.mode && kernelTypes.indexOf(this.mode) < 0) {
384-
throw new Error(`kernelMap not supported on ${this.Kernel.name}`);
385+
if (this.mode !== 'dev') {
386+
if (!this.Kernel.isSupported || !this.Kernel.features.kernelMap) {
387+
if (this.mode && kernelTypes.indexOf(this.mode) < 0) {
388+
throw new Error(`kernelMap not supported on ${this.Kernel.name}`);
389+
}
385390
}
386391
}
387392

@@ -390,6 +395,7 @@ class GPU {
390395
if (settings && typeof settings.argumentTypes === 'object') {
391396
settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]);
392397
}
398+
393399
if (Array.isArray(arguments[0])) {
394400
settingsCopy.subKernels = [];
395401
const functions = arguments[0];
@@ -511,7 +517,17 @@ class GPU {
511517
for (let i = 0; i < this.kernels.length; i++) {
512518
this.kernels[i].destroy(true); // remove canvas if exists
513519
}
514-
this.kernels[0].kernel.constructor.destroyContext(this.context);
520+
// all kernels are associated with one context, go ahead and take care of it here
521+
let firstKernel = this.kernels[0];
522+
if (firstKernel) {
523+
// if it is shortcut
524+
if (firstKernel.kernel) {
525+
firstKernel = firstKernel.kernel;
526+
}
527+
if (firstKernel.constructor.destroyContext) {
528+
firstKernel.constructor.destroyContext(this.context);
529+
}
530+
}
515531
}, 0);
516532
}
517533
}

test/all.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
<script type="module" src="features/cpu-with-textures.js"></script>
5858
<script type="module" src="features/create-kernel-map.js"></script>
5959
<script type="module" src="features/demo.js"></script>
60+
<script type="module" src="features/destroy.js"></script>
6061
<script type="module" src="features/dev-mode.js"></script>
6162
<script type="module" src="features/dynamic-arguments.js"></script>
6263
<script type="module" src="features/dynamic-output.js"></script>

test/features/destroy.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
const { assert, skip, test, module: describe } = require('qunit');
2+
const { GPU } = require('../../src');
3+
const sinon = require('sinon');
4+
5+
describe('features: destroy');
6+
7+
function testWithoutDestroyContext(done, mode) {
8+
const gpu = new GPU({ mode });
9+
const destroyKernel = sinon.spy();
10+
gpu.kernels.push({
11+
kernel: {
12+
constructor: {
13+
destroyContext: null
14+
}
15+
},
16+
destroy: destroyKernel
17+
});
18+
gpu.destroy();
19+
gpu.destroy();
20+
setTimeout(() => {
21+
assert.equal(destroyKernel.callCount, 2);
22+
assert.ok(true);
23+
done();
24+
}, 2);
25+
}
26+
27+
test('without destroy context', (t) => {
28+
const done = t.async();
29+
testWithoutDestroyContext(done);
30+
});
31+
32+
function testWithDestroyContext(done, mode) {
33+
const gpu = new GPU({ mode });
34+
const destroyKernel = sinon.spy();
35+
const destroyContextSpy = sinon.spy();
36+
gpu.kernels.push({
37+
kernel: {
38+
constructor: {
39+
destroyContext: destroyContextSpy
40+
}
41+
},
42+
destroy: destroyKernel
43+
});
44+
gpu.destroy();
45+
gpu.destroy();
46+
setTimeout(() => {
47+
assert.equal(destroyKernel.callCount, 2);
48+
assert.equal(destroyContextSpy.callCount, 2);
49+
assert.ok(true);
50+
done();
51+
}, 2);
52+
}
53+
54+
test('with destroy context', (t) => {
55+
const done = t.async();
56+
testWithDestroyContext(done);
57+
});

test/features/dev-mode.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,16 @@ const { GPU, input } = require('../../src');
33

44
describe('features: dev mode');
55

6+
test('are added to GPU instance .kernels property', () => {
7+
const gpu = new GPU({ mode: 'dev' });
8+
const kernel = gpu.createKernel(function(value) {
9+
return value;
10+
}, { output: [1] });
11+
assert.equal(gpu.kernels.length, 1);
12+
assert.deepEqual(kernel(1), new Float32Array([1]));
13+
gpu.destroy();
14+
});
15+
616
test('works with integer', () => {
717
const gpu = new GPU({ mode: 'dev' });
818
const kernel = gpu.createKernel(function(value) {
@@ -145,3 +155,16 @@ test('works with texture', () => {
145155
]);
146156
gpu.destroy();
147157
});
158+
159+
test('works with adding functions', () => {
160+
const gpu = new GPU({ mode: 'dev' });
161+
function addOne(value) {
162+
return value + 1;
163+
}
164+
gpu.addFunction(addOne);
165+
const kernel = gpu.createKernel(function(value) {
166+
return addOne(value);
167+
}, { output: [1] });
168+
assert.deepEqual(kernel(1), new Float32Array([2]));
169+
gpu.destroy();
170+
});

0 commit comments

Comments
 (0)