Skip to content

Commit b2c9051

Browse files
fix: #534
1 parent db54434 commit b2c9051

File tree

7 files changed

+278
-47
lines changed

7 files changed

+278
-47
lines changed

dist/gpu-browser-core.js

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
*
55
* GPU Accelerated JavaScript
66
*
7-
* @version 2.6.3
8-
* @date Tue Jan 21 2020 07:26:16 GMT-0500 (Eastern Standard Time)
7+
* @version 2.6.4
8+
* @date Tue Jan 21 2020 08:05:29 GMT-0500 (Eastern Standard Time)
99
*
1010
* @license MIT
1111
* The MIT License
@@ -12665,26 +12665,54 @@ class WebGL2Kernel extends WebGLKernel {
1266512665
}
1266612666

1266712667
getKernelString() {
12668-
const result = [];
12668+
const result = [this.getKernelResultDeclaration()];
1266912669
const subKernels = this.subKernels;
1267012670
if (subKernels !== null) {
1267112671
result.push(
12672-
this.getKernelResultDeclaration(),
1267312672
'layout(location = 0) out vec4 data0'
1267412673
);
12675-
for (let i = 0; i < subKernels.length; i++) {
12676-
const subKernel = subKernels[i];
12677-
result.push(
12678-
subKernel.returnType === 'Integer' ?
12679-
`int subKernelResult_${ subKernel.name } = 0` :
12680-
`float subKernelResult_${ subKernel.name } = 0.0`,
12681-
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
12682-
);
12674+
switch (this.returnType) {
12675+
case 'Number':
12676+
case 'Float':
12677+
case 'Integer':
12678+
for (let i = 0; i < subKernels.length; i++) {
12679+
const subKernel = subKernels[i];
12680+
result.push(
12681+
subKernel.returnType === 'Integer' ?
12682+
`int subKernelResult_${ subKernel.name } = 0` :
12683+
`float subKernelResult_${ subKernel.name } = 0.0`,
12684+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
12685+
);
12686+
}
12687+
break;
12688+
case 'Array(2)':
12689+
for (let i = 0; i < subKernels.length; i++) {
12690+
result.push(
12691+
`vec2 subKernelResult_${ subKernels[i].name }`,
12692+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
12693+
);
12694+
}
12695+
break;
12696+
case 'Array(3)':
12697+
for (let i = 0; i < subKernels.length; i++) {
12698+
result.push(
12699+
`vec3 subKernelResult_${ subKernels[i].name }`,
12700+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
12701+
);
12702+
}
12703+
break;
12704+
case 'Array(4)':
12705+
for (let i = 0; i < subKernels.length; i++) {
12706+
result.push(
12707+
`vec4 subKernelResult_${ subKernels[i].name }`,
12708+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
12709+
);
12710+
}
12711+
break;
1268312712
}
1268412713
} else {
1268512714
result.push(
12686-
'out vec4 data0',
12687-
this.getKernelResultDeclaration()
12715+
'out vec4 data0'
1268812716
);
1268912717
}
1269012718

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: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
*
55
* GPU Accelerated JavaScript
66
*
7-
* @version 2.6.3
8-
* @date Tue Jan 21 2020 07:26:16 GMT-0500 (Eastern Standard Time)
7+
* @version 2.6.4
8+
* @date Tue Jan 21 2020 08:05:29 GMT-0500 (Eastern Standard Time)
99
*
1010
* @license MIT
1111
* The MIT License
@@ -17099,26 +17099,54 @@ class WebGL2Kernel extends WebGLKernel {
1709917099
}
1710017100

1710117101
getKernelString() {
17102-
const result = [];
17102+
const result = [this.getKernelResultDeclaration()];
1710317103
const subKernels = this.subKernels;
1710417104
if (subKernels !== null) {
1710517105
result.push(
17106-
this.getKernelResultDeclaration(),
1710717106
'layout(location = 0) out vec4 data0'
1710817107
);
17109-
for (let i = 0; i < subKernels.length; i++) {
17110-
const subKernel = subKernels[i];
17111-
result.push(
17112-
subKernel.returnType === 'Integer' ?
17113-
`int subKernelResult_${ subKernel.name } = 0` :
17114-
`float subKernelResult_${ subKernel.name } = 0.0`,
17115-
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
17116-
);
17108+
switch (this.returnType) {
17109+
case 'Number':
17110+
case 'Float':
17111+
case 'Integer':
17112+
for (let i = 0; i < subKernels.length; i++) {
17113+
const subKernel = subKernels[i];
17114+
result.push(
17115+
subKernel.returnType === 'Integer' ?
17116+
`int subKernelResult_${ subKernel.name } = 0` :
17117+
`float subKernelResult_${ subKernel.name } = 0.0`,
17118+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
17119+
);
17120+
}
17121+
break;
17122+
case 'Array(2)':
17123+
for (let i = 0; i < subKernels.length; i++) {
17124+
result.push(
17125+
`vec2 subKernelResult_${ subKernels[i].name }`,
17126+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
17127+
);
17128+
}
17129+
break;
17130+
case 'Array(3)':
17131+
for (let i = 0; i < subKernels.length; i++) {
17132+
result.push(
17133+
`vec3 subKernelResult_${ subKernels[i].name }`,
17134+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
17135+
);
17136+
}
17137+
break;
17138+
case 'Array(4)':
17139+
for (let i = 0; i < subKernels.length; i++) {
17140+
result.push(
17141+
`vec4 subKernelResult_${ subKernels[i].name }`,
17142+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
17143+
);
17144+
}
17145+
break;
1711717146
}
1711817147
} else {
1711917148
result.push(
17120-
'out vec4 data0',
17121-
this.getKernelResultDeclaration()
17149+
'out vec4 data0'
1712217150
);
1712317151
}
1712417152

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.6.3",
3+
"version": "2.6.4",
44
"description": "GPU Accelerated JavaScript",
55
"engines": {
66
"node": ">=8.0.0"

src/backend/web-gl2/kernel.js

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -401,26 +401,54 @@ class WebGL2Kernel extends WebGLKernel {
401401
* @returns {String} result
402402
*/
403403
getKernelString() {
404-
const result = [];
404+
const result = [this.getKernelResultDeclaration()];
405405
const subKernels = this.subKernels;
406406
if (subKernels !== null) {
407407
result.push(
408-
this.getKernelResultDeclaration(),
409408
'layout(location = 0) out vec4 data0'
410409
);
411-
for (let i = 0; i < subKernels.length; i++) {
412-
const subKernel = subKernels[i];
413-
result.push(
414-
subKernel.returnType === 'Integer' ?
415-
`int subKernelResult_${ subKernel.name } = 0` :
416-
`float subKernelResult_${ subKernel.name } = 0.0`,
417-
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
418-
);
410+
switch (this.returnType) {
411+
case 'Number':
412+
case 'Float':
413+
case 'Integer':
414+
for (let i = 0; i < subKernels.length; i++) {
415+
const subKernel = subKernels[i];
416+
result.push(
417+
subKernel.returnType === 'Integer' ?
418+
`int subKernelResult_${ subKernel.name } = 0` :
419+
`float subKernelResult_${ subKernel.name } = 0.0`,
420+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
421+
);
422+
}
423+
break;
424+
case 'Array(2)':
425+
for (let i = 0; i < subKernels.length; i++) {
426+
result.push(
427+
`vec2 subKernelResult_${ subKernels[i].name }`,
428+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
429+
);
430+
}
431+
break;
432+
case 'Array(3)':
433+
for (let i = 0; i < subKernels.length; i++) {
434+
result.push(
435+
`vec3 subKernelResult_${ subKernels[i].name }`,
436+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
437+
);
438+
}
439+
break;
440+
case 'Array(4)':
441+
for (let i = 0; i < subKernels.length; i++) {
442+
result.push(
443+
`vec4 subKernelResult_${ subKernels[i].name }`,
444+
`layout(location = ${ i + 1 }) out vec4 data${ i + 1 }`
445+
);
446+
}
447+
break;
419448
}
420449
} else {
421450
result.push(
422-
'out vec4 data0',
423-
this.getKernelResultDeclaration()
451+
'out vec4 data0'
424452
);
425453
}
426454

test/features/create-kernel-map.js

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,150 @@ function createKernelMap3DAuto(mode) {
237237
test('createKernelMap 3d cpu', () => {
238238
createKernelMap3DAuto('cpu');
239239
});
240+
241+
function createKernelMapArray2(mode) {
242+
const gpu = new GPU({ mode });
243+
const kernel = gpu.createKernelMap(
244+
{
245+
mapFunc: function mapFunc(mapFuncVal) {
246+
return mapFuncVal;
247+
}
248+
},
249+
function main() {
250+
const mapFuncVal = [1, 2];
251+
mapFunc(mapFuncVal);
252+
const returnValue = [3, 4];
253+
return returnValue;
254+
},
255+
{
256+
output: [1],
257+
returnType: 'Array(2)',
258+
}
259+
);
260+
const { result, mapFunc } = kernel();
261+
assert.deepEqual(Array.from(mapFunc[0]), [1, 2]);
262+
assert.deepEqual(Array.from(result[0]), [3, 4]);
263+
gpu.destroy();
264+
}
265+
266+
test('createKernelMap Array(2) auto', () => {
267+
createKernelMapArray2();
268+
});
269+
270+
test('createKernelMap Array(2) gpu', () => {
271+
createKernelMapArray2('gpu');
272+
});
273+
274+
(GPU.isWebGLSupported ? test : skip)('createKernelMap Array(2) webgl', () => {
275+
createKernelMapArray2('webgl');
276+
});
277+
278+
(GPU.isWebGL2Supported ? test : skip)('createKernelMap Array(2) webgl2', () => {
279+
createKernelMapArray2('webgl2');
280+
});
281+
282+
(GPU.isHeadlessGLSupported ? test : skip)('createKernelMap Array(2) headlessgl', () => {
283+
createKernelMapArray2('headlessgl');
284+
});
285+
286+
test('createKernelMap Array(2) cpu', () => {
287+
createKernelMapArray2('cpu');
288+
});
289+
290+
function createKernelMapArray3(mode) {
291+
const gpu = new GPU({ mode });
292+
const kernel = gpu.createKernelMap(
293+
{
294+
mapFunc: function mapFunc(mapFuncVal) {
295+
return mapFuncVal;
296+
}
297+
},
298+
function main() {
299+
const mapFuncVal = [1, 2, 3];
300+
mapFunc(mapFuncVal);
301+
const returnValue = [4, 5, 6];
302+
return returnValue;
303+
},
304+
{
305+
output: [1],
306+
returnType: 'Array(3)',
307+
}
308+
);
309+
const { result, mapFunc } = kernel();
310+
assert.deepEqual(Array.from(mapFunc[0]), [1, 2, 3]);
311+
assert.deepEqual(Array.from(result[0]), [4, 5, 6]);
312+
gpu.destroy();
313+
}
314+
315+
test('createKernelMap Array(3) auto', () => {
316+
createKernelMapArray3();
317+
});
318+
319+
test('createKernelMap Array(3) gpu', () => {
320+
createKernelMapArray3('gpu');
321+
});
322+
323+
(GPU.isWebGLSupported ? test : skip)('createKernelMap Array(3) webgl', () => {
324+
createKernelMapArray3('webgl');
325+
});
326+
327+
(GPU.isWebGL2Supported ? test : skip)('createKernelMap Array(3) webgl2', () => {
328+
createKernelMapArray3('webgl2');
329+
});
330+
331+
(GPU.isHeadlessGLSupported ? test : skip)('createKernelMap Array(3) headlessgl', () => {
332+
createKernelMapArray3('headlessgl');
333+
});
334+
335+
test('createKernelMap Array(3) cpu', () => {
336+
createKernelMapArray3('cpu');
337+
});
338+
339+
function createKernelMapArray4(mode) {
340+
const gpu = new GPU({ mode });
341+
const kernel = gpu.createKernelMap(
342+
{
343+
mapFunc: function mapFunc(mapFuncVal) {
344+
return mapFuncVal;
345+
}
346+
},
347+
function main() {
348+
const mapFuncVal = [1, 2, 3, 4];
349+
mapFunc(mapFuncVal);
350+
const returnValue = [5, 6, 7, 8];
351+
return returnValue;
352+
},
353+
{
354+
output: [1],
355+
returnType: 'Array(4)',
356+
}
357+
);
358+
const { result, mapFunc } = kernel();
359+
assert.deepEqual(Array.from(mapFunc[0]), [1, 2, 3, 4]);
360+
assert.deepEqual(Array.from(result[0]), [5, 6, 7, 8]);
361+
gpu.destroy();
362+
}
363+
364+
test('createKernelMap Array(4) auto', () => {
365+
createKernelMapArray4();
366+
});
367+
368+
test('createKernelMap Array(4) gpu', () => {
369+
createKernelMapArray4('gpu');
370+
});
371+
372+
(GPU.isWebGLSupported ? test : skip)('createKernelMap Array(4) webgl', () => {
373+
createKernelMapArray4('webgl');
374+
});
375+
376+
(GPU.isWebGL2Supported ? test : skip)('createKernelMap Array(4) webgl2', () => {
377+
createKernelMapArray4('webgl2');
378+
});
379+
380+
(GPU.isHeadlessGLSupported ? test : skip)('createKernelMap Array(4) headlessgl', () => {
381+
createKernelMapArray4('headlessgl');
382+
});
383+
384+
test('createKernelMap Array(4) cpu', () => {
385+
createKernelMapArray4('cpu');
386+
});

0 commit comments

Comments
 (0)