webgpu triangle
This commit is contained in:
parent
64116cd980
commit
5553ded476
22 changed files with 2107 additions and 42 deletions
64
interfaces/Crafter.Graphics-ShaderBindingTableWebGPU.cppm
Normal file
64
interfaces/Crafter.Graphics-ShaderBindingTableWebGPU.cppm
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
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,
|
||||
};
|
||||
|
||||
// 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 <entryFn>(gid: vec3<u32>)
|
||||
// Miss: fn <entryFn>(ray: RayDesc, payload: ptr<function, Payload>)
|
||||
// ClosestHit: fn <entryFn>(ray: RayDesc, hit: HitInfo, payload: ptr<function, Payload>)
|
||||
// AnyHit: fn <entryFn>(ray: RayDesc, hit: HitInfo, payload: ptr<function, Payload>) -> 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<WebGPUShader> shaders;
|
||||
void Init(std::span<const WebGPUShader> shaders_) {
|
||||
shaders.assign(shaders_.begin(), shaders_.end());
|
||||
}
|
||||
};
|
||||
}
|
||||
#endif // CRAFTER_GRAPHICS_WINDOW_DOM
|
||||
Loading…
Add table
Add a link
Reference in a new issue