/* Crafter®.Graphics Copyright (C) 2026 Catcrafts® catcrafts.net */ // DOM-mode shader-binding-table analog. Stores raw WGSL source strings // plus an explicit entry-function name per shader. PipelineRTWebGPU::Init // concatenates these into the megakernel WGSL at pipeline-build time. export module Crafter.Graphics:ShaderBindingTableWebGPU; #ifdef CRAFTER_GRAPHICS_WINDOW_DOM import std; export namespace Crafter { enum class WebGPURTStage : std::uint8_t { Raygen = 0, Miss = 1, ClosestHit = 2, AnyHit = 3, // Wavefront RESOLVE-stage tonemap/output hook. Optional: if no // Resolve shader is registered, RESOLVE writes the linear accum // buffer through unchanged. Signature: // fn (coord: vec2, hdr: vec4) -> vec4 Resolve = 4, }; // One WGSL shader source + the function name PipelineRTWebGPU should // call from the megakernel switch. The source may declare any helper // functions and (in exactly one raygen file) the `Payload` struct. // // Required signatures inside `source` for `entryFn`: // Raygen: fn (gid: vec3) // Miss: fn (ray: RayDesc, payload: ptr) // ClosestHit: fn (ray: RayDesc, hit: HitInfo, payload: ptr) // AnyHit: fn (ray: RayDesc, hit: HitInfo, payload: ptr) -> u32 // returns RT_ANYHIT_ACCEPT / RT_ANYHIT_IGNORE / RT_ANYHIT_END_SEARCH. // // `RayDesc`, `HitInfo`, the `RT_*` flag/return constants, the `tlas` / // BLAS / mesh-record bindings, and the `traceRay` function are all // injected by the library prelude — see the rtWgslPrelude block in // additional/dom-webgpu.js. struct WebGPUShader { std::string source; std::string entryFn; WebGPURTStage stage = WebGPURTStage::Raygen; WebGPUShader() = default; WebGPUShader(std::string src, std::string fn, WebGPURTStage s) : source(std::move(src)), entryFn(std::move(fn)), stage(s) {} // Construct from a WGSL source file path. Reads via the WASI VFS // so apps shipping their shaders as static files (see the // `cfg.files.emplace_back("raygen.wgsl")` pattern in // examples/VulkanTriangle/project.cpp) get them at runtime. WebGPUShader(const std::filesystem::path& wgslPath, std::string fn, WebGPURTStage s); }; class ShaderBindingTableWebGPU { public: std::vector shaders; void Init(std::span shaders_) { shaders.assign(shaders_.begin(), shaders_.end()); } }; } #endif // CRAFTER_GRAPHICS_WINDOW_DOM