- HTML 86%
- JavaScript 14%
| audit | ||
| build/wasm-v23 | ||
| dist | ||
| scripts | ||
| src | ||
| tests | ||
| AUDIT.md | ||
| AUDIT_V24.md | ||
| BUILD_REPRODUCIBILITY.md | ||
| COMPLETION_AUDIT.md | ||
| gpu-kernels.js | ||
| hosted-headers.txt | ||
| hosted-loader.js | ||
| IMPLEMENTATION_REPORT.md | ||
| IMPROVEMENT_PROPOSAL.md | ||
| index.html | ||
| kernels.js | ||
| MIGRATION_V24.md | ||
| package.json | ||
| README.md | ||
| script.js | ||
| toolchain.lock.json | ||
Mandelbrot Deep Zoom v24.1.3 — WebGPU
v23のCPU/WASM deep pixel rendererを撤去し、画素計算・field・彩色・再投影・高解像度ExportをWebGPUへ移した版です。
数値構成
- ViewState: BigInt固定小数点。深度に応じてbit数を自動拡張。
- Shallow: WebGPU
f32direct iteration。f32座標分解能に十分な余裕があるviewだけで使用。 - Deep reference: 専用WorkerでBigInt固定小数点orbitを1本生成。referenceはview精度より64 bit高く生成し、さらに+64 bitのguard orbitでcheckpoint照合。
- Deep pixels: WebGPU
guarded rescaled f32 perturbation。spanはmantissa + exponentへ分離し、1e-400級でもpixel offsetをf32 absolute値へ潰さない。 - Error handling: roundoff上界がescape/bounded判定へ影響し得るpixelは
FIELD_UNKNOWNにする。UNKNOWNを内部点へ偽装しない。 - BLA: productionでは無効・未搭載。旧f32量子化BLAで境界pixelのmembership反転を再現したため、再導入していない。
旧v23のValidated directは削除しています。v24.1.3のStrictは誤差許容閾値を厳しくする保守的GPU policyで、任意精度direct全画素証明ではありません。PNG sidecarは常に membershipCertified:false です。
描画パイプライン
通常表示ではfieldをGPUに保持します。
BigInt ViewState
└─ deep時: BigInt reference Worker
↓
WebGPU direct / guarded perturbation
↓
fieldMeta + fieldSmooth GPU buffers
↓
GPU color / optional boundary smoothing
↓
offscreen texture
↓
GPU reprojection / canvas
パレット・cycle・shift・HQ変更は数値fieldを再計算せずrecolorします。pan / wheel / pinch操作中は直前frameをGPUで再投影し、settle後に新しい数値frameを計算します。
Export
高解像度PNGは最大辺16,384 pxです。
- 512×512以下のGPU tileで計算。
- Export用GPU buffers/textures/readback bufferは固定workspaceを再利用し、tileごとの大量生成を避ける。
- 2×2 AAは4 sampleをGPUで計算し、GPUでlinear-light resolveした後、tileにつき1回だけreadback。
- 全画像Canvasを確保せず、scanline bandを
CompressionStream('deflate')へ送りPNGを構築。 - sidecar JSONへ
unresolvedSamplesを記録。
unresolvedSamples > 0は、数値policyがそのsampleを安全に分類できなかったことを意味します。
WebGPU unavailable
WebGPUが利用できない場合は浅部のみJavaScript f64 fallbackを使います。deep zoomは誤画像を出さず、「このズーム深度はWebGPUが必要です」と表示します。
WebGPU自体が存在しない場合だけ軽量な浅部JavaScript fallbackを使います。WGSL/shader/pipeline初期化エラー時はCPU全画面fallbackへ自動移行しません。エラーを表示して停止し、shader不具合を隠したままCPUを占有しない設計です。webgpu canvas contextはpipeline作成成功後に取得します。high-performance adapterが得られない場合は通常のadapter requestも再試行します。
v24.1.3 hotfix
実ブラウザで発覚したWGSL parse errorを修正しました。WGSL 16.2で予約されているmeta / smoothをstorage-buffer変数名に使っていたため、fieldMeta / fieldSmoothへ変更しています。全shaderをWGSL reserved-word一覧へ照合するNode gate tests/v24-wgsl-reserved.mjsも追加しました。
表示負荷も見直し、標準モードのscreen pixel budgetをdesktop約1.5M / 小型端末約0.75Mへ縮小しました(旧版は約4M / 2M)。省電力は約0.5M、精細は最大約3M、Strictは最大約2Mです。WebGPU非対応時のCPU fallbackは約0.25M pixelに制限します。
Standalone
index.html, gpu-kernels.js, script.jsの3ファイルで動作します。外部WGSL fetchはありません。
index.html
gpu-kernels.js
script.js
ブラウザがfile://上でWebGPUを許可しない構成ではlocalhost/HTTPSで開いてください。
Test
npm test
npm run build
npm testは以下を検査します。
- JS syntax / source contracts
- WGSL reserved-word token audit (
meta,smooth,ref等を含む仕様予約語) - 旧C/WASM deep assetがproduction treeに残っていないこと
- BigInt reference Worker + guard checkpoints
- shallow f32 CPU model vs BigInt oracle
- guarded perturbation CPU f32 model vs BigInt oracle
swirly-seahorses-z12高密度回帰と既知3反例- BLAがproductionから除去されていること
- tile/pixel geometry
1e-400/1e-1000coordinate formatting- streaming PNG structure / CRC / inflate / abort
- real-WebGPU acceptance harnessのJS syntax
実GPU acceptance
tests/webgpu-acceptance.htmlをWebGPU対応browserで開きます。これは実adapter上でshader compile / compute / readbackを行い、BigInt oracleと比較します。
必須gate:
- stable corpus scene: sampled
UNKNOWN = 0 - swirly scene: 25 sample中12以上を確定
falseEscaped = 0falseBounded = 0- reference guard mismatch = 0
- 既知dense反例で誤分類しない
- 1× / 2×2 Export smokeの未確定sample = 0
- uncaptured WebGPU validation error = 0
このリポジトリを生成した実行環境ではnavigator.gpuが公開されなかったため、実adapter gateだけは未実行です。静的/CPU-model gateの代替ではありません。