webgpu sponza
This commit is contained in:
parent
5553ded476
commit
b5d0f52da0
21 changed files with 1426 additions and 58 deletions
|
|
@ -49,6 +49,27 @@ namespace Crafter::WebGPU {
|
|||
__attribute__((import_module("env"), import_name("wgpuDestroyTexture")))
|
||||
extern "C" void wgpuDestroyTexture(std::uint32_t handle);
|
||||
|
||||
// General-purpose rgba8unorm 2D texture for material albedo etc.
|
||||
// Separate from the atlas path because atlas uses r8unorm + sub-region
|
||||
// writes; this one takes the whole image in one shot.
|
||||
__attribute__((import_module("env"), import_name("wgpuCreateImage2D")))
|
||||
extern "C" std::uint32_t wgpuCreateImage2D(std::int32_t w, std::int32_t h);
|
||||
__attribute__((import_module("env"), import_name("wgpuWriteImage2D")))
|
||||
extern "C" void wgpuWriteImage2D(std::uint32_t handle, const void* srcPtr,
|
||||
std::int32_t byteSize,
|
||||
std::int32_t w, std::int32_t h);
|
||||
|
||||
// 2D texture array — `layerCount` rgba8unorm layers of identical (w × h).
|
||||
// Sampled via `texture_2d_array<f32>` in WGSL (UICustomBindingKind 3).
|
||||
// Used by Image2DArray<RGBA8> to stack per-material albedos for one
|
||||
// multi-material scene.
|
||||
__attribute__((import_module("env"), import_name("wgpuCreateImage2DArray")))
|
||||
extern "C" std::uint32_t wgpuCreateImage2DArray(std::int32_t w, std::int32_t h, std::int32_t layerCount);
|
||||
__attribute__((import_module("env"), import_name("wgpuWriteImage2DLayer")))
|
||||
extern "C" void wgpuWriteImage2DLayer(std::uint32_t handle, std::int32_t layer,
|
||||
const void* srcPtr, std::int32_t byteSize,
|
||||
std::int32_t w, std::int32_t h);
|
||||
|
||||
__attribute__((import_module("env"), import_name("wgpuCreateLinearClampSampler")))
|
||||
extern "C" std::uint32_t wgpuCreateLinearClampSampler();
|
||||
|
||||
|
|
@ -96,6 +117,11 @@ namespace Crafter::WebGPU {
|
|||
// stores in RTInstance::accelerationStructureReference; the WebGPU
|
||||
// TLAS-build compute shader resolves it back to root AABB + heap
|
||||
// offsets at dispatch time. Returns 0 on failure.
|
||||
// The optional `attribsPtr` / `attribsByteCount` carry per-vertex
|
||||
// attribute payload (normals, UVs, etc. — layout is example-defined)
|
||||
// that gets appended to a global attribs heap and exposed to RT
|
||||
// closest-hit shaders as `vertexAttribs : array<u32>` at
|
||||
// @group(1) @binding(7). Pass (nullptr, 0) for positions-only meshes.
|
||||
__attribute__((import_module("env"), import_name("wgpuRegisterMeshBLAS")))
|
||||
extern "C" std::uint32_t wgpuRegisterMeshBLAS(
|
||||
float minX, float minY, float minZ,
|
||||
|
|
@ -103,25 +129,34 @@ namespace Crafter::WebGPU {
|
|||
const void* verticesPtr, std::int32_t vertexCount,
|
||||
const void* indicesPtr, std::int32_t indexCount,
|
||||
const void* bvhNodesPtr, std::int32_t bvhNodeCount,
|
||||
const void* primRemapPtr, std::int32_t primRemapCount);
|
||||
const void* primRemapPtr, std::int32_t primRemapCount,
|
||||
const void* attribsPtr, std::int32_t attribsByteCount);
|
||||
|
||||
// RT pipeline build. The library composes WGSL by concatenating the
|
||||
// traversal library, generated hit-group switches, and the user-
|
||||
// supplied raygen / miss / closesthit / anyhit bodies. Returns an
|
||||
// opaque pipeline handle.
|
||||
// supplied raygen / miss / closesthit / anyhit bodies. `bindings` is
|
||||
// UICustomBinding-shaped (8 bytes each) declaring extra @group(2)+
|
||||
// resources the user's closest-hit / miss / raygen WGSL references.
|
||||
// Pass (nullptr, 0) for a pipeline with no user-declared bindings.
|
||||
// Returns an opaque pipeline handle.
|
||||
__attribute__((import_module("env"), import_name("wgpuLoadRTPipeline")))
|
||||
extern "C" std::uint32_t wgpuLoadRTPipeline(const void* wgslPtr, std::int32_t wgslLen);
|
||||
extern "C" std::uint32_t wgpuLoadRTPipeline(const void* wgslPtr, std::int32_t wgslLen,
|
||||
const void* bindingsPtr, std::int32_t bindingsCount);
|
||||
|
||||
// Dispatch a TraceRays-equivalent pass: the RT pipeline is dispatched
|
||||
// over a (gx, gy) tile grid; the library writes the push data (camera,
|
||||
// payload, etc. — opaque) into a uniform ring buffer, attaches the TLAS
|
||||
// + global mesh heap, and runs one workgroup per 8x8 screen tile.
|
||||
// `handles[]` carries resolved WebGPU resource handles for every user
|
||||
// binding declared at pipeline-load time, in the same order. Pass
|
||||
// (nullptr, 0) for a pipeline with no user bindings.
|
||||
__attribute__((import_module("env"), import_name("wgpuDispatchRT")))
|
||||
extern "C" void wgpuDispatchRT(std::uint32_t pipelineHandle,
|
||||
const void* pushPtr, std::int32_t pushBytes,
|
||||
std::uint32_t tlasBufHandle,
|
||||
std::int32_t instanceCount,
|
||||
std::int32_t gx, std::int32_t gy);
|
||||
std::int32_t gx, std::int32_t gy,
|
||||
const void* handlesPtr, std::int32_t handlesCount);
|
||||
|
||||
// GPU TLAS-build dispatch. Reads the instance buffer (host-uploaded or
|
||||
// GPU-written), produces per-instance world-space AABBs + per-instance
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue