@nodetool-ai/gpu 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/blend/blendModes.d.ts +67 -0
- package/dist/blend/blendModes.d.ts.map +1 -0
- package/dist/blend/blendModes.js +80 -0
- package/dist/blend/blendModes.js.map +1 -0
- package/dist/blend/index.d.ts +10 -0
- package/dist/blend/index.d.ts.map +1 -0
- package/dist/blend/index.js +10 -0
- package/dist/blend/index.js.map +1 -0
- package/dist/blend/wgsl.d.ts +16 -0
- package/dist/blend/wgsl.d.ts.map +1 -0
- package/dist/blend/wgsl.js +85 -0
- package/dist/blend/wgsl.js.map +1 -0
- package/dist/compositor/compositor.d.ts +112 -0
- package/dist/compositor/compositor.d.ts.map +1 -0
- package/dist/compositor/compositor.js +353 -0
- package/dist/compositor/compositor.js.map +1 -0
- package/dist/compositor/headless.d.ts +47 -0
- package/dist/compositor/headless.d.ts.map +1 -0
- package/dist/compositor/headless.js +158 -0
- package/dist/compositor/headless.js.map +1 -0
- package/dist/compositor/index.d.ts +8 -0
- package/dist/compositor/index.d.ts.map +1 -0
- package/dist/compositor/index.js +8 -0
- package/dist/compositor/index.js.map +1 -0
- package/dist/compositor/shaders.d.ts +24 -0
- package/dist/compositor/shaders.d.ts.map +1 -0
- package/dist/compositor/shaders.js +241 -0
- package/dist/compositor/shaders.js.map +1 -0
- package/dist/compositor/transform.d.ts +49 -0
- package/dist/compositor/transform.d.ts.map +1 -0
- package/dist/compositor/transform.js +74 -0
- package/dist/compositor/transform.js.map +1 -0
- package/dist/context.d.ts +108 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +205 -0
- package/dist/context.js.map +1 -0
- package/dist/debug/premulValidator.d.ts +85 -0
- package/dist/debug/premulValidator.d.ts.map +1 -0
- package/dist/debug/premulValidator.js +239 -0
- package/dist/debug/premulValidator.js.map +1 -0
- package/dist/executor.d.ts +74 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +413 -0
- package/dist/executor.js.map +1 -0
- package/dist/fullscreenQuad.d.ts +11 -0
- package/dist/fullscreenQuad.d.ts.map +1 -0
- package/dist/fullscreenQuad.js +31 -0
- package/dist/fullscreenQuad.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/module.d.ts +162 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +100 -0
- package/dist/module.js.map +1 -0
- package/dist/node.d.ts +38 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +140 -0
- package/dist/node.js.map +1 -0
- package/dist/pool.d.ts +30 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +33 -0
- package/dist/pool.js.map +1 -0
- package/dist/recipe.d.ts +148 -0
- package/dist/recipe.d.ts.map +1 -0
- package/dist/recipe.js +181 -0
- package/dist/recipe.js.map +1 -0
- package/dist/registry.d.ts +49 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +100 -0
- package/dist/registry.js.map +1 -0
- package/dist/shaders/_canary/passthrough/v1/module.d.ts +13 -0
- package/dist/shaders/_canary/passthrough/v1/module.d.ts.map +1 -0
- package/dist/shaders/_canary/passthrough/v1/module.js +71 -0
- package/dist/shaders/_canary/passthrough/v1/module.js.map +1 -0
- package/dist/shaders/alpha/premulToStraight/v1/module.d.ts +16 -0
- package/dist/shaders/alpha/premulToStraight/v1/module.d.ts.map +1 -0
- package/dist/shaders/alpha/premulToStraight/v1/module.js +62 -0
- package/dist/shaders/alpha/premulToStraight/v1/module.js.map +1 -0
- package/dist/shaders/alpha/straightToPremul/v1/module.d.ts +19 -0
- package/dist/shaders/alpha/straightToPremul/v1/module.d.ts.map +1 -0
- package/dist/shaders/alpha/straightToPremul/v1/module.js +61 -0
- package/dist/shaders/alpha/straightToPremul/v1/module.js.map +1 -0
- package/dist/shaders/color/brightnessContrast/v1/module.d.ts +17 -0
- package/dist/shaders/color/brightnessContrast/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/brightnessContrast/v1/module.js +84 -0
- package/dist/shaders/color/brightnessContrast/v1/module.js.map +1 -0
- package/dist/shaders/color/cdl/v1/module.d.ts +35 -0
- package/dist/shaders/color/cdl/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/cdl/v1/module.js +106 -0
- package/dist/shaders/color/cdl/v1/module.js.map +1 -0
- package/dist/shaders/color/channelMerge/v1/module.d.ts +22 -0
- package/dist/shaders/color/channelMerge/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/channelMerge/v1/module.js +101 -0
- package/dist/shaders/color/channelMerge/v1/module.js.map +1 -0
- package/dist/shaders/color/channelShuffle/v1/module.d.ts +29 -0
- package/dist/shaders/color/channelShuffle/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/channelShuffle/v1/module.js +94 -0
- package/dist/shaders/color/channelShuffle/v1/module.js.map +1 -0
- package/dist/shaders/color/channelSplit/v1/module.d.ts +18 -0
- package/dist/shaders/color/channelSplit/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/channelSplit/v1/module.js +90 -0
- package/dist/shaders/color/channelSplit/v1/module.js.map +1 -0
- package/dist/shaders/color/colorBalance/v1/module.d.ts +18 -0
- package/dist/shaders/color/colorBalance/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/colorBalance/v1/module.js +86 -0
- package/dist/shaders/color/colorBalance/v1/module.js.map +1 -0
- package/dist/shaders/color/cubeLut/v1/module.d.ts +14 -0
- package/dist/shaders/color/cubeLut/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/cubeLut/v1/module.js +78 -0
- package/dist/shaders/color/cubeLut/v1/module.js.map +1 -0
- package/dist/shaders/color/curves/v1/module.d.ts +31 -0
- package/dist/shaders/color/curves/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/curves/v1/module.js +102 -0
- package/dist/shaders/color/curves/v1/module.js.map +1 -0
- package/dist/shaders/color/exposure/v1/module.d.ts +15 -0
- package/dist/shaders/color/exposure/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/exposure/v1/module.js +78 -0
- package/dist/shaders/color/exposure/v1/module.js.map +1 -0
- package/dist/shaders/color/exposureTone/v1/module.d.ts +28 -0
- package/dist/shaders/color/exposureTone/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/exposureTone/v1/module.js +107 -0
- package/dist/shaders/color/exposureTone/v1/module.js.map +1 -0
- package/dist/shaders/color/filmLook/v1/module.d.ts +28 -0
- package/dist/shaders/color/filmLook/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/filmLook/v1/module.js +103 -0
- package/dist/shaders/color/filmLook/v1/module.js.map +1 -0
- package/dist/shaders/color/grade/v1/module.d.ts +35 -0
- package/dist/shaders/color/grade/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/grade/v1/module.js +182 -0
- package/dist/shaders/color/grade/v1/module.js.map +1 -0
- package/dist/shaders/color/grayscale/v1/module.d.ts +14 -0
- package/dist/shaders/color/grayscale/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/grayscale/v1/module.js +79 -0
- package/dist/shaders/color/grayscale/v1/module.js.map +1 -0
- package/dist/shaders/color/hsb/v1/module.d.ts +20 -0
- package/dist/shaders/color/hsb/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/hsb/v1/module.js +131 -0
- package/dist/shaders/color/hsb/v1/module.js.map +1 -0
- package/dist/shaders/color/hslAdjust/v1/module.d.ts +30 -0
- package/dist/shaders/color/hslAdjust/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/hslAdjust/v1/module.js +170 -0
- package/dist/shaders/color/hslAdjust/v1/module.js.map +1 -0
- package/dist/shaders/color/invert/v1/module.d.ts +15 -0
- package/dist/shaders/color/invert/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/invert/v1/module.js +85 -0
- package/dist/shaders/color/invert/v1/module.js.map +1 -0
- package/dist/shaders/color/levels/v1/module.d.ts +33 -0
- package/dist/shaders/color/levels/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/levels/v1/module.js +116 -0
- package/dist/shaders/color/levels/v1/module.js.map +1 -0
- package/dist/shaders/color/liftGammaGain/v1/module.d.ts +40 -0
- package/dist/shaders/color/liftGammaGain/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/liftGammaGain/v1/module.js +114 -0
- package/dist/shaders/color/liftGammaGain/v1/module.js.map +1 -0
- package/dist/shaders/color/posterize/v1/module.d.ts +16 -0
- package/dist/shaders/color/posterize/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/posterize/v1/module.js +80 -0
- package/dist/shaders/color/posterize/v1/module.js.map +1 -0
- package/dist/shaders/color/solarize/v1/module.d.ts +15 -0
- package/dist/shaders/color/solarize/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/solarize/v1/module.js +83 -0
- package/dist/shaders/color/solarize/v1/module.js.map +1 -0
- package/dist/shaders/color/splitToning/v1/module.d.ts +26 -0
- package/dist/shaders/color/splitToning/v1/module.d.ts.map +1 -0
- package/dist/shaders/color/splitToning/v1/module.js +95 -0
- package/dist/shaders/color/splitToning/v1/module.js.map +1 -0
- package/dist/shaders/filters/blur/gaussian/v1/module.d.ts +23 -0
- package/dist/shaders/filters/blur/gaussian/v1/module.d.ts.map +1 -0
- package/dist/shaders/filters/blur/gaussian/v1/module.js +110 -0
- package/dist/shaders/filters/blur/gaussian/v1/module.js.map +1 -0
- package/dist/shaders/filters/blur/separable/v1/module.d.ts +18 -0
- package/dist/shaders/filters/blur/separable/v1/module.d.ts.map +1 -0
- package/dist/shaders/filters/blur/separable/v1/module.js +64 -0
- package/dist/shaders/filters/blur/separable/v1/module.js.map +1 -0
- package/dist/shaders/filters/convolve3x3/v1/module.d.ts +23 -0
- package/dist/shaders/filters/convolve3x3/v1/module.d.ts.map +1 -0
- package/dist/shaders/filters/convolve3x3/v1/module.js +128 -0
- package/dist/shaders/filters/convolve3x3/v1/module.js.map +1 -0
- package/dist/shaders/filters/glow/v1/module.d.ts +26 -0
- package/dist/shaders/filters/glow/v1/module.d.ts.map +1 -0
- package/dist/shaders/filters/glow/v1/module.js +102 -0
- package/dist/shaders/filters/glow/v1/module.js.map +1 -0
- package/dist/shaders/filters/grain/v1/module.d.ts +38 -0
- package/dist/shaders/filters/grain/v1/module.d.ts.map +1 -0
- package/dist/shaders/filters/grain/v1/module.js +110 -0
- package/dist/shaders/filters/grain/v1/module.js.map +1 -0
- package/dist/shaders/filters/pixelate/v1/module.d.ts +14 -0
- package/dist/shaders/filters/pixelate/v1/module.d.ts.map +1 -0
- package/dist/shaders/filters/pixelate/v1/module.js +76 -0
- package/dist/shaders/filters/pixelate/v1/module.js.map +1 -0
- package/dist/shaders/filters/sharpen/unsharpMask/v1/module.d.ts +17 -0
- package/dist/shaders/filters/sharpen/unsharpMask/v1/module.d.ts.map +1 -0
- package/dist/shaders/filters/sharpen/unsharpMask/v1/module.js +93 -0
- package/dist/shaders/filters/sharpen/unsharpMask/v1/module.js.map +1 -0
- package/dist/shaders/filters/threshold/v1/module.d.ts +17 -0
- package/dist/shaders/filters/threshold/v1/module.d.ts.map +1 -0
- package/dist/shaders/filters/threshold/v1/module.js +71 -0
- package/dist/shaders/filters/threshold/v1/module.js.map +1 -0
- package/dist/shaders/filters/vignette/v1/module.d.ts +18 -0
- package/dist/shaders/filters/vignette/v1/module.d.ts.map +1 -0
- package/dist/shaders/filters/vignette/v1/module.js +78 -0
- package/dist/shaders/filters/vignette/v1/module.js.map +1 -0
- package/dist/shaders/filters/visualFx/v1/module.d.ts +24 -0
- package/dist/shaders/filters/visualFx/v1/module.d.ts.map +1 -0
- package/dist/shaders/filters/visualFx/v1/module.js +210 -0
- package/dist/shaders/filters/visualFx/v1/module.js.map +1 -0
- package/dist/shaders/index.d.ts +86 -0
- package/dist/shaders/index.d.ts.map +1 -0
- package/dist/shaders/index.js +161 -0
- package/dist/shaders/index.js.map +1 -0
- package/dist/shaders/keyer/chromaKey/v1/module.d.ts +25 -0
- package/dist/shaders/keyer/chromaKey/v1/module.d.ts.map +1 -0
- package/dist/shaders/keyer/chromaKey/v1/module.js +111 -0
- package/dist/shaders/keyer/chromaKey/v1/module.js.map +1 -0
- package/dist/shaders/keyer/lumaKey/v1/module.d.ts +22 -0
- package/dist/shaders/keyer/lumaKey/v1/module.d.ts.map +1 -0
- package/dist/shaders/keyer/lumaKey/v1/module.js +89 -0
- package/dist/shaders/keyer/lumaKey/v1/module.js.map +1 -0
- package/dist/shaders/mask/apply/v1/module.d.ts +16 -0
- package/dist/shaders/mask/apply/v1/module.d.ts.map +1 -0
- package/dist/shaders/mask/apply/v1/module.js +79 -0
- package/dist/shaders/mask/apply/v1/module.js.map +1 -0
- package/dist/shaders/mask/fromImage/v1/module.d.ts +18 -0
- package/dist/shaders/mask/fromImage/v1/module.d.ts.map +1 -0
- package/dist/shaders/mask/fromImage/v1/module.js +99 -0
- package/dist/shaders/mask/fromImage/v1/module.js.map +1 -0
- package/dist/shaders/mask/invert/v1/module.d.ts +12 -0
- package/dist/shaders/mask/invert/v1/module.d.ts.map +1 -0
- package/dist/shaders/mask/invert/v1/module.js +57 -0
- package/dist/shaders/mask/invert/v1/module.js.map +1 -0
- package/dist/shaders/mixer/add/v1/module.d.ts +17 -0
- package/dist/shaders/mixer/add/v1/module.d.ts.map +1 -0
- package/dist/shaders/mixer/add/v1/module.js +73 -0
- package/dist/shaders/mixer/add/v1/module.js.map +1 -0
- package/dist/shaders/mixer/colorOverlay/v1/module.d.ts +26 -0
- package/dist/shaders/mixer/colorOverlay/v1/module.d.ts.map +1 -0
- package/dist/shaders/mixer/colorOverlay/v1/module.js +81 -0
- package/dist/shaders/mixer/colorOverlay/v1/module.js.map +1 -0
- package/dist/shaders/mixer/dropShadow/v1/module.d.ts +28 -0
- package/dist/shaders/mixer/dropShadow/v1/module.d.ts.map +1 -0
- package/dist/shaders/mixer/dropShadow/v1/module.js +104 -0
- package/dist/shaders/mixer/dropShadow/v1/module.js.map +1 -0
- package/dist/shaders/mixer/outline/v1/module.d.ts +27 -0
- package/dist/shaders/mixer/outline/v1/module.d.ts.map +1 -0
- package/dist/shaders/mixer/outline/v1/module.js +105 -0
- package/dist/shaders/mixer/outline/v1/module.js.map +1 -0
- package/dist/shaders/mixer/over/v1/module.d.ts +16 -0
- package/dist/shaders/mixer/over/v1/module.d.ts.map +1 -0
- package/dist/shaders/mixer/over/v1/module.js +71 -0
- package/dist/shaders/mixer/over/v1/module.js.map +1 -0
- package/dist/shaders/mixer/shadowCompose/v1/module.d.ts +26 -0
- package/dist/shaders/mixer/shadowCompose/v1/module.d.ts.map +1 -0
- package/dist/shaders/mixer/shadowCompose/v1/module.js +95 -0
- package/dist/shaders/mixer/shadowCompose/v1/module.js.map +1 -0
- package/dist/shaders/sources/angularGradient/v1/module.d.ts +18 -0
- package/dist/shaders/sources/angularGradient/v1/module.d.ts.map +1 -0
- package/dist/shaders/sources/angularGradient/v1/module.js +67 -0
- package/dist/shaders/sources/angularGradient/v1/module.js.map +1 -0
- package/dist/shaders/sources/checkerboard/v1/module.d.ts +19 -0
- package/dist/shaders/sources/checkerboard/v1/module.d.ts.map +1 -0
- package/dist/shaders/sources/checkerboard/v1/module.js +70 -0
- package/dist/shaders/sources/checkerboard/v1/module.js.map +1 -0
- package/dist/shaders/sources/diamondGradient/v1/module.d.ts +18 -0
- package/dist/shaders/sources/diamondGradient/v1/module.d.ts.map +1 -0
- package/dist/shaders/sources/diamondGradient/v1/module.js +61 -0
- package/dist/shaders/sources/diamondGradient/v1/module.js.map +1 -0
- package/dist/shaders/sources/gaussianNoise/v1/module.d.ts +21 -0
- package/dist/shaders/sources/gaussianNoise/v1/module.d.ts.map +1 -0
- package/dist/shaders/sources/gaussianNoise/v1/module.js +72 -0
- package/dist/shaders/sources/gaussianNoise/v1/module.js.map +1 -0
- package/dist/shaders/sources/linearGradient/v1/module.d.ts +21 -0
- package/dist/shaders/sources/linearGradient/v1/module.d.ts.map +1 -0
- package/dist/shaders/sources/linearGradient/v1/module.js +72 -0
- package/dist/shaders/sources/linearGradient/v1/module.js.map +1 -0
- package/dist/shaders/sources/radialGradient/v1/module.d.ts +18 -0
- package/dist/shaders/sources/radialGradient/v1/module.d.ts.map +1 -0
- package/dist/shaders/sources/radialGradient/v1/module.js +60 -0
- package/dist/shaders/sources/radialGradient/v1/module.js.map +1 -0
- package/dist/shaders/sources/solid/v1/module.d.ts +17 -0
- package/dist/shaders/sources/solid/v1/module.d.ts.map +1 -0
- package/dist/shaders/sources/solid/v1/module.js +49 -0
- package/dist/shaders/sources/solid/v1/module.js.map +1 -0
- package/dist/shaders/transform/affine/v1/module.d.ts +36 -0
- package/dist/shaders/transform/affine/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/affine/v1/module.js +94 -0
- package/dist/shaders/transform/affine/v1/module.js.map +1 -0
- package/dist/shaders/transform/cornerPin/v1/module.d.ts +40 -0
- package/dist/shaders/transform/cornerPin/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/cornerPin/v1/module.js +109 -0
- package/dist/shaders/transform/cornerPin/v1/module.js.map +1 -0
- package/dist/shaders/transform/crop/v1/module.d.ts +26 -0
- package/dist/shaders/transform/crop/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/crop/v1/module.js +82 -0
- package/dist/shaders/transform/crop/v1/module.js.map +1 -0
- package/dist/shaders/transform/displace/v1/module.d.ts +23 -0
- package/dist/shaders/transform/displace/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/displace/v1/module.js +95 -0
- package/dist/shaders/transform/displace/v1/module.js.map +1 -0
- package/dist/shaders/transform/mirror/v1/module.d.ts +14 -0
- package/dist/shaders/transform/mirror/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/mirror/v1/module.js +73 -0
- package/dist/shaders/transform/mirror/v1/module.js.map +1 -0
- package/dist/shaders/transform/offset/v1/module.d.ts +21 -0
- package/dist/shaders/transform/offset/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/offset/v1/module.js +88 -0
- package/dist/shaders/transform/offset/v1/module.js.map +1 -0
- package/dist/shaders/transform/pad/v1/module.d.ts +26 -0
- package/dist/shaders/transform/pad/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/pad/v1/module.js +95 -0
- package/dist/shaders/transform/pad/v1/module.js.map +1 -0
- package/dist/shaders/transform/polarRemap/v1/module.d.ts +20 -0
- package/dist/shaders/transform/polarRemap/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/polarRemap/v1/module.js +95 -0
- package/dist/shaders/transform/polarRemap/v1/module.js.map +1 -0
- package/dist/shaders/transform/resize/v1/module.d.ts +20 -0
- package/dist/shaders/transform/resize/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/resize/v1/module.js +116 -0
- package/dist/shaders/transform/resize/v1/module.js.map +1 -0
- package/dist/shaders/transform/rotate90/v1/module.d.ts +25 -0
- package/dist/shaders/transform/rotate90/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/rotate90/v1/module.js +90 -0
- package/dist/shaders/transform/rotate90/v1/module.js.map +1 -0
- package/dist/shaders/transform/spherize/v1/module.d.ts +21 -0
- package/dist/shaders/transform/spherize/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/spherize/v1/module.js +94 -0
- package/dist/shaders/transform/spherize/v1/module.js.map +1 -0
- package/dist/shaders/transform/tile/v1/module.d.ts +22 -0
- package/dist/shaders/transform/tile/v1/module.d.ts.map +1 -0
- package/dist/shaders/transform/tile/v1/module.js +89 -0
- package/dist/shaders/transform/tile/v1/module.js.map +1 -0
- package/dist/shared/lumaWgsl.d.ts +14 -0
- package/dist/shared/lumaWgsl.d.ts.map +1 -0
- package/dist/shared/lumaWgsl.js +18 -0
- package/dist/shared/lumaWgsl.js.map +1 -0
- package/dist/shared/premulWgsl.d.ts +46 -0
- package/dist/shared/premulWgsl.d.ts.map +1 -0
- package/dist/shared/premulWgsl.js +90 -0
- package/dist/shared/premulWgsl.js.map +1 -0
- package/dist/texture.d.ts +54 -0
- package/dist/texture.d.ts.map +1 -0
- package/dist/texture.js +70 -0
- package/dist/texture.js.map +1 -0
- package/dist/types.d.ts +103 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/validate/wgslLinearity.d.ts +86 -0
- package/dist/validate/wgslLinearity.d.ts.map +1 -0
- package/dist/validate/wgslLinearity.js +298 -0
- package/dist/validate/wgslLinearity.js.map +1 -0
- package/dist/webgpu/index.d.ts +11 -0
- package/dist/webgpu/index.d.ts.map +1 -0
- package/dist/webgpu/index.js +11 -0
- package/dist/webgpu/index.js.map +1 -0
- package/package.json +85 -0
package/dist/context.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `GPUContext` — the host-portability adapter.
|
|
3
|
+
*
|
|
4
|
+
* Holds a TypeGPU `root` (from `tgpu.initFromDevice({ device })`) plus the
|
|
5
|
+
* per-host services the Executor leans on: a pipeline cache, a scratch
|
|
6
|
+
* texture pool, and a capability record. The same `ShaderModule` code runs
|
|
7
|
+
* against a browser `navigator.gpu` device, an Electron device, or a
|
|
8
|
+
* Node.js Dawn device — only the adapter that builds this object differs.
|
|
9
|
+
*/
|
|
10
|
+
import tgpu from "typegpu";
|
|
11
|
+
import { createLabeledTexture } from "./texture.js";
|
|
12
|
+
/** Round a dimension up to the allocation bucket (multiple of 64, pow2 ≥ 256). */
|
|
13
|
+
export function ceilToBucket(value) {
|
|
14
|
+
const v = Math.max(1, Math.floor(value));
|
|
15
|
+
if (v <= 256) {
|
|
16
|
+
return Math.ceil(v / 64) * 64;
|
|
17
|
+
}
|
|
18
|
+
let pow = 256;
|
|
19
|
+
while (pow < v) {
|
|
20
|
+
pow *= 2;
|
|
21
|
+
}
|
|
22
|
+
return pow;
|
|
23
|
+
}
|
|
24
|
+
function makePipelineCache() {
|
|
25
|
+
const cache = new Map();
|
|
26
|
+
return {
|
|
27
|
+
get: (key) => cache.get(key),
|
|
28
|
+
set: (key, pipeline) => {
|
|
29
|
+
cache.set(key, pipeline);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Bucket key per scratch texture, for routing `release` back to its pool. */
|
|
34
|
+
const poolKeys = new WeakMap();
|
|
35
|
+
/**
|
|
36
|
+
* Bucketed, refcounted scratch pool. Buckets on
|
|
37
|
+
* `(format, usage, bucketW, bucketH)`; the caller sees only the requested
|
|
38
|
+
* viewport, the underlying texture may be larger.
|
|
39
|
+
*/
|
|
40
|
+
export function makeScratchPool(device) {
|
|
41
|
+
const free = new Map();
|
|
42
|
+
const live = new Set();
|
|
43
|
+
const dimsFor = (spec) => spec.exact
|
|
44
|
+
? {
|
|
45
|
+
width: Math.max(1, Math.floor(spec.width)),
|
|
46
|
+
height: Math.max(1, Math.floor(spec.height))
|
|
47
|
+
}
|
|
48
|
+
: { width: ceilToBucket(spec.width), height: ceilToBucket(spec.height) };
|
|
49
|
+
// Reuse keys on the *resolved* dimensions, so an exact 64×64 and a
|
|
50
|
+
// bucketed-to-64 request share a pool entry — a 64×64 texture is a 64×64
|
|
51
|
+
// texture regardless of how it was requested.
|
|
52
|
+
const bucketKey = (spec) => {
|
|
53
|
+
const { width, height } = dimsFor(spec);
|
|
54
|
+
return `${spec.format}:${spec.usage}:${width}x${height}`;
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
acquire(spec) {
|
|
58
|
+
const key = bucketKey(spec);
|
|
59
|
+
const pooled = free.get(key);
|
|
60
|
+
const reused = pooled?.pop();
|
|
61
|
+
if (reused) {
|
|
62
|
+
live.add(reused);
|
|
63
|
+
return reused;
|
|
64
|
+
}
|
|
65
|
+
const dims = dimsFor(spec);
|
|
66
|
+
const texture = createLabeledTexture(device, {
|
|
67
|
+
width: dims.width,
|
|
68
|
+
height: dims.height,
|
|
69
|
+
format: spec.format,
|
|
70
|
+
usage: spec.usage,
|
|
71
|
+
label: spec.label ?? `scratch-${key}`,
|
|
72
|
+
meta: spec.meta
|
|
73
|
+
});
|
|
74
|
+
poolKeys.set(texture, key);
|
|
75
|
+
live.add(texture);
|
|
76
|
+
return texture;
|
|
77
|
+
},
|
|
78
|
+
release(texture) {
|
|
79
|
+
if (!live.delete(texture)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const key = poolKeys.get(texture);
|
|
83
|
+
if (!key) {
|
|
84
|
+
texture.destroy();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const pooled = free.get(key);
|
|
88
|
+
if (pooled) {
|
|
89
|
+
pooled.push(texture);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
free.set(key, [texture]);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
dispose() {
|
|
96
|
+
for (const texture of live) {
|
|
97
|
+
texture.destroy();
|
|
98
|
+
}
|
|
99
|
+
live.clear();
|
|
100
|
+
for (const pooled of free.values()) {
|
|
101
|
+
for (const texture of pooled) {
|
|
102
|
+
texture.destroy();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
free.clear();
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Pool of uniform buffers, sized to the largest submission seen. */
|
|
110
|
+
export function makeUniformRing(device) {
|
|
111
|
+
const buffers = [];
|
|
112
|
+
let index = 0;
|
|
113
|
+
return {
|
|
114
|
+
beginSubmission() {
|
|
115
|
+
index = 0;
|
|
116
|
+
},
|
|
117
|
+
acquire(size) {
|
|
118
|
+
const slot = index++;
|
|
119
|
+
const wanted = Math.max(16, size);
|
|
120
|
+
let buffer = buffers[slot];
|
|
121
|
+
if (!buffer || buffer.size < wanted) {
|
|
122
|
+
buffer?.destroy();
|
|
123
|
+
buffer = device.createBuffer({
|
|
124
|
+
label: `uniform-ring-${slot}`,
|
|
125
|
+
size: wanted,
|
|
126
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
|
|
127
|
+
});
|
|
128
|
+
buffers[slot] = buffer;
|
|
129
|
+
}
|
|
130
|
+
return buffer;
|
|
131
|
+
},
|
|
132
|
+
dispose() {
|
|
133
|
+
for (const buffer of buffers) {
|
|
134
|
+
buffer?.destroy();
|
|
135
|
+
}
|
|
136
|
+
buffers.fill(undefined);
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function detectCapabilities(device) {
|
|
141
|
+
const features = device.features;
|
|
142
|
+
return {
|
|
143
|
+
textureExternal: true,
|
|
144
|
+
f16Storage: features.has("shader-f16")
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Build a {@link GPUContext} from the browser `navigator.gpu`. Browser/WebGPU
|
|
149
|
+
* only — kept out of the package's pure root so Node consumers can import the
|
|
150
|
+
* catalog without touching `navigator`.
|
|
151
|
+
*/
|
|
152
|
+
export async function createBrowserGPUContext(options = {}) {
|
|
153
|
+
// SAFETY: this package compiles without the DOM lib, so `navigator` is not a
|
|
154
|
+
// declared global here. The asserted shape only claims the two optional
|
|
155
|
+
// members read below, and both are guarded before use — a host without
|
|
156
|
+
// `navigator` or without `navigator.gpu` takes the throw.
|
|
157
|
+
const nav = globalThis.navigator;
|
|
158
|
+
const gpu = nav?.gpu;
|
|
159
|
+
if (!gpu) {
|
|
160
|
+
throw new Error("WebGPU is not available (navigator.gpu is undefined)");
|
|
161
|
+
}
|
|
162
|
+
const adapter = await gpu.requestAdapter(options.adapterOptions);
|
|
163
|
+
if (!adapter) {
|
|
164
|
+
throw new Error("No WebGPU adapter available");
|
|
165
|
+
}
|
|
166
|
+
const device = await adapter.requestDevice();
|
|
167
|
+
return createGPUContextFromDevice(device);
|
|
168
|
+
}
|
|
169
|
+
/** Lazy-allocated 1×1 white texture (default for unbound optional inputs). */
|
|
170
|
+
function makeWhiteTextureProvider(device) {
|
|
171
|
+
let cached = null;
|
|
172
|
+
return () => {
|
|
173
|
+
if (cached) {
|
|
174
|
+
return cached;
|
|
175
|
+
}
|
|
176
|
+
const tex = createLabeledTexture(device, {
|
|
177
|
+
label: "default-white-1x1",
|
|
178
|
+
width: 1,
|
|
179
|
+
height: 1,
|
|
180
|
+
format: "rgba8unorm",
|
|
181
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
|
|
182
|
+
meta: { colorSpace: "linear", alpha: "premultiplied" }
|
|
183
|
+
});
|
|
184
|
+
device.queue.writeTexture({ texture: tex.texture }, new Uint8Array([255, 255, 255, 255]), { bytesPerRow: 4, rowsPerImage: 1 }, { width: 1, height: 1 });
|
|
185
|
+
cached = tex;
|
|
186
|
+
return cached;
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Build a {@link GPUContext} from an already-acquired `GPUDevice` (browser,
|
|
191
|
+
* Electron, or Node.js Dawn). The shared path every adapter funnels into.
|
|
192
|
+
*/
|
|
193
|
+
export function createGPUContextFromDevice(device) {
|
|
194
|
+
const root = tgpu.initFromDevice({ device });
|
|
195
|
+
return {
|
|
196
|
+
root,
|
|
197
|
+
device,
|
|
198
|
+
capabilities: detectCapabilities(device),
|
|
199
|
+
pipelineCache: makePipelineCache(),
|
|
200
|
+
scratch: makeScratchPool(device),
|
|
201
|
+
uniformRing: makeUniformRing(device),
|
|
202
|
+
getDefaultWhiteTexture: makeWhiteTextureProvider(device)
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,OAAO,EAAkB,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAkFpE,kFAAkF;AAClF,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;QACf,GAAG,IAAI,CAAC,CAAC;IACX,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAChD,OAAO;QACL,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAC5B,GAAG,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;YACrB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,IAAI,OAAO,EAA0B,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAA4B,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvC,MAAM,OAAO,GAAG,CAAC,IAAiB,EAAqC,EAAE,CACvE,IAAI,CAAC,KAAK;QACR,CAAC,CAAC;YACE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC7C;QACH,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IAE7E,mEAAmE;IACnE,yEAAyE;IACzE,8CAA8C;IAC9C,MAAM,SAAS,GAAG,CAAC,IAAiB,EAAU,EAAE;QAC9C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;IAC3D,CAAC,CAAC;IAEF,OAAO;QACL,OAAO,CAAC,IAAI;YACV,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,CAAC;YAC7B,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACjB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE;gBAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,WAAW,GAAG,EAAE;gBACrC,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,OAAO;YACb,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,OAAO;YACL,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;gBAC3B,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACnC,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;oBAC7B,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,OAAO,GAA8B,EAAE,CAAC;IAC9C,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO;QACL,eAAe;YACb,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,IAAI;YACV,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAClC,IAAI,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;gBACpC,MAAM,EAAE,OAAO,EAAE,CAAC;gBAClB,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;oBAC3B,KAAK,EAAE,gBAAgB,IAAI,EAAE;oBAC7B,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,QAAQ;iBACxD,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;YACzB,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO;YACL,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAiB;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,OAAO;QACL,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC;KACvC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAO,GAAkD,EAAE;IAE3D,6EAA6E;IAC7E,wEAAwE;IACxE,uEAAuE;IACvE,0DAA0D;IAC1D,MAAM,GAAG,GAAI,UAA4C,CAAC,SAAS,CAAC;IACpE,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC;IACrB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACjE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;IAC7C,OAAO,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,8EAA8E;AAC9E,SAAS,wBAAwB,CAC/B,MAAiB;IAEjB,IAAI,MAAM,GAA0B,IAAI,CAAC;IACzC,OAAO,GAAG,EAAE;QACV,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,EAAE;YACvC,KAAK,EAAE,mBAAmB;YAC1B,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,YAAY;YACpB,KAAK,EAAE,eAAe,CAAC,eAAe,GAAG,eAAe,CAAC,QAAQ;YACjE,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE;SACvD,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,YAAY,CACvB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EACxB,IAAI,UAAU,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EACpC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,EACnC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CACxB,CAAC;QACF,MAAM,GAAG,GAAG,CAAC;QACb,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,OAAO;QACL,IAAI;QACJ,MAAM;QACN,YAAY,EAAE,kBAAkB,CAAC,MAAM,CAAC;QACxC,aAAa,EAAE,iBAAiB,EAAE;QAClC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC;QAChC,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC;QACpC,sBAAsB,EAAE,wBAAwB,CAAC,MAAM,CAAC;KACzD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Premultiplied-alpha invariant validator (Item 5 of the shader-pool
|
|
3
|
+
* invariant enforcement plan).
|
|
4
|
+
*
|
|
5
|
+
* When enabled (env flag `NODETOOL_GPU_DEBUG` contains `"premul"`), the
|
|
6
|
+
* Executor calls {@link encodePremulValidationPass} after every dispatch that
|
|
7
|
+
* writes a premultiplied output. The pass runs a small compute shader that
|
|
8
|
+
* scans the output texture and atomically increments counters in a tiny
|
|
9
|
+
* storage buffer whenever a texel violates the premul invariant
|
|
10
|
+
* (`rgb ≤ a`, `rgb ≥ 0`, no NaN).
|
|
11
|
+
*
|
|
12
|
+
* The buffer is then copied into a readback buffer registered on the
|
|
13
|
+
* context's debug sink; the host calls {@link consumePremulDebugWarnings}
|
|
14
|
+
* after submit to map, read, and log violations.
|
|
15
|
+
*
|
|
16
|
+
* Zero overhead when the flag is off: the gate function short-circuits before
|
|
17
|
+
* any allocation. The validator only reads the output texture — it never
|
|
18
|
+
* mutates it — so it cannot perturb pipeline behaviour even when enabled.
|
|
19
|
+
*/
|
|
20
|
+
import type { GPUContext } from "../context.js";
|
|
21
|
+
import { type ShaderModule } from "../module.js";
|
|
22
|
+
import type { LabeledTexture } from "../texture.js";
|
|
23
|
+
/** One violation report, materialized after readback. */
|
|
24
|
+
export interface DebugViolation {
|
|
25
|
+
/** `id@version` of the module whose output was scanned. */
|
|
26
|
+
readonly moduleKey: string;
|
|
27
|
+
/** Total texels scanned. */
|
|
28
|
+
readonly totalChecked: number;
|
|
29
|
+
/** Texels where any RGB channel exceeds alpha by more than epsilon. */
|
|
30
|
+
readonly rgbExceedsA: number;
|
|
31
|
+
/** Texels with any channel < -epsilon. */
|
|
32
|
+
readonly negative: number;
|
|
33
|
+
/** Texels with NaN in any channel. */
|
|
34
|
+
readonly nan: number;
|
|
35
|
+
}
|
|
36
|
+
/** A queued readback; the executor pushes these onto {@link DebugSink}. */
|
|
37
|
+
export interface DebugReadback {
|
|
38
|
+
readonly moduleKey: string;
|
|
39
|
+
readonly buffer: GPUBuffer;
|
|
40
|
+
/**
|
|
41
|
+
* The counters buffer the validation pass wrote, copied into `buffer`. Only
|
|
42
|
+
* needed while the encoder runs; the consumer destroys it once the readback
|
|
43
|
+
* completes.
|
|
44
|
+
*/
|
|
45
|
+
readonly countersBuffer?: GPUBuffer;
|
|
46
|
+
}
|
|
47
|
+
/** Mutable list of pending readbacks; one per {@link GPUContext}. */
|
|
48
|
+
export type DebugSink = DebugReadback[];
|
|
49
|
+
/**
|
|
50
|
+
* Whether the premul debug pass should run. Cached on first read for zero
|
|
51
|
+
* overhead in the hot path; {@link setPremulDebugEnabled} exists for tests
|
|
52
|
+
* that need to flip it without re-importing the module.
|
|
53
|
+
*/
|
|
54
|
+
export declare function isPremulDebugEnabled(): boolean;
|
|
55
|
+
/** Test hook: forcibly toggle the cached gate (bypassing env). */
|
|
56
|
+
export declare function setPremulDebugEnabled(enabled: boolean): void;
|
|
57
|
+
/** Test hook: clear the cache so the next call re-reads the env. */
|
|
58
|
+
export declare function resetPremulDebugCache(): void;
|
|
59
|
+
export interface EncodeValidationArgs {
|
|
60
|
+
ctx: GPUContext;
|
|
61
|
+
module: ShaderModule;
|
|
62
|
+
encoder: GPUCommandEncoder;
|
|
63
|
+
output: LabeledTexture;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Encode a debug validation pass into the given encoder, then schedule a
|
|
67
|
+
* buffer-to-buffer copy into a fresh readback buffer queued for this context.
|
|
68
|
+
* Caller is responsible for `consumePremulDebugWarnings` after submit to
|
|
69
|
+
* actually map the readback.
|
|
70
|
+
*
|
|
71
|
+
* Silently skips if the output texture lacks `TEXTURE_BINDING` usage: the
|
|
72
|
+
* pass needs to sample the output and we will not silently re-allocate
|
|
73
|
+
* with extra usage flags. The host should add `TEXTURE_BINDING` to outputs
|
|
74
|
+
* it wants validated.
|
|
75
|
+
*/
|
|
76
|
+
export declare function encodePremulValidationPass(args: EncodeValidationArgs): void;
|
|
77
|
+
/**
|
|
78
|
+
* Map every queued debug readback, decode the four-counter struct, log a
|
|
79
|
+
* warning per non-zero entry, and return the violations. Buffers are
|
|
80
|
+
* destroyed after read so a long-running host doesn't leak.
|
|
81
|
+
*
|
|
82
|
+
* Safe to call when no validation passes were encoded — returns `[]`.
|
|
83
|
+
*/
|
|
84
|
+
export declare function consumePremulDebugWarnings(ctx: GPUContext): Promise<DebugViolation[]>;
|
|
85
|
+
//# sourceMappingURL=premulValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"premulValidator.d.ts","sourceRoot":"","sources":["../../src/debug/premulValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC;CACrC;AAED,qEAAqE;AACrE,MAAM,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;AA6DxC;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAK9C;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE5D;AAED,oEAAoE;AACpE,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AA0CD,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAsD3E;AAID;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,cAAc,EAAE,CAAC,CA6C3B"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Premultiplied-alpha invariant validator (Item 5 of the shader-pool
|
|
3
|
+
* invariant enforcement plan).
|
|
4
|
+
*
|
|
5
|
+
* When enabled (env flag `NODETOOL_GPU_DEBUG` contains `"premul"`), the
|
|
6
|
+
* Executor calls {@link encodePremulValidationPass} after every dispatch that
|
|
7
|
+
* writes a premultiplied output. The pass runs a small compute shader that
|
|
8
|
+
* scans the output texture and atomically increments counters in a tiny
|
|
9
|
+
* storage buffer whenever a texel violates the premul invariant
|
|
10
|
+
* (`rgb ≤ a`, `rgb ≥ 0`, no NaN).
|
|
11
|
+
*
|
|
12
|
+
* The buffer is then copied into a readback buffer registered on the
|
|
13
|
+
* context's debug sink; the host calls {@link consumePremulDebugWarnings}
|
|
14
|
+
* after submit to map, read, and log violations.
|
|
15
|
+
*
|
|
16
|
+
* Zero overhead when the flag is off: the gate function short-circuits before
|
|
17
|
+
* any allocation. The validator only reads the output texture — it never
|
|
18
|
+
* mutates it — so it cannot perturb pipeline behaviour even when enabled.
|
|
19
|
+
*/
|
|
20
|
+
import { moduleKey } from "../module.js";
|
|
21
|
+
/**
|
|
22
|
+
* Pending readbacks per context. Kept beside the context rather than on it:
|
|
23
|
+
* the sink is this module's own bookkeeping, not part of the {@link GPUContext}
|
|
24
|
+
* contract, and a weak key lets a discarded context take its queue with it.
|
|
25
|
+
*/
|
|
26
|
+
const debugSinks = new WeakMap();
|
|
27
|
+
const COUNTERS_SIZE_BYTES = 16; // 4 × u32: rgbExceedsA, negative, nan, totalChecked
|
|
28
|
+
const VALIDATOR_WGSL = /* wgsl */ `
|
|
29
|
+
struct Counters {
|
|
30
|
+
rgbExceedsA: atomic<u32>,
|
|
31
|
+
negative: atomic<u32>,
|
|
32
|
+
nan: atomic<u32>,
|
|
33
|
+
totalChecked: atomic<u32>,
|
|
34
|
+
};
|
|
35
|
+
@group(0) @binding(0) var src: texture_2d<f32>;
|
|
36
|
+
@group(0) @binding(1) var<storage, read_write> counters: Counters;
|
|
37
|
+
|
|
38
|
+
@compute @workgroup_size(8, 8, 1)
|
|
39
|
+
fn main(@builtin(global_invocation_id) gid: vec3u) {
|
|
40
|
+
let dims = textureDimensions(src);
|
|
41
|
+
if (gid.x >= dims.x || gid.y >= dims.y) { return; }
|
|
42
|
+
let c = textureLoad(src, vec2i(i32(gid.x), i32(gid.y)), 0);
|
|
43
|
+
atomicAdd(&counters.totalChecked, 1u);
|
|
44
|
+
let eps = 1.0 / 255.0;
|
|
45
|
+
if (c.r != c.r || c.g != c.g || c.b != c.b || c.a != c.a) {
|
|
46
|
+
atomicAdd(&counters.nan, 1u);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (c.r < -eps || c.g < -eps || c.b < -eps || c.a < -eps) {
|
|
50
|
+
atomicAdd(&counters.negative, 1u);
|
|
51
|
+
}
|
|
52
|
+
if (c.r > c.a + eps || c.g > c.a + eps || c.b > c.a + eps) {
|
|
53
|
+
atomicAdd(&counters.rgbExceedsA, 1u);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
// --- Gating ------------------------------------------------------------------
|
|
58
|
+
let cachedFlag = null;
|
|
59
|
+
function readEnvFlag() {
|
|
60
|
+
// SAFETY: this package compiles without @types/node, so `process` is not a
|
|
61
|
+
// declared global here. The asserted shape only claims optional members, and
|
|
62
|
+
// the optional chain reads the flag as unset in a host that has no
|
|
63
|
+
// `process` (browser, worker) — which leaves the validator off.
|
|
64
|
+
const raw = globalThis
|
|
65
|
+
.process?.env?.NODETOOL_GPU_DEBUG;
|
|
66
|
+
if (!raw) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return raw
|
|
70
|
+
.split(",")
|
|
71
|
+
.map((tag) => tag.trim().toLowerCase())
|
|
72
|
+
.includes("premul");
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Whether the premul debug pass should run. Cached on first read for zero
|
|
76
|
+
* overhead in the hot path; {@link setPremulDebugEnabled} exists for tests
|
|
77
|
+
* that need to flip it without re-importing the module.
|
|
78
|
+
*/
|
|
79
|
+
export function isPremulDebugEnabled() {
|
|
80
|
+
if (cachedFlag === null) {
|
|
81
|
+
cachedFlag = readEnvFlag();
|
|
82
|
+
}
|
|
83
|
+
return cachedFlag;
|
|
84
|
+
}
|
|
85
|
+
/** Test hook: forcibly toggle the cached gate (bypassing env). */
|
|
86
|
+
export function setPremulDebugEnabled(enabled) {
|
|
87
|
+
cachedFlag = enabled;
|
|
88
|
+
}
|
|
89
|
+
/** Test hook: clear the cache so the next call re-reads the env. */
|
|
90
|
+
export function resetPremulDebugCache() {
|
|
91
|
+
cachedFlag = null;
|
|
92
|
+
}
|
|
93
|
+
// --- Pipeline + encoding -----------------------------------------------------
|
|
94
|
+
const pipelineByDevice = new WeakMap();
|
|
95
|
+
const bindGroupLayoutByDevice = new WeakMap();
|
|
96
|
+
function getValidatorPipeline(device) {
|
|
97
|
+
let pipeline = pipelineByDevice.get(device);
|
|
98
|
+
let bindGroupLayout = bindGroupLayoutByDevice.get(device);
|
|
99
|
+
if (pipeline && bindGroupLayout) {
|
|
100
|
+
return { pipeline, bindGroupLayout };
|
|
101
|
+
}
|
|
102
|
+
bindGroupLayout = device.createBindGroupLayout({
|
|
103
|
+
label: "premul-validator-bgl",
|
|
104
|
+
entries: [
|
|
105
|
+
{
|
|
106
|
+
binding: 0,
|
|
107
|
+
visibility: GPUShaderStage.COMPUTE,
|
|
108
|
+
texture: { sampleType: "float", viewDimension: "2d" }
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
binding: 1,
|
|
112
|
+
visibility: GPUShaderStage.COMPUTE,
|
|
113
|
+
buffer: { type: "storage" }
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
});
|
|
117
|
+
const shaderModule = device.createShaderModule({
|
|
118
|
+
label: "premul-validator-shader",
|
|
119
|
+
code: VALIDATOR_WGSL
|
|
120
|
+
});
|
|
121
|
+
pipeline = device.createComputePipeline({
|
|
122
|
+
label: "premul-validator-pipeline",
|
|
123
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout] }),
|
|
124
|
+
compute: { module: shaderModule, entryPoint: "main" }
|
|
125
|
+
});
|
|
126
|
+
pipelineByDevice.set(device, pipeline);
|
|
127
|
+
bindGroupLayoutByDevice.set(device, bindGroupLayout);
|
|
128
|
+
return { pipeline, bindGroupLayout };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Encode a debug validation pass into the given encoder, then schedule a
|
|
132
|
+
* buffer-to-buffer copy into a fresh readback buffer queued for this context.
|
|
133
|
+
* Caller is responsible for `consumePremulDebugWarnings` after submit to
|
|
134
|
+
* actually map the readback.
|
|
135
|
+
*
|
|
136
|
+
* Silently skips if the output texture lacks `TEXTURE_BINDING` usage: the
|
|
137
|
+
* pass needs to sample the output and we will not silently re-allocate
|
|
138
|
+
* with extra usage flags. The host should add `TEXTURE_BINDING` to outputs
|
|
139
|
+
* it wants validated.
|
|
140
|
+
*/
|
|
141
|
+
export function encodePremulValidationPass(args) {
|
|
142
|
+
const { ctx, module, encoder, output } = args;
|
|
143
|
+
if ((output.texture.usage & GPUTextureUsage.TEXTURE_BINDING) === 0) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const { device } = ctx;
|
|
147
|
+
const { pipeline, bindGroupLayout } = getValidatorPipeline(device);
|
|
148
|
+
const counters = device.createBuffer({
|
|
149
|
+
label: "premul-validator-counters",
|
|
150
|
+
size: COUNTERS_SIZE_BYTES,
|
|
151
|
+
usage: GPUBufferUsage.STORAGE |
|
|
152
|
+
GPUBufferUsage.COPY_SRC |
|
|
153
|
+
GPUBufferUsage.COPY_DST
|
|
154
|
+
});
|
|
155
|
+
// Zero the counters before the pass.
|
|
156
|
+
device.queue.writeBuffer(counters, 0, new Uint32Array([0, 0, 0, 0]));
|
|
157
|
+
const readback = device.createBuffer({
|
|
158
|
+
label: "premul-validator-readback",
|
|
159
|
+
size: COUNTERS_SIZE_BYTES,
|
|
160
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
|
|
161
|
+
});
|
|
162
|
+
const bindGroup = device.createBindGroup({
|
|
163
|
+
label: "premul-validator-bindgroup",
|
|
164
|
+
layout: bindGroupLayout,
|
|
165
|
+
entries: [
|
|
166
|
+
{ binding: 0, resource: output.createView() },
|
|
167
|
+
{ binding: 1, resource: { buffer: counters } }
|
|
168
|
+
]
|
|
169
|
+
});
|
|
170
|
+
const pass = encoder.beginComputePass({ label: "premul-validator-pass" });
|
|
171
|
+
pass.setPipeline(pipeline);
|
|
172
|
+
pass.setBindGroup(0, bindGroup);
|
|
173
|
+
const wgX = Math.ceil(output.width / 8);
|
|
174
|
+
const wgY = Math.ceil(output.height / 8);
|
|
175
|
+
pass.dispatchWorkgroups(Math.max(1, wgX), Math.max(1, wgY), 1);
|
|
176
|
+
pass.end();
|
|
177
|
+
encoder.copyBufferToBuffer(counters, 0, readback, 0, COUNTERS_SIZE_BYTES);
|
|
178
|
+
let sink = debugSinks.get(ctx);
|
|
179
|
+
if (!sink) {
|
|
180
|
+
sink = [];
|
|
181
|
+
debugSinks.set(ctx, sink);
|
|
182
|
+
}
|
|
183
|
+
sink.push({
|
|
184
|
+
moduleKey: moduleKey(module.id, module.version),
|
|
185
|
+
buffer: readback,
|
|
186
|
+
countersBuffer: counters
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
// --- Readback / reporting ----------------------------------------------------
|
|
190
|
+
/**
|
|
191
|
+
* Map every queued debug readback, decode the four-counter struct, log a
|
|
192
|
+
* warning per non-zero entry, and return the violations. Buffers are
|
|
193
|
+
* destroyed after read so a long-running host doesn't leak.
|
|
194
|
+
*
|
|
195
|
+
* Safe to call when no validation passes were encoded — returns `[]`.
|
|
196
|
+
*/
|
|
197
|
+
export async function consumePremulDebugWarnings(ctx) {
|
|
198
|
+
const sink = debugSinks.get(ctx);
|
|
199
|
+
if (!sink || sink.length === 0) {
|
|
200
|
+
return [];
|
|
201
|
+
}
|
|
202
|
+
// Detach so concurrent encoders can begin a fresh batch.
|
|
203
|
+
debugSinks.delete(ctx);
|
|
204
|
+
const violations = [];
|
|
205
|
+
for (const entry of sink) {
|
|
206
|
+
await entry.buffer.mapAsync(GPUMapMode.READ);
|
|
207
|
+
const view = new Uint32Array(entry.buffer.getMappedRange().slice(0));
|
|
208
|
+
entry.buffer.unmap();
|
|
209
|
+
entry.buffer.destroy();
|
|
210
|
+
entry.countersBuffer?.destroy();
|
|
211
|
+
const violation = {
|
|
212
|
+
moduleKey: entry.moduleKey,
|
|
213
|
+
rgbExceedsA: view[0] ?? 0,
|
|
214
|
+
negative: view[1] ?? 0,
|
|
215
|
+
nan: view[2] ?? 0,
|
|
216
|
+
totalChecked: view[3] ?? 0
|
|
217
|
+
};
|
|
218
|
+
if (violation.rgbExceedsA > 0 ||
|
|
219
|
+
violation.negative > 0 ||
|
|
220
|
+
violation.nan > 0) {
|
|
221
|
+
// `console` is not in this package's tsconfig `lib`, but every host
|
|
222
|
+
// (browser, Electron, Node) has it on globalThis. Routed through a
|
|
223
|
+
// typed alias so DOM lib isn't required.
|
|
224
|
+
// SAFETY: the asserted shape claims one optional member, read through
|
|
225
|
+
// `?.` below, so a host without `console` logs nothing instead of
|
|
226
|
+
// throwing.
|
|
227
|
+
const con = globalThis
|
|
228
|
+
.console;
|
|
229
|
+
con?.warn(`[gpu/premul-debug] ${violation.moduleKey}: ` +
|
|
230
|
+
`rgbExceedsA=${violation.rgbExceedsA} ` +
|
|
231
|
+
`negative=${violation.negative} ` +
|
|
232
|
+
`nan=${violation.nan} ` +
|
|
233
|
+
`(of ${violation.totalChecked} texels)`);
|
|
234
|
+
}
|
|
235
|
+
violations.push(violation);
|
|
236
|
+
}
|
|
237
|
+
return violations;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=premulValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"premulValidator.js","sourceRoot":"","sources":["../../src/debug/premulValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Executor` — the tiny shared runtime that turns a {@link ShaderModule} plus
|
|
3
|
+
* bound textures and params into encoded GPU work.
|
|
4
|
+
*
|
|
5
|
+
* Steps per call: validate input labels against the module's I/O contract,
|
|
6
|
+
* get-or-compile the pipeline via `ctx.pipelineCache`, pack `params` through
|
|
7
|
+
* the module's TypeGPU schema, build the bind group from the module's typed
|
|
8
|
+
* layout (`root.unwrap(layout)`), and encode the pass. The host owns *when*
|
|
9
|
+
* to submit and *where* the output texture lives.
|
|
10
|
+
*
|
|
11
|
+
* **No executor-inserted readback.** `encode` records GPU commands only — it
|
|
12
|
+
* never calls `copyTextureToBuffer`, `mapAsync`, or any path that pulls
|
|
13
|
+
* pixels to the CPU. Materialization is a deliberate host-side step at
|
|
14
|
+
* boundaries (Phase 4).
|
|
15
|
+
*
|
|
16
|
+
* The `fragment` arm (full-screen pass) drives image-in/image-out modules;
|
|
17
|
+
* the `compute` arm (a workgroup dispatch writing a storage-texture output)
|
|
18
|
+
* drives the migrated timeline effects. Both share input validation, the
|
|
19
|
+
* params packer, and bind-group construction — only the pipeline kind and the
|
|
20
|
+
* encoded pass differ.
|
|
21
|
+
*/
|
|
22
|
+
import type { TgpuBindGroupLayout } from "typegpu";
|
|
23
|
+
import type { AnyWgslStruct, Infer } from "typegpu/data";
|
|
24
|
+
import type { GPUCapabilities, GPUContext } from "./context.js";
|
|
25
|
+
import { type ShaderModule } from "./module.js";
|
|
26
|
+
import type { LabeledTexture } from "./texture.js";
|
|
27
|
+
export type ExecutorDispatch = {
|
|
28
|
+
kind: "fragment";
|
|
29
|
+
} | {
|
|
30
|
+
kind: "compute";
|
|
31
|
+
x: number;
|
|
32
|
+
y: number;
|
|
33
|
+
z?: number;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* The slice of a module the Executor actually binds against. Either the
|
|
37
|
+
* module's primary (`layout`, `wgsl`, `entryPoint`, `samplers`,
|
|
38
|
+
* `workgroupSize`) or one of its `variants` selected by
|
|
39
|
+
* {@link resolveVariant}.
|
|
40
|
+
*/
|
|
41
|
+
export interface ResolvedShader {
|
|
42
|
+
layout: TgpuBindGroupLayout;
|
|
43
|
+
wgsl: string;
|
|
44
|
+
entryPoint: string;
|
|
45
|
+
samplers: Readonly<Record<string, GPUSamplerDescriptor>>;
|
|
46
|
+
workgroupSize: readonly [number, number, number];
|
|
47
|
+
/** `undefined` ⇒ module's primary; otherwise the chosen variant's name. */
|
|
48
|
+
variant: string | undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Resolve which `(layout, wgsl, ...)` to use for this dispatch.
|
|
52
|
+
*
|
|
53
|
+
* Phase 3 policy: try variants in declaration order; the first one whose
|
|
54
|
+
* `bindingKinds` match the bound inputs AND whose `requires` are satisfied by
|
|
55
|
+
* `ctx.capabilities` wins. If no variant matches, the module's primary is
|
|
56
|
+
* used; if it can't match either (e.g. a `texture_external` input on a host
|
|
57
|
+
* without that capability), the Executor lets the original validation /
|
|
58
|
+
* pipeline-creation fail loud rather than substituting silently.
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveVariant(module: ShaderModule, inputs: Record<string, LabeledTexture>, capabilities: GPUCapabilities): ResolvedShader;
|
|
61
|
+
export interface EncodeArgs<Schema extends AnyWgslStruct> {
|
|
62
|
+
ctx: GPUContext;
|
|
63
|
+
module: ShaderModule<Schema>;
|
|
64
|
+
encoder: GPUCommandEncoder;
|
|
65
|
+
inputs: Record<string, LabeledTexture>;
|
|
66
|
+
output: LabeledTexture;
|
|
67
|
+
params: Infer<Schema>;
|
|
68
|
+
dispatch: ExecutorDispatch;
|
|
69
|
+
}
|
|
70
|
+
export interface Executor {
|
|
71
|
+
encode<Schema extends AnyWgslStruct>(args: EncodeArgs<Schema>): void;
|
|
72
|
+
}
|
|
73
|
+
export declare function createExecutor(): Executor;
|
|
74
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAShE,OAAO,EAAa,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AAG/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACzD,aAAa,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,2EAA2E;IAC3E,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAuCD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EACtC,YAAY,EAAE,eAAe,GAC5B,cAAc,CA4BhB;AAED,MAAM,WAAW,UAAU,CAAC,MAAM,SAAS,aAAa;IACtD,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,MAAM,SAAS,aAAa,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;CACtE;AAED,wBAAgB,cAAc,IAAI,QAAQ,CAwZzC"}
|