Merge branch 'develop' into refed-textures

This commit is contained in:
Robert Plummer 2019-12-18 13:33:08 -05:00
commit bcae4ba2bb
7 changed files with 252 additions and 141 deletions

113
README.md
View File

@ -37,6 +37,12 @@ Matrix multiplication (perform matrix multiplication on 2 matrices of size 512 x
</script>
```
## CDN
```
https://unpkg.com/gpu.js@latest/dist/gpu-browser.min.js
https://cdn.jsdelivr.net/npm/gpu.js@latest/dist/gpu-browser.min.js
```
## Node
```js
const { GPU } = require('gpu.js');
@ -71,6 +77,7 @@ const c = multiplyMatrix(a, b) as number[][];
NOTE: documentation is slightly out of date for the upcoming release of v2. We will fix it! In the mean time, if you'd like to assist (PLEASE) let us know.
* [Demos](#demos)
* [Installation](#installation)
* [`GPU` Settings](#gpu-settings)
* [`gpu.createKernel` Settings](#gpucreatekernel-settings)
@ -106,6 +113,31 @@ NOTE: documentation is slightly out of date for the upcoming release of v2. We
* [Terms Explained](#terms-explained)
* [License](#license)
## Demos
GPU.js in the wild, all around the net. Add yours here!
* [Temperature interpolation using GPU.js](https://observablehq.com/@rveciana/temperature-interpolation-using-gpu-js)
* [Julia Set Fractal using GPU.js](https://observablehq.com/@ukabuer/julia-set-fractal-using-gpu-js)
* [Hello, gpu.js v2](https://observablehq.com/@fil/hello-gpu-js-v2)
* [Basic gpu.js canvas example](https://observablehq.com/@rveciana/basic-gpu-js-canvas-example)
* [Raster projection with GPU.js](https://observablehq.com/@fil/raster-projection-with-gpu-js)
* [GPU.js Example: Slow Fade](https://observablehq.com/@robertleeplummerjr/gpu-js-example-slow-fade)
* [GPU.JS CA Proof of Concept](https://observablehq.com/@alexlamb/gpu-js-ca-proof-of-concept)
* [Image Convolution using GPU.js](https://observablehq.com/@ukabuer/image-convolution-using-gpu-js)
* [Leaflet + gpu.js canvas](https://observablehq.com/@rveciana/leaflet-gpu-js-canvas)
* [Image to GPU.js](https://observablehq.com/@fil/image-to-gpu)
* [GPU Accelerated Heatmap using gpu.js](https://observablehq.com/@tracyhenry/gpu-accelerated-heatmap-using-gpu-js)
* [Dijkstras algorithm in gpu.js](https://observablehq.com/@fil/dijkstras-algorithm-in-gpu-js)
* [Voronoi with gpu.js](https://observablehq.com/@fil/voronoi-with-gpu-js)
* [The gpu.js loop](https://observablehq.com/@fil/the-gpu-js-loop)
* [GPU.js Example: Mandelbrot Set](https://observablehq.com/@robertleeplummerjr/gpu-js-example-mandelbrot-set)
* [GPU.js Example: Mandelbulb](https://observablehq.com/@robertleeplummerjr/gpu-js-example-mandelbulb)
* [Inverse of the distance with gpu.js](https://observablehq.com/@rveciana/inverse-of-the-distance-with-gpu-js)
* [gpu.js laser detection v2](https://observablehq.com/@robertleeplummerjr/gpu-js-laser-detection-v2)
* [GPU.js Canvas](https://observablehq.com/@hubgit/gpu-js-canvas)
* [Video Convolution using GPU.js](https://observablehq.com/@robertleeplummerjr/video-convolution-using-gpu-js)
* [GPU Rock Paper Scissors](https://observablehq.com/@alexlamb/gpu-rock-paper-scissors)
* [Shaded relief with gpujs and d3js](https://observablehq.com/@rveciana/shaded-relief-with-gpujs-and-d3js/2)
## Installation
On Linux, ensure you have the correct header files installed: `sudo apt install mesa-common-dev libxi-dev` (adjust for your distribution)
@ -437,11 +469,13 @@ const kernel = gpu.createKernel(function(image) {
.setGraphical(true)
.setOutput([100, 100]);
const image = new document.createElement('img');
const image = document.createElement('img');
image.src = 'my/image/source.png';
image.onload = () => {
kernel(image);
// Result: colorful image
document.getElementsByTagName('body')[0].appendChild(kernel.canvas);
};
```
@ -455,13 +489,13 @@ const kernel = gpu.createKernel(function(image) {
.setGraphical(true)
.setOutput([100, 100]);
const image1 = new document.createElement('img');
const image1 = document.createElement('img');
image1.src = 'my/image/source1.png';
image1.onload = onload;
const image2 = new document.createElement('img');
const image2 = document.createElement('img');
image2.src = 'my/image/source2.png';
image2.onload = onload;
const image3 = new document.createElement('img');
const image3 = document.createElement('img');
image3.src = 'my/image/source3.png';
image3.onload = onload;
const totalImages = 3;
@ -471,6 +505,8 @@ function onload() {
if (loadedImages === totalImages) {
kernel([image1, image2, image3]);
// Result: colorful image composed of many images
document.getElementsByTagName('body')[0].appendChild(kernel.canvas);
}
};
```
@ -947,6 +983,75 @@ To assist with mostly unit tests, but perhaps in scenarios outside of GPU.js, th
## Typescript Typings
Typescript is supported! Typings can be found [here](src/index.d.ts)!
For strongly typed kernels:
```ts
import { GPU, IKernelFunctionThis } from './src';
const gpu = new GPU();
function kernelFunction(this: IKernelFunctionThis): number {
return 1 + this.thread.x;
}
const kernelMap = gpu.createKernel<typeof kernelFunction>(kernelFunction)
.setOutput([3,3,3]);
const result = kernelMap();
console.log(result as number[][][]);
```
For strongly typed mapped kernels:
```ts
import { GPU, Texture, IKernelFunctionThis } from './src';
const gpu = new GPU();
function kernelFunction(this: IKernelFunctionThis): [number, number] {
return [1, 1];
}
function subKernel(): [number, number] {
return [1, 1];
}
const kernelMap = gpu.createKernelMap<typeof kernelFunction>({
test: subKernel,
}, kernelFunction)
.setOutput([1])
.setPipeline(true);
const result = kernelMap();
console.log((result.test as Texture).toArray() as [number, number][]);
```
For extending constants:
```ts
import { GPU, IKernelFunctionThis } from './src';
const gpu = new GPU();
interface IConstants {
screen: [number, number];
}
type This = {
constants: IConstants
} & IKernelFunctionThis;
function kernelFunction(this: This): number {
const { screen } = this.constants;
return 1 + screen[0];
}
const kernelMap = gpu.createKernel<typeof kernelFunction>(kernelFunction)
.setOutput([3,3,3])
.setConstants<IConstants>({
screen: [1, 1]
});
const result = kernelMap();
console.log(result as number[][][]);
```
## Destructured Assignments **New in V2!**
Destructured Objects and Arrays work in GPU.js.

View File

@ -4,8 +4,8 @@
*
* GPU Accelerated JavaScript
*
* @version 2.3.0
* @date Tue Nov 26 2019 09:51:10 GMT-0500 (Eastern Standard Time)
* @version 2.3.1
* @date Tue Dec 17 2019 09:39:34 GMT-0500 (Eastern Standard Time)
*
* @license MIT
* The MIT License
@ -13389,7 +13389,7 @@ const utils = {
getVariableType(value, strictIntegers) {
if (utils.isArray(value)) {
if (value[0].nodeName === 'IMG') {
if (value.length > 0 && value[0].nodeName === 'IMG') {
return 'HTMLImageArray';
}
return 'Array';

File diff suppressed because one or more lines are too long

6
dist/gpu-browser.js vendored
View File

@ -4,8 +4,8 @@
*
* GPU Accelerated JavaScript
*
* @version 2.3.0
* @date Tue Nov 26 2019 09:51:10 GMT-0500 (Eastern Standard Time)
* @version 2.3.1
* @date Tue Dec 17 2019 09:39:34 GMT-0500 (Eastern Standard Time)
*
* @license MIT
* The MIT License
@ -17823,7 +17823,7 @@ const utils = {
getVariableType(value, strictIntegers) {
if (utils.isArray(value)) {
if (value[0].nodeName === 'IMG') {
if (value.length > 0 && value[0].nodeName === 'IMG') {
return 'HTMLImageArray';
}
return 'Array';

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
{
"name": "gpu.js",
"version": "2.3.0",
"version": "2.3.1",
"description": "GPU Accelerated JavaScript",
"engines": {
"node": ">=8.0.0"

254
src/index.d.ts vendored
View File

@ -13,9 +13,58 @@ export class GPU {
nativeFunctions: IGPUNativeFunction[];
addFunction(kernel: KernelFunction, settings?: IGPUFunctionSettings): this;
addNativeFunction(name: string, source: string): this;
combineKernels(...kernels: Function[]): KernelFunction;
combineKernels(...kernels: KernelFunction[]): IKernelRunShortcut;
combineKernels<KF extends KernelFunction>(...kernels: KF[]):
((...args: Parameters<KF>) =>
ReturnType<KF>[]
| ReturnType<KF>[][]
| ReturnType<KF>[][][]
| Texture
| void
)
& IKernelRunShortcutBase;
createKernel(kernel: KernelFunction, settings?: IGPUKernelSettings): IKernelRunShortcut;
createKernelMap(subKernels: Object | Array<Function>, rootKernel: Function, settings?: IGPUKernelSettings): IKernelRunShortcut;
createKernel<KF extends KernelFunction>(kernel: KF, settings?: IGPUKernelSettings):
((...args: Parameters<KF>) =>
ReturnType<KF>[]
| ReturnType<KF>[][]
| ReturnType<KF>[][][]
| Texture
| void
)
& IKernelRunShortcutBase;
createKernelMap(
subKernels: {
[targetLocation: string]: KernelFunction
}
| KernelFunction[],
rootKernel: KernelFunction,
settings?: IGPUKernelSettings): ((() => IMappedKernelResult) & IKernelRunShortcut);
// this needs further refined
createKernelMap<KF extends KernelFunction>(
subKernels: {
[targetLocation: string]: KF
}
| KF[],
rootKernel: KF,
settings?: IGPUKernelSettings
):
((...args: Parameters<KF>) => {
result?:
ReturnType<KF>[]
| ReturnType<KF>[][]
| ReturnType<KF>[][][]
| Texture
| void;
[targetLocation: string]:
ReturnType<KF>[]
| ReturnType<KF>[][]
| ReturnType<KF>[][][]
| Texture
| void
}
)
& IKernelRunShortcutBase;
destroy(): void;
Kernel: typeof Kernel;
mode: string;
@ -33,6 +82,11 @@ export interface IGPUNativeFunction extends IGPUFunctionSettings {
settings: object;
}
export interface IMappedKernelResult {
result?: KernelVariable;
[targetLocation: string]: KernelVariable
}
export interface INativeFunctionList {
[functionName: string]: string
}
@ -119,73 +173,11 @@ export abstract class Kernel {
getPixels(flip?: boolean): Uint8ClampedArray[];
prependString(value: string): void;
hasPrependString(value: string): boolean;
constructor(kernel: KernelFunction|IJSON, settings?: IDirectKernelSettings);
constructor(kernel: KernelFunction|IJSON|string, settings?: IDirectKernelSettings);
onRequestSwitchKernel?: Kernel;
build(
arg1?: KernelVariable,
arg2?: KernelVariable,
arg3?: KernelVariable,
arg4?: KernelVariable,
arg5?: KernelVariable,
arg6?: KernelVariable,
arg7?: KernelVariable,
arg8?: KernelVariable,
arg9?: KernelVariable,
arg10?: KernelVariable,
arg11?: KernelVariable,
arg12?: KernelVariable,
arg13?: KernelVariable,
arg14?: KernelVariable,
arg15?: KernelVariable,
arg16?: KernelVariable,
arg17?: KernelVariable,
arg18?: KernelVariable,
arg19?: KernelVariable,
arg20?: KernelVariable): void;
run(
arg1?: KernelVariable,
arg2?: KernelVariable,
arg3?: KernelVariable,
arg4?: KernelVariable,
arg5?: KernelVariable,
arg6?: KernelVariable,
arg7?: KernelVariable,
arg8?: KernelVariable,
arg9?: KernelVariable,
arg10?: KernelVariable,
arg11?: KernelVariable,
arg12?: KernelVariable,
arg13?: KernelVariable,
arg14?: KernelVariable,
arg15?: KernelVariable,
arg16?: KernelVariable,
arg17?: KernelVariable,
arg18?: KernelVariable,
arg19?: KernelVariable,
arg20?: KernelVariable
): KernelVariable;
toString(
arg1?: KernelVariable,
arg2?: KernelVariable,
arg3?: KernelVariable,
arg4?: KernelVariable,
arg5?: KernelVariable,
arg6?: KernelVariable,
arg7?: KernelVariable,
arg8?: KernelVariable,
arg9?: KernelVariable,
arg10?: KernelVariable,
arg11?: KernelVariable,
arg12?: KernelVariable,
arg13?: KernelVariable,
arg14?: KernelVariable,
arg15?: KernelVariable,
arg16?: KernelVariable,
arg17?: KernelVariable,
arg18?: KernelVariable,
arg19?: KernelVariable,
arg20?: KernelVariable
): string;
build(...args: KernelVariable[]): void;
run(...args: KernelVariable[]): KernelVariable;
toString(...args: KernelVariable[]): string;
toJSON(): IJSON;
setOutput(flag: number[]): this;
setWarnVarUsage(flag: boolean): this;
@ -194,7 +186,8 @@ export abstract class Kernel {
setDebug(flag: boolean): this;
setGraphical(flag: boolean): this;
setLoopMaxIterations(flag: number): this;
setConstants(flag: object): this;
setConstants(flag: IConstants): this;
setConstants<T>(flag: T & IConstants): this;
setConstantTypes(flag: IKernelValueTypes): this;
setDynamicOutput(flag: boolean): this;
setDynamicArguments(flag: boolean): this;
@ -332,30 +325,14 @@ export interface ITypesList {
[typeName: string]: GPUVariableType
}
export interface IKernelRunShortcut extends Kernel {
export interface IKernelRunShortcutBase extends Kernel {
kernel: Kernel;
(
arg1?: KernelVariable,
arg2?: KernelVariable,
arg3?: KernelVariable,
arg4?: KernelVariable,
arg5?: KernelVariable,
arg6?: KernelVariable,
arg7?: KernelVariable,
arg8?: KernelVariable,
arg9?: KernelVariable,
arg10?: KernelVariable,
arg11?: KernelVariable,
arg12?: KernelVariable,
arg13?: KernelVariable,
arg14?: KernelVariable,
arg15?: KernelVariable,
arg16?: KernelVariable,
arg17?: KernelVariable,
arg18?: KernelVariable,
arg19?: KernelVariable,
arg20?: KernelVariable
): KernelOutput;
exec(): Promise<KernelOutput>;
}
export interface IKernelRunShortcut extends IKernelRunShortcutBase {
kernel: Kernel;
(...args: KernelVariable[]): KernelOutput;
exec(): Promise<KernelOutput>;
}
@ -388,9 +365,6 @@ export interface IKernelFunctionThis {
export type KernelVariable =
boolean
| number
| number[]
| number[][]
| number[][][]
| Texture
| Input
| HTMLImageElement
@ -398,36 +372,52 @@ export type KernelVariable =
| HTMLImageElement[]
| KernelOutput;
export type ThreadKernelVariable = boolean | number | number[] | number[][] | number[][][];
export type KernelFunction = ((
this: IKernelFunctionThis,
arg1?: ThreadKernelVariable,
arg2?: ThreadKernelVariable,
arg3?: ThreadKernelVariable,
arg4?: ThreadKernelVariable,
arg5?: ThreadKernelVariable,
arg6?: ThreadKernelVariable,
arg7?: ThreadKernelVariable,
arg8?: ThreadKernelVariable,
arg9?: ThreadKernelVariable,
arg10?: ThreadKernelVariable,
arg11?: ThreadKernelVariable,
arg12?: ThreadKernelVariable,
arg13?: ThreadKernelVariable,
arg14?: ThreadKernelVariable,
arg15?: ThreadKernelVariable,
arg16?: ThreadKernelVariable,
arg17?: ThreadKernelVariable,
arg18?: ThreadKernelVariable,
arg19?: ThreadKernelVariable,
arg20?: ThreadKernelVariable,
) => KernelOutput) | object | string;
export type KernelOutput = void
export type ThreadKernelVariable
= boolean
| number
| number[]
| number[][]
| number[][][]
| number[][][][]
| [number, number]
| [number, number][]
| [number, number][][]
| [number, number][][][]
| [number, number, number]
| [number, number, number][]
| [number, number, number][][]
| [number, number, number][][][]
| [number, number, number, number]
| [number, number, number, number][]
| [number, number, number, number][][]
| [number, number, number, number][][][]
;
export type KernelFunction = ((
this: IKernelFunctionThis,
...args: ThreadKernelVariable[]
) => KernelOutput);
export type KernelOutput = void
| number
| number[]
| number[][]
| number[][][]
| [number, number][]
| [number, number, number][]
| [number, number, number, number][]
| [number, number][][]
| [number, number, number][][]
| [number, number, number, number][][]
| [number, number][][][]
| [number, number, number][][][]
| [number, number, number, number][][][]
| Texture;
export interface IFunction {
@ -516,7 +506,23 @@ export class Texture {
kernel: Kernel;
}
export type TextureArrayOutput = number[] | number[][] | number[][][] | number[][][][];
export type TextureArrayOutput
= number[]
| number[][]
| number[][][]
| [number, number][]
| [number, number][][]
| [number, number][][][]
| [number, number, number][]
| [number, number, number][][]
| [number, number, number][][][]
| [number, number, number, number][]
| [number, number, number, number][][]
| [number, number, number, number][][][]
;
export interface IPlugin {
source: string;
@ -538,7 +544,7 @@ export class Input {
export type input = (value: number[], size: OutputDimensions) => Input;
export function alias(name: string, source: KernelFunction):KernelFunction;
export function alias(name: string, source: KernelFunction): KernelFunction;
export class KernelValue {
constructor(value: KernelValue, settings: IKernelValueSettings);