Skip to content

Commit

Permalink
feat(shader-ast-js): add vector pools for all vector ops
Browse files Browse the repository at this point in the history
- add Pool class and impls for [iu]vec2/3/4
- update all vector ops to re-use memory from pools
- add CompileResult interface w/ `__reset()` and `__stats()` methods
- update targetJS() codegens
  • Loading branch information
postspectacular committed Aug 13, 2023
1 parent 2ca2856 commit 31271e7
Show file tree
Hide file tree
Showing 16 changed files with 554 additions and 353 deletions.
3 changes: 3 additions & 0 deletions packages/shader-ast-js/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,9 @@
"./env": {
"default": "./env.js"
},
"./pool": {
"default": "./pool.js"
},
"./runtime": {
"default": "./runtime.js"
},
Expand Down
33 changes: 31 additions & 2 deletions packages/shader-ast-js/src/api.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import type { Fn, Fn2, Fn3, Fn4, Fn5, Fn6 } from "@thi.ng/api";
import type { Fn, Fn0, Fn2, Fn3, Fn4, Fn5, Fn6, Keys } from "@thi.ng/api";
import type { Mat } from "@thi.ng/matrices";
import type { Term } from "@thi.ng/shader-ast";
import type { BVec, Vec } from "@thi.ng/vectors";
import type { Pool } from "./pool.js";

export interface JSTarget extends Fn<Term<any>, string> {
/**
Expand Down Expand Up @@ -32,7 +33,23 @@ export interface JSTarget extends Fn<Term<any>, string> {
* @param tree -
* @param env -
*/
compile(tree: Term<any>, env?: JSEnv): any;
compile(tree: Term<any>, env?: JSEnv): CompileResult;
}

export interface CompileResult {
/**
* Resets all internal vector pools. Will be called automatically if
* compiled tree includes a `main()` function, otherwise **MUST** be called
* manually each time before invoking a compiled entry point function.
*/
__reset: Fn0<void>;
/**
* Returns an object summarizing the number of used objects in each vector
* pool.
*/
__stats: Fn0<Record<Keys<JSEnv["pools"]>, number>>;

[id: string]: any;
}

export interface JSBuiltinsCommon<T> {
Expand Down Expand Up @@ -248,6 +265,18 @@ export interface JSEnv {
samplerCube: JSBuiltinsSampler;
sampler2DShadow: JSBuiltinsSampler;
samplerCubeShadow: JSBuiltinsSampler;

pools: {
vec2: Pool;
vec3: Pool;
vec4: Pool;
ivec2: Pool;
ivec3: Pool;
ivec4: Pool;
uvec2: Pool;
uvec3: Pool;
uvec4: Pool;
};
}

export interface JSTargetOpts {
Expand Down
64 changes: 46 additions & 18 deletions packages/shader-ast-js/src/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { mat22n, mat33n, mat44n } from "@thi.ng/matrices/matn";
import { mat22v, mat33v, mat44v } from "@thi.ng/matrices/matv";
import { ZERO3, ZERO4 } from "@thi.ng/vectors/api";
import { fromBVec2, fromBVec3, fromBVec4 } from "@thi.ng/vectors/convert";
import { setN2, setN3, setN4 } from "@thi.ng/vectors/setn";
import { setVN3, setVN4 } from "@thi.ng/vectors/setvn";
import { setVV4 } from "@thi.ng/vectors/setvv";
import {
Expand Down Expand Up @@ -30,6 +31,21 @@ import { UVEC4 } from "./env/uvec4.js";
import { VEC2 } from "./env/vec2.js";
import { VEC3 } from "./env/vec3.js";
import { VEC4 } from "./env/vec4.js";
import {
POOL_IVEC2,
POOL_IVEC3,
POOL_IVEC4,
POOL_UVEC2,
POOL_UVEC3,
POOL_UVEC4,
POOL_VEC2,
POOL_VEC3,
POOL_VEC4,
} from "./pool.js";

const $2 = POOL_VEC2.next.bind(POOL_VEC2);
const $3 = POOL_VEC3.next.bind(POOL_VEC3);
const $4 = POOL_VEC4.next.bind(POOL_VEC4);

// TODO texture lookups
// all texture fns currently return [0,0,0,0] or 0
Expand All @@ -50,38 +66,38 @@ const SAMPLER_TODO: JSBuiltinsSampler = {
};

export const JS_DEFAULT_ENV: JSEnv = {
vec2: VEC2,
vec2b: (v) => fromBVec2([], v),
vec2: VEC2(POOL_VEC2),
vec2b: (v) => fromBVec2($2(), v),
vec2i: identity,
vec2n: (n) => [n, n],
vec2n: (n) => setN2($2(), n),
vec2u: identity,

vec3: VEC3,
vec3b: (v) => fromBVec3([], v),
vec3: VEC3(POOL_VEC3),
vec3b: (v) => fromBVec3($3(), v),
vec3i: identity,
vec3n: (n) => [n, n, n],
vec3n: (n) => setN3($3(), n),
vec3u: identity,
vec3vn: (a, n) => setVN3([], a, n),
vec3vn: (a, n) => setVN3($3(), a, n),

vec4: VEC4,
vec4b: (v) => fromBVec4([], v),
vec4: VEC4(POOL_VEC4),
vec4b: (v) => fromBVec4($4(), v),
vec4i: identity,
vec4n: (n) => [n, n, n, n],
vec4n: (n) => setN4($4(), n),
vec4u: identity,
vec4vn: (a, n) => setVN4([], a, n),
vec4vnn: (a, z, w) => setVV4([], a, [z, w]),
vec4vv: (a, b) => setVV4([], a, b),
vec4vn: (a, n) => setVN4($4(), a, n),
vec4vnn: (a, z, w) => setVV4($4(), a, [z, w]),
vec4vv: (a, b) => setVV4($4(), a, b),

mat2n: (n) => mat22n([], n),
mat2vv: (a, b) => mat22v([], a, b),
mat2n: (n) => mat22n($4(), n),
mat2vv: (a, b) => mat22v($4(), a, b),
mat3n: (n) => mat33n([], n),
mat3vvv: (a, b, c) => mat33v([], a, b, c),
mat4n: (n) => mat44n([], n),
mat4vvvv: (a, b, c, d) => mat44v([], a, b, c, d),

swizzle2: (a, b, c) => swizzle2([], a, b, c),
swizzle3: (a, b, c, d) => swizzle3([], a, b, c, d),
swizzle4: (a, b, c, d, e) => swizzle4([], a, b, c, d, e),
swizzle2: (a, b, c) => swizzle2($2(), a, b, c),
swizzle3: (a, b, c, d) => swizzle3($3(), a, b, c, d),
swizzle4: (a, b, c, d, e) => swizzle4($4(), a, b, c, d, e),
set_swizzle2: setSwizzle2,
set_swizzle3: setSwizzle3,
set_swizzle4: setSwizzle4,
Expand Down Expand Up @@ -130,4 +146,16 @@ export const JS_DEFAULT_ENV: JSEnv = {
samplerCube: SAMPLER_TODO,
sampler2DShadow: SAMPLER_TODO,
samplerCubeShadow: SAMPLER_TODO,

pools: {
vec2: POOL_VEC2,
vec3: POOL_VEC3,
vec4: POOL_VEC4,
ivec2: POOL_IVEC2,
ivec3: POOL_IVEC3,
ivec4: POOL_IVEC4,
uvec2: POOL_UVEC2,
uvec3: POOL_UVEC3,
uvec4: POOL_UVEC4,
},
};
41 changes: 22 additions & 19 deletions packages/shader-ast-js/src/env/ivec2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,29 +11,32 @@ import { mulI2, mulNI2 } from "@thi.ng/vectors/muli";
import { rshiftI2 } from "@thi.ng/vectors/rshift";
import { subI2, subNI2 } from "@thi.ng/vectors/subi";
import type { JSBuiltinsIntVec } from "../api.js";
import { POOL_IVEC2 } from "../pool.js";
import { VEC2 } from "./vec2.js";

const $ = POOL_IVEC2.next.bind(POOL_IVEC2);

export const IVEC2: JSBuiltinsIntVec = {
...VEC2,
add: (a, b) => addI2([], a, b),
addvn: (a, b) => addNI2([], a, b),
addnv: (a, b) => addNI2([], b, a),
div: (a, b) => divI2([], a, b),
divvn: (a, b) => divNI2([], a, b),
...VEC2(POOL_IVEC2),
add: (a, b) => addI2($(), a, b),
addvn: (a, b) => addNI2($(), a, b),
addnv: (a, b) => addNI2($(), b, a),
div: (a, b) => divI2($(), a, b),
divvn: (a, b) => divNI2($(), a, b),
divnv: (a, b) => divI2(null, [a, a], b),
modi: (a, b) => fmod2([], a, b),
modivn: (a, b) => fmodN2([], a, b),
modi: (a, b) => fmod2($(), a, b),
modivn: (a, b) => fmodN2($(), a, b),
modinv: (a, b) => fmod2(null, [a, a], b),
mul: (a, b) => mulI2([], a, b),
mulvn: (a, b) => mulNI2([], a, b),
mulnv: (a, b) => mulNI2([], b, a),
sub: (a, b) => subI2([], a, b),
subvn: (a, b) => subNI2([], a, b),
mul: (a, b) => mulI2($(), a, b),
mulvn: (a, b) => mulNI2($(), a, b),
mulnv: (a, b) => mulNI2($(), b, a),
sub: (a, b) => subI2($(), a, b),
subvn: (a, b) => subNI2($(), a, b),
subnv: (a, b) => subI2(null, [a, a], b),
bitand: (a, b) => bitAndI2([], a, b),
lshift: (a, b) => lshiftI2([], a, b),
bitnot1: (a) => bitNotI2([], a),
bitor: (a, b) => bitOrI2([], a, b),
rshift: (a, b) => rshiftI2([], a, b),
bitxor: (a, b) => bitXorI2([], a, b),
bitand: (a, b) => bitAndI2($(), a, b),
lshift: (a, b) => lshiftI2($(), a, b),
bitnot1: (a) => bitNotI2($(), a),
bitor: (a, b) => bitOrI2($(), a, b),
rshift: (a, b) => rshiftI2($(), a, b),
bitxor: (a, b) => bitXorI2($(), a, b),
};
41 changes: 22 additions & 19 deletions packages/shader-ast-js/src/env/ivec3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,29 +11,32 @@ import { mulI3, mulNI3 } from "@thi.ng/vectors/muli";
import { rshiftI3 } from "@thi.ng/vectors/rshift";
import { subI3, subNI3 } from "@thi.ng/vectors/subi";
import type { JSBuiltinsIntVec } from "../api.js";
import { POOL_IVEC3 } from "../pool.js";
import { VEC3 } from "./vec3.js";

const $ = POOL_IVEC3.next.bind(POOL_IVEC3);

export const IVEC3: JSBuiltinsIntVec = {
...VEC3,
add: (a, b) => addI3([], a, b),
addvn: (a, b) => addNI3([], a, b),
addnv: (a, b) => addNI3([], b, a),
div: (a, b) => divI3([], a, b),
divvn: (a, b) => divNI3([], a, b),
...VEC3(POOL_IVEC3),
add: (a, b) => addI3($(), a, b),
addvn: (a, b) => addNI3($(), a, b),
addnv: (a, b) => addNI3($(), b, a),
div: (a, b) => divI3($(), a, b),
divvn: (a, b) => divNI3($(), a, b),
divnv: (a, b) => divI3(null, [a, a, a], b),
modi: (a, b) => fmod3([], a, b),
modivn: (a, b) => fmodN3([], a, b),
modi: (a, b) => fmod3($(), a, b),
modivn: (a, b) => fmodN3($(), a, b),
modinv: (a, b) => fmod3(null, [a, a, a], b),
mul: (a, b) => mulI3([], a, b),
mulvn: (a, b) => mulNI3([], a, b),
mulnv: (a, b) => mulNI3([], b, a),
sub: (a, b) => subI3([], a, b),
subvn: (a, b) => subNI3([], a, b),
mul: (a, b) => mulI3($(), a, b),
mulvn: (a, b) => mulNI3($(), a, b),
mulnv: (a, b) => mulNI3($(), b, a),
sub: (a, b) => subI3($(), a, b),
subvn: (a, b) => subNI3($(), a, b),
subnv: (a, b) => subI3(null, [a, a, a], b),
bitand: (a, b) => bitAndI3([], a, b),
lshift: (a, b) => lshiftI3([], a, b),
bitnot1: (a) => bitNotI3([], a),
bitor: (a, b) => bitOrI3([], a, b),
rshift: (a, b) => rshiftI3([], a, b),
bitxor: (a, b) => bitXorI3([], a, b),
bitand: (a, b) => bitAndI3($(), a, b),
lshift: (a, b) => lshiftI3($(), a, b),
bitnot1: (a) => bitNotI3($(), a),
bitor: (a, b) => bitOrI3($(), a, b),
rshift: (a, b) => rshiftI3($(), a, b),
bitxor: (a, b) => bitXorI3($(), a, b),
};
41 changes: 22 additions & 19 deletions packages/shader-ast-js/src/env/ivec4.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,29 +11,32 @@ import { mulI4, mulNI4 } from "@thi.ng/vectors/muli";
import { rshiftI4 } from "@thi.ng/vectors/rshift";
import { subI4, subNI4 } from "@thi.ng/vectors/subi";
import type { JSBuiltinsIntVec } from "../api.js";
import { POOL_IVEC4 } from "../pool.js";
import { VEC4 } from "./vec4.js";

const $ = POOL_IVEC4.next.bind(POOL_IVEC4);

export const IVEC4: JSBuiltinsIntVec = {
...VEC4,
add: (a, b) => addI4([], a, b),
addvn: (a, b) => addNI4([], a, b),
addnv: (a, b) => addNI4([], b, a),
div: (a, b) => divI4([], a, b),
divvn: (a, b) => divNI4([], a, b),
...VEC4(POOL_IVEC4),
add: (a, b) => addI4($(), a, b),
addvn: (a, b) => addNI4($(), a, b),
addnv: (a, b) => addNI4($(), b, a),
div: (a, b) => divI4($(), a, b),
divvn: (a, b) => divNI4($(), a, b),
divnv: (a, b) => divI4(null, [a, a, a, a], b),
modi: (a, b) => fmod4([], a, b),
modivn: (a, b) => fmodN4([], a, b),
modi: (a, b) => fmod4($(), a, b),
modivn: (a, b) => fmodN4($(), a, b),
modinv: (a, b) => fmod4(null, [a, a, a, a], b),
mul: (a, b) => mulI4([], a, b),
mulvn: (a, b) => mulNI4([], a, b),
mulnv: (a, b) => mulNI4([], b, a),
sub: (a, b) => subI4([], a, b),
subvn: (a, b) => subNI4([], a, b),
mul: (a, b) => mulI4($(), a, b),
mulvn: (a, b) => mulNI4($(), a, b),
mulnv: (a, b) => mulNI4($(), b, a),
sub: (a, b) => subI4($(), a, b),
subvn: (a, b) => subNI4($(), a, b),
subnv: (a, b) => subI4(null, [a, a, a, a], b),
bitand: (a, b) => bitAndI4([], a, b),
lshift: (a, b) => lshiftI4([], a, b),
bitnot1: (a) => bitNotI4([], a),
bitor: (a, b) => bitOrI4([], a, b),
rshift: (a, b) => rshiftI4([], a, b),
bitxor: (a, b) => bitXorI4([], a, b),
bitand: (a, b) => bitAndI4($(), a, b),
lshift: (a, b) => lshiftI4($(), a, b),
bitnot1: (a) => bitNotI4($(), a),
bitor: (a, b) => bitOrI4($(), a, b),
rshift: (a, b) => rshiftI4($(), a, b),
bitxor: (a, b) => bitXorI4($(), a, b),
};
35 changes: 19 additions & 16 deletions packages/shader-ast-js/src/env/mat2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,28 @@ import { sub22 } from "@thi.ng/matrices/sub";
import { subN22 } from "@thi.ng/matrices/subn";
import { neg } from "@thi.ng/vectors/neg";
import type { JSBuiltinsMat } from "../api.js";
import { POOL_VEC4 } from "../pool.js";

const $ = POOL_VEC4.next.bind(POOL_VEC4);

export const MAT2: JSBuiltinsMat = {
add: (a, b) => add22([], a, b),
addnv: (a, b) => addN22([], b, a),
addvn: (a, b) => addN22([], a, b),
dec: (a) => subN22([], a, 1),
div: (a, b) => div22([], a, b),
add: (a, b) => add22($(), a, b),
addnv: (a, b) => addN22($(), b, a),
addvn: (a, b) => addN22($(), a, b),
dec: (a) => subN22($(), a, 1),
div: (a, b) => div22($(), a, b),
divnv: (a, b) => div22(null, [a, a, a, a], b),
divvn: (a, b) => divN22([], a, b),
divvn: (a, b) => divN22($(), a, b),
idx: (a, b) => [a[b * 2], a[b * 2 + 1]],
inc: (a) => addN22([], a, 1),
mul: (a, b) => mul22([], a, b),
mulm: (a, b) => mulM22([], a, b),
mulmv: (a, b) => mulV22([], a, b),
mulnv: (a, b) => mulN22([], b, a),
mulvm: (a, b) => mulVM22([], a, b),
mulvn: (a, b) => mulN22([], a, b),
sub: (a, b) => sub22([], a, b),
sub1: (a) => neg([], a),
inc: (a) => addN22($(), a, 1),
mul: (a, b) => mul22($(), a, b),
mulm: (a, b) => mulM22($(), a, b),
mulmv: (a, b) => mulV22($(), a, b),
mulnv: (a, b) => mulN22($(), b, a),
mulvm: (a, b) => mulVM22($(), a, b),
mulvn: (a, b) => mulN22($(), a, b),
sub: (a, b) => sub22($(), a, b),
sub1: (a) => neg($(), a),
subnv: (a, b) => sub22(null, [a, a, a, a], b),
subvn: (a, b) => subN22([], a, b),
subvn: (a, b) => subN22($(), a, b),
};
Loading

0 comments on commit 31271e7

Please sign in to comment.