@plasius/gpu-renderer 0.1.12 → 0.1.13

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/dist/index.js CHANGED
@@ -28,6 +28,23 @@ var rendererRayTracingStageOrder = Object.freeze([
28
28
  "composition",
29
29
  "present"
30
30
  ]);
31
+ var rendererWavefrontBufferSchemaVersion = 1;
32
+ var rendererWavefrontQueuePairStrategy = "ping-pong-active-next";
33
+ var rendererWavefrontHitTypes = Object.freeze([
34
+ "surface",
35
+ "emissive",
36
+ "environment",
37
+ "transparent",
38
+ "miss"
39
+ ]);
40
+ var rendererWavefrontPassOrder = Object.freeze([
41
+ "generatePrimaryRays",
42
+ "intersectActiveQueue",
43
+ "resolveSurfaceRecords",
44
+ "accumulateTerminalRadiance",
45
+ "scatterContinuations",
46
+ "compactAndSwapQueues"
47
+ ]);
31
48
  var rendererRayTracingStageDefinitions = Object.freeze(
32
49
  rendererRayTracingStageOrder.map(
33
50
  (key, index) => Object.freeze({
@@ -96,6 +113,153 @@ var rendererAccelerationStructurePolicies = Object.freeze(
96
113
  })
97
114
  )
98
115
  );
116
+ function createWavefrontField(name, type, description) {
117
+ return Object.freeze({
118
+ name,
119
+ type,
120
+ description
121
+ });
122
+ }
123
+ var rendererWavefrontBufferContracts = Object.freeze({
124
+ ray: Object.freeze({
125
+ schemaVersion: rendererWavefrontBufferSchemaVersion,
126
+ recordName: "RayRecord",
127
+ fields: Object.freeze([
128
+ createWavefrontField("rayId", "u32", "Stable ray identifier for correlation and debugging."),
129
+ createWavefrontField("parentRayId", "u32", "Parent ray identifier for continuation lineage."),
130
+ createWavefrontField("sourcePixelId", "u32", "Screen pixel or texel that owns the sample."),
131
+ createWavefrontField("sampleId", "u32", "Per-pixel sample slot for accumulation."),
132
+ createWavefrontField("bounce", "u32", "Breadth-first bounce depth for the queue entry."),
133
+ createWavefrontField("origin", "vec3<f32>", "Ray origin in renderer world space."),
134
+ createWavefrontField("direction", "vec3<f32>", "Normalized ray direction in renderer world space."),
135
+ createWavefrontField("throughput", "vec3<f32>", "Current path throughput before the next event."),
136
+ createWavefrontField("mediumRefId", "u32", "Active medium reference identifier for the ray."),
137
+ createWavefrontField("flags", "u32", "Bit flags for front-face state, debug, and quality toggles.")
138
+ ])
139
+ }),
140
+ hit: Object.freeze({
141
+ schemaVersion: rendererWavefrontBufferSchemaVersion,
142
+ recordName: "HitRecord",
143
+ fields: Object.freeze([
144
+ createWavefrontField("rayId", "u32", "Ray identifier copied from the active queue."),
145
+ createWavefrontField("sourcePixelId", "u32", "Pixel/texel owner for the ray sample."),
146
+ createWavefrontField("hitType", rendererWavefrontHitTypes.join(" | "), "Resolved hit classification for termination or continuation."),
147
+ createWavefrontField("distance", "f32", "Nearest-hit distance or miss sentinel."),
148
+ createWavefrontField("entityId", "u32", "Stable scene entity identifier."),
149
+ createWavefrontField("instanceId", "u32", "Renderer instance identifier."),
150
+ createWavefrontField("primitiveId", "u32", "Primitive or triangle identifier."),
151
+ createWavefrontField("materialId", "u32", "Surface material identifier."),
152
+ createWavefrontField("barycentrics", "vec3<f32>", "Triangle barycentric coordinates for interpolation."),
153
+ createWavefrontField("uv", "vec2<f32>", "Resolved surface UV when available."),
154
+ createWavefrontField("geometricNormal", "vec3<f32>", "True geometric face normal."),
155
+ createWavefrontField("shadingNormal", "vec3<f32>", "Interpolated or repaired shading normal."),
156
+ createWavefrontField("frontFace", "bool", "Front-face classification for shading and medium transitions.")
157
+ ])
158
+ }),
159
+ surface: Object.freeze({
160
+ schemaVersion: rendererWavefrontBufferSchemaVersion,
161
+ recordName: "SurfaceRecord",
162
+ fields: Object.freeze([
163
+ createWavefrontField("rayId", "u32", "Ray identifier matched to the resolved hit."),
164
+ createWavefrontField("entityId", "u32", "Stable scene entity identifier."),
165
+ createWavefrontField("materialRefId", "u32", "Material-reference indirection for shading lookup tables."),
166
+ createWavefrontField("mediumRefId", "u32", "Resolved medium transition/reference identifier."),
167
+ createWavefrontField("geometricNormal", "vec3<f32>", "Preserved geometric normal for hemisphere checks."),
168
+ createWavefrontField("shadingNormal", "vec3<f32>", "Normal used for BSDF/BTDF evaluation."),
169
+ createWavefrontField("uv", "vec2<f32>", "Resolved texture coordinate."),
170
+ createWavefrontField("tangentFrame", "mat3x3<f32>", "Optional tangent basis for normal-map transforms.")
171
+ ])
172
+ }),
173
+ materialReference: Object.freeze({
174
+ schemaVersion: rendererWavefrontBufferSchemaVersion,
175
+ recordName: "MaterialReferenceRecord",
176
+ fields: Object.freeze([
177
+ createWavefrontField("materialRefId", "u32", "Stable material lookup identifier."),
178
+ createWavefrontField("materialId", "u32", "Authoritative material id from scene submission."),
179
+ createWavefrontField("shadingModel", "u32", "Renderer-owned shading model enum."),
180
+ createWavefrontField("textureSetId", "u32", "Texture indirection set for the material."),
181
+ createWavefrontField("flags", "u32", "Alpha, emissive, transmission, and debug flags.")
182
+ ])
183
+ }),
184
+ mediumReference: Object.freeze({
185
+ schemaVersion: rendererWavefrontBufferSchemaVersion,
186
+ recordName: "MediumReferenceRecord",
187
+ fields: Object.freeze([
188
+ createWavefrontField("mediumRefId", "u32", "Stable medium lookup identifier."),
189
+ createWavefrontField("mediumId", "u32", "Authoritative medium or fluid descriptor id."),
190
+ createWavefrontField("phaseModel", "u32", "Medium phase-function selector."),
191
+ createWavefrontField("absorption", "vec3<f32>", "Absorption coefficients for the active medium."),
192
+ createWavefrontField("scattering", "vec3<f32>", "Scattering coefficients for the active medium.")
193
+ ])
194
+ }),
195
+ accumulation: Object.freeze({
196
+ schemaVersion: rendererWavefrontBufferSchemaVersion,
197
+ recordName: "AccumulationRecord",
198
+ fields: Object.freeze([
199
+ createWavefrontField("sourcePixelId", "u32", "Screen pixel or texel accumulator owner."),
200
+ createWavefrontField("sampleCount", "u32", "Committed sample count for the pixel."),
201
+ createWavefrontField("radiance", "vec3<f32>", "Accumulated radiance before tone-map/output resolve."),
202
+ createWavefrontField("throughput", "vec3<f32>", "Last surviving throughput for debug and variance tracking."),
203
+ createWavefrontField("resetEpoch", "u32", "Accumulation reset generation for history invalidation.")
204
+ ])
205
+ })
206
+ });
207
+ function buildWavefrontTerminationPolicy() {
208
+ return Object.freeze({
209
+ terminalHitTypes: Object.freeze(["emissive", "environment", "miss"]),
210
+ continuationHitTypes: Object.freeze(["surface", "transparent"]),
211
+ emissive: Object.freeze({
212
+ action: "accumulate-and-stop",
213
+ contributesRadiance: true
214
+ }),
215
+ environment: Object.freeze({
216
+ action: "accumulate-and-stop",
217
+ contributesRadiance: true
218
+ }),
219
+ miss: Object.freeze({
220
+ action: "accumulate-environment-or-dark-stop",
221
+ contributesRadiance: true
222
+ })
223
+ });
224
+ }
225
+ function buildWavefrontBounceSchedule(maxDepth) {
226
+ return Object.freeze(
227
+ Array.from(
228
+ { length: maxDepth },
229
+ (_, index) => Object.freeze({
230
+ bounce: index,
231
+ readQueue: index % 2 === 0 ? "active" : "next",
232
+ writeQueue: index % 2 === 0 ? "next" : "active",
233
+ passOrder: rendererWavefrontPassOrder
234
+ })
235
+ )
236
+ );
237
+ }
238
+ function createWavefrontPathTracingPlan(options = {}) {
239
+ const maxDepth = options.maxDepth === void 0 ? 6 : readPositiveInteger("maxDepth", options.maxDepth);
240
+ const queueCapacity = options.queueCapacity === void 0 ? 8192 : readPositiveInteger("queueCapacity", options.queueCapacity);
241
+ const accumulationResetEpoch = options.accumulationResetEpoch === void 0 ? 0 : readNonNegativeInteger("accumulationResetEpoch", options.accumulationResetEpoch);
242
+ const explicitLightSampling = options.explicitLightSampling === true;
243
+ return Object.freeze({
244
+ schemaVersion: rendererWavefrontBufferSchemaVersion,
245
+ owner: rendererDebugOwner,
246
+ maxDepth,
247
+ queueCapacity,
248
+ explicitLightSampling,
249
+ accumulationResetEpoch,
250
+ queueLayout: Object.freeze({
251
+ strategy: rendererWavefrontQueuePairStrategy,
252
+ compactAfterScatter: true,
253
+ queues: Object.freeze([
254
+ Object.freeze({ name: "active", role: "current-bounce" }),
255
+ Object.freeze({ name: "next", role: "next-bounce" })
256
+ ])
257
+ }),
258
+ bufferContracts: rendererWavefrontBufferContracts,
259
+ bounceSchedule: buildWavefrontBounceSchedule(maxDepth),
260
+ terminationPolicy: buildWavefrontTerminationPolicy()
261
+ });
262
+ }
99
263
  function buildRendererWorkerBudgetLevels(jobType, queueClass, levels) {
100
264
  return Object.freeze(
101
265
  levels.map(
@@ -633,6 +797,7 @@ function createRayTracingRenderPlan(options = {}) {
633
797
  renderStages: workerManifest.renderStages,
634
798
  representationBands: representations,
635
799
  accelerationStructureUpdates: workerManifest.accelerationStructureUpdates,
800
+ wavefront: createWavefrontPathTracingPlan(options.wavefront),
636
801
  workerManifest
637
802
  });
638
803
  }
@@ -680,6 +845,18 @@ function readPositiveNumber(name, value) {
680
845
  }
681
846
  return value;
682
847
  }
848
+ function readPositiveInteger(name, value) {
849
+ if (!Number.isInteger(value) || value <= 0) {
850
+ throw new Error(`${name} must be a positive integer.`);
851
+ }
852
+ return value;
853
+ }
854
+ function readNonNegativeInteger(name, value) {
855
+ if (!Number.isInteger(value) || value < 0) {
856
+ throw new Error(`${name} must be a non-negative integer.`);
857
+ }
858
+ return value;
859
+ }
683
860
  function now() {
684
861
  if (typeof performance !== "undefined" && typeof performance.now === "function") {
685
862
  return performance.now();
@@ -1111,6 +1288,7 @@ export {
1111
1288
  createGpuRenderer,
1112
1289
  createRayTracingRenderPlan,
1113
1290
  createRendererDebugHooks,
1291
+ createWavefrontPathTracingPlan,
1114
1292
  defaultRendererClearColor,
1115
1293
  defaultRendererWorkerProfile,
1116
1294
  getRendererWorkerManifest,
@@ -1119,6 +1297,10 @@ export {
1119
1297
  rendererDebugOwner,
1120
1298
  rendererRayTracingStageOrder,
1121
1299
  rendererRepresentationBands,
1300
+ rendererWavefrontBufferSchemaVersion,
1301
+ rendererWavefrontHitTypes,
1302
+ rendererWavefrontPassOrder,
1303
+ rendererWavefrontQueuePairStrategy,
1122
1304
  rendererWorkerManifests,
1123
1305
  rendererWorkerProfileNames,
1124
1306
  rendererWorkerProfiles,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"sourcesContent":["const DEFAULT_CLEAR_COLOR = Object.freeze([0.07, 0.11, 0.18, 1.0]);\nconst DEFAULT_CANVAS_SELECTOR = \"canvas[data-plasius-gpu-renderer]\";\nexport const rendererDebugOwner = \"renderer\";\nexport const rendererWorkerQueueClass = \"render\";\nexport const defaultRendererWorkerProfile = \"realtime\";\nexport const rendererRepresentationBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]);\nexport const rendererAccelerationStructureUpdateClasses = Object.freeze([\n \"static\",\n \"rigid-dynamic\",\n \"deforming\",\n \"proxy\",\n]);\nexport const rendererRayTracingStageOrder = Object.freeze([\n \"primaryVisibility\",\n \"shadowAssist\",\n \"opaqueFoundation\",\n \"rtDirectLighting\",\n \"rtReflections\",\n \"rtGlobalIllumination\",\n \"denoiseTemporal\",\n \"transparents\",\n \"composition\",\n \"present\",\n]);\n\nconst rendererRayTracingStageDefinitions = Object.freeze(\n rendererRayTracingStageOrder.map((key, index) =>\n Object.freeze({\n key,\n order: index + 1,\n required: true,\n description:\n {\n primaryVisibility: \"Primary visibility and depth preparation.\",\n shadowAssist: \"Shadow assist passes and regional shadow preparation.\",\n opaqueFoundation: \"Main opaque foundation for shading and tracing inputs.\",\n rtDirectLighting: \"Ray-traced direct lighting and premium shadows.\",\n rtReflections: \"Ray-traced reflections for important surfaces.\",\n rtGlobalIllumination: \"Selective ray-traced indirect lighting and GI.\",\n denoiseTemporal: \"Required denoise and temporal accumulation stage.\",\n transparents: \"Transparents, particles, and volumetrics composition.\",\n composition: \"Final world composition and color resolve.\",\n present: \"Presentation to the active surface.\",\n }[key],\n })\n )\n);\n\nconst rendererRepresentationBandPolicies = Object.freeze({\n near: Object.freeze({\n band: \"near\",\n rasterMode: \"full-live\",\n rtParticipation: \"premium\",\n shadowSource: \"ray-traced-primary\",\n temporalReuse: \"balanced\",\n updateCadenceDivisor: 1,\n }),\n mid: Object.freeze({\n band: \"mid\",\n rasterMode: \"simplified-live\",\n rtParticipation: \"selective\",\n shadowSource: \"regional-raster-and-proxy\",\n temporalReuse: \"aggressive\",\n updateCadenceDivisor: 2,\n }),\n far: Object.freeze({\n band: \"far\",\n rasterMode: \"proxy-or-cached\",\n rtParticipation: \"proxy\",\n shadowSource: \"merged-proxy-casters\",\n temporalReuse: \"high\",\n updateCadenceDivisor: 8,\n }),\n horizon: Object.freeze({\n band: \"horizon\",\n rasterMode: \"horizon-shell\",\n rtParticipation: \"disabled\",\n shadowSource: \"baked-impression\",\n temporalReuse: \"cached\",\n updateCadenceDivisor: 60,\n }),\n});\n\nconst rendererAccelerationStructurePolicies = Object.freeze(\n rendererAccelerationStructureUpdateClasses.map((updateClass) =>\n Object.freeze({\n updateClass,\n description:\n {\n static: \"Stable static world geometry with infrequent rebuilds.\",\n \"rigid-dynamic\":\n \"Rigid transforms that can be refit or relinked without full deformation updates.\",\n deforming:\n \"Skinned or vertex-deforming content treated as a managed RT cost center.\",\n proxy:\n \"Low-cost RT proxy or distant representation updates.\",\n }[updateClass],\n })\n )\n);\n\nfunction buildRendererWorkerBudgetLevels(jobType, queueClass, levels) {\n return Object.freeze(\n levels.map((level) =>\n Object.freeze({\n id: level.id,\n estimatedCostMs: level.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: level.config.maxDispatchesPerFrame,\n maxJobsPerDispatch: level.config.maxJobsPerDispatch,\n cadenceDivisor: level.config.cadenceDivisor,\n workgroupScale: level.config.workgroupScale,\n maxQueueDepth: level.config.maxQueueDepth,\n metadata: Object.freeze({\n owner: rendererDebugOwner,\n queueClass,\n jobType,\n quality: level.id,\n }),\n }),\n })\n )\n );\n}\n\nconst rendererWorkerProfileSpecs = {\n realtime: {\n description:\n \"Frame-stage DAG for flat rendering with visibility, main encode, post-processing, and submit.\",\n suggestedAllocationIds: [\n \"renderer.surface.current\",\n \"renderer.visibility.worklist\",\n \"renderer.post-process.history\",\n ],\n jobs: {\n acquire: {\n priority: 5,\n dependencies: [],\n domain: \"resolution\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n visibility: {\n priority: 4,\n dependencies: [],\n domain: \"geometry\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.4,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.8,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 384,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.2,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 512,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.visibility.worklist\"],\n },\n mainEncode: {\n priority: 4,\n dependencies: [\"acquire\", \"visibility\"],\n domain: \"geometry\",\n importance: \"critical\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 1.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.6,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 2.1,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 3,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n postProcess: {\n priority: 3,\n dependencies: [\"mainEncode\"],\n domain: \"post-processing\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.5,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.9,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 128,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.4,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.post-process.history\"],\n },\n submit: {\n priority: 2,\n dependencies: [\"postProcess\"],\n domain: \"resolution\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n },\n },\n xr: {\n description:\n \"Frame-stage DAG for XR rendering with late-latch coordination before main encode and submit.\",\n suggestedAllocationIds: [\n \"renderer.xr.surface.current\",\n \"renderer.xr.visibility.worklist\",\n ],\n jobs: {\n acquire: {\n priority: 5,\n dependencies: [],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n visibility: {\n priority: 4,\n dependencies: [],\n domain: \"geometry\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.5,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.9,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.3,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 320,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.visibility.worklist\"],\n },\n lateLatch: {\n priority: 5,\n dependencies: [\"acquire\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.15,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n mainEncode: {\n priority: 4,\n dependencies: [\"visibility\", \"lateLatch\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 1.1,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 0.6,\n maxQueueDepth: 128,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 1.8,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 2.6,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n submit: {\n priority: 2,\n dependencies: [\"mainEncode\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n },\n },\n};\n\nfunction buildRendererInputBoundary(profile) {\n return Object.freeze({\n type: \"stable-visual-snapshot\",\n owner: rendererDebugOwner,\n profile,\n authority: \"visual\",\n source: \"scene-preparation\",\n stable: true,\n });\n}\n\nfunction buildRendererRenderStages(profile) {\n return Object.freeze(\n rendererRayTracingStageDefinitions.map((stage) =>\n Object.freeze({\n ...stage,\n profile,\n workerJobKeys:\n profile === \"xr\" && stage.key === \"primaryVisibility\"\n ? Object.freeze([\"lateLatch\", \"visibility\"])\n : stage.key === \"present\"\n ? Object.freeze([\"submit\"])\n : stage.key === \"denoiseTemporal\" ||\n stage.key === \"transparents\" ||\n stage.key === \"composition\"\n ? Object.freeze([\"postProcess\"])\n : stage.key === \"primaryVisibility\"\n ? Object.freeze([\"visibility\"])\n : stage.key === \"shadowAssist\" ||\n stage.key === \"opaqueFoundation\" ||\n stage.key === \"rtDirectLighting\" ||\n stage.key === \"rtReflections\" ||\n stage.key === \"rtGlobalIllumination\"\n ? Object.freeze([\"mainEncode\"])\n : Object.freeze([\"mainEncode\"]),\n })\n )\n );\n}\n\nfunction buildRendererRepresentationBands(profile) {\n return Object.freeze(\n rendererRepresentationBands.map((band) =>\n Object.freeze({\n ...rendererRepresentationBandPolicies[band],\n profile,\n })\n )\n );\n}\n\nfunction buildRendererAccelerationStructureUpdates(profile) {\n return Object.freeze(\n rendererAccelerationStructurePolicies.map((policy) =>\n Object.freeze({\n ...policy,\n profile,\n })\n )\n );\n}\n\nfunction assertRendererIdentifier(name, value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n return value.trim();\n}\n\nfunction buildRendererWorkerProfile(name, spec) {\n return Object.freeze({\n name,\n description: spec.description,\n jobs: Object.freeze(Object.keys(spec.jobs)),\n });\n}\n\nfunction buildRendererWorkerManifestJob(profileName, jobName, spec) {\n const label = `renderer.${profileName}.${jobName}`;\n return Object.freeze({\n key: jobName,\n label,\n worker: Object.freeze({\n jobType: label,\n queueClass: rendererWorkerQueueClass,\n priority: spec.priority,\n dependencies: Object.freeze(\n spec.dependencies.map((dependency) => `renderer.${profileName}.${dependency}`)\n ),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: label,\n jobType: label,\n queueClass: rendererWorkerQueueClass,\n domain: spec.domain,\n authority: \"visual\",\n importance: spec.importance,\n levels: buildRendererWorkerBudgetLevels(\n label,\n rendererWorkerQueueClass,\n spec.levels\n ),\n }),\n debug: Object.freeze({\n owner: rendererDebugOwner,\n queueClass: rendererWorkerQueueClass,\n jobType: label,\n tags: Object.freeze([\"renderer\", profileName, jobName, spec.domain]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildRendererWorkerManifest(name, spec) {\n return Object.freeze({\n schemaVersion: 1,\n owner: rendererDebugOwner,\n profile: name,\n description: spec.description,\n queueClass: rendererWorkerQueueClass,\n schedulerMode: \"dag\",\n inputBoundary: buildRendererInputBoundary(name),\n renderStages: buildRendererRenderStages(name),\n representationBands: buildRendererRepresentationBands(name),\n accelerationStructureUpdates: buildRendererAccelerationStructureUpdates(name),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([jobName, jobSpec]) =>\n buildRendererWorkerManifestJob(name, jobName, jobSpec)\n )\n ),\n });\n}\n\nexport const rendererWorkerProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(rendererWorkerProfileSpecs).map(([name, spec]) => [\n name,\n buildRendererWorkerProfile(name, spec),\n ])\n )\n);\n\nexport const rendererWorkerProfileNames = Object.freeze(\n Object.keys(rendererWorkerProfiles)\n);\n\nexport const rendererWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(rendererWorkerProfileSpecs).map(([name, spec]) => [\n name,\n buildRendererWorkerManifest(name, spec),\n ])\n )\n);\n\nexport function getRendererWorkerProfile(name = defaultRendererWorkerProfile) {\n const profile = rendererWorkerProfiles[name];\n if (!profile) {\n const available = rendererWorkerProfileNames.join(\", \");\n throw new Error(`Unknown renderer worker profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nexport function getRendererWorkerManifest(name = defaultRendererWorkerProfile) {\n const manifest = rendererWorkerManifests[name];\n if (!manifest) {\n const available = rendererWorkerProfileNames.join(\", \");\n throw new Error(`Unknown renderer worker profile \"${name}\". Available: ${available}.`);\n }\n return manifest;\n}\n\nexport function createRayTracingRenderPlan(options = {}) {\n const profile = options.profile ?? defaultRendererWorkerProfile;\n const snapshotId = assertRendererIdentifier(\n \"snapshotId\",\n options.snapshotId\n );\n const workerManifest = getRendererWorkerManifest(profile);\n const representations = Array.isArray(options.representations)\n ? Object.freeze(\n options.representations.map((representation, index) => {\n if (!representation || typeof representation !== \"object\") {\n throw new Error(`representations[${index}] must be an object.`);\n }\n const band = assertRendererIdentifier(\n `representations[${index}].band`,\n representation.band\n );\n if (!rendererRepresentationBands.includes(band)) {\n throw new Error(\n `representations[${index}].band must be one of: ${rendererRepresentationBands.join(\", \")}.`\n );\n }\n return Object.freeze({\n ...representation,\n band,\n });\n })\n )\n : workerManifest.representationBands;\n\n return Object.freeze({\n schemaVersion: 1,\n owner: rendererDebugOwner,\n profile,\n inputBoundary: Object.freeze({\n ...workerManifest.inputBoundary,\n snapshotId,\n }),\n renderStages: workerManifest.renderStages,\n representationBands: representations,\n accelerationStructureUpdates: workerManifest.accelerationStructureUpdates,\n workerManifest,\n });\n}\n\nfunction clamp01(value) {\n return Math.min(1, Math.max(0, value));\n}\n\nfunction parseHexChannel(channel) {\n return parseInt(channel, 16) / 255;\n}\n\nfunction normalizeColor(value) {\n if (Array.isArray(value)) {\n const [r = 0, g = 0, b = 0, a = 1] = value;\n return [clamp01(Number(r) || 0), clamp01(Number(g) || 0), clamp01(Number(b) || 0), clamp01(Number(a) || 0)];\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (/^#[0-9a-f]{3}$/i.test(trimmed)) {\n const r = trimmed[1];\n const g = trimmed[2];\n const b = trimmed[3];\n return [\n parseHexChannel(r + r),\n parseHexChannel(g + g),\n parseHexChannel(b + b),\n 1,\n ];\n }\n if (/^#[0-9a-f]{6}$/i.test(trimmed)) {\n return [\n parseHexChannel(trimmed.slice(1, 3)),\n parseHexChannel(trimmed.slice(3, 5)),\n parseHexChannel(trimmed.slice(5, 7)),\n 1,\n ];\n }\n }\n\n return [...DEFAULT_CLEAR_COLOR];\n}\n\nfunction readPositiveNumber(name, value) {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a finite number greater than zero.`);\n }\n return value;\n}\n\nfunction now() {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction normalizeFrameId(value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(\"frameIdFactory must return a non-empty string.\");\n }\n return value.trim();\n}\n\nfunction resolveTargetFrameTimeMs(options, event) {\n const {\n targetFrameTimeMs: fixedTargetFrameTimeMs,\n targetFrameRate,\n getTargetFrameTimeMs,\n } = options;\n\n if (typeof getTargetFrameTimeMs === \"function\") {\n const resolved = getTargetFrameTimeMs(event);\n return readPositiveNumber(\"getTargetFrameTimeMs()\", resolved);\n }\n\n if (fixedTargetFrameTimeMs !== undefined) {\n return fixedTargetFrameTimeMs;\n }\n\n if (targetFrameRate !== undefined) {\n return 1000 / targetFrameRate;\n }\n\n return undefined;\n}\n\nexport function createRendererDebugHooks(options = {}) {\n const {\n debugSession,\n targetFrameTimeMs,\n targetFrameRate,\n getTargetFrameTimeMs,\n onFrameStart,\n onFrameComplete,\n } = options;\n\n if (!debugSession || typeof debugSession.recordFrame !== \"function\") {\n throw new Error(\n \"debugSession must expose recordFrame(sample). Use @plasius/gpu-debug createGpuDebugSession().\"\n );\n }\n\n const fixedTargetFrameTimeMs = readPositiveNumber(\n \"targetFrameTimeMs\",\n targetFrameTimeMs\n );\n const fixedTargetFrameRate = readPositiveNumber(\n \"targetFrameRate\",\n targetFrameRate\n );\n\n if (\n fixedTargetFrameTimeMs !== undefined &&\n fixedTargetFrameRate !== undefined\n ) {\n throw new Error(\n \"Provide either targetFrameTimeMs or targetFrameRate, not both.\"\n );\n }\n\n if (\n getTargetFrameTimeMs !== undefined &&\n typeof getTargetFrameTimeMs !== \"function\"\n ) {\n throw new Error(\"getTargetFrameTimeMs must be a function when provided.\");\n }\n\n const resolvedOptions = {\n targetFrameTimeMs: fixedTargetFrameTimeMs,\n targetFrameRate: fixedTargetFrameRate,\n getTargetFrameTimeMs,\n };\n\n return {\n onFrameStart(event) {\n if (typeof onFrameStart === \"function\") {\n onFrameStart({\n ...event,\n owner: rendererDebugOwner,\n });\n }\n },\n onFrameComplete(event) {\n const resolvedTargetFrameTimeMs = resolveTargetFrameTimeMs(\n resolvedOptions,\n event\n );\n\n if (\n typeof event.frameTimeMs === \"number\" &&\n Number.isFinite(event.frameTimeMs) &&\n event.frameTimeMs > 0\n ) {\n debugSession.recordFrame({\n frameId: event.frameId,\n frameTimeMs: event.frameTimeMs,\n targetFrameTimeMs: resolvedTargetFrameTimeMs,\n });\n }\n\n if (typeof onFrameComplete === \"function\") {\n onFrameComplete({\n ...event,\n owner: rendererDebugOwner,\n targetFrameTimeMs: resolvedTargetFrameTimeMs,\n });\n }\n },\n };\n}\n\nfunction readNavigator(navigatorOverride) {\n const currentNavigator = navigatorOverride ?? globalThis.navigator;\n if (!currentNavigator || typeof currentNavigator !== \"object\") {\n throw new Error(\"Navigator unavailable. Provide a browser-like navigator object.\");\n }\n return currentNavigator;\n}\n\nfunction readDocument(documentOverride) {\n const doc = documentOverride ?? globalThis.document;\n if (!doc || typeof doc !== \"object\") {\n throw new Error(\"Document unavailable. Provide a browser-like document object.\");\n }\n return doc;\n}\n\nfunction resolveCanvas(canvasOrSelector, documentOverride) {\n if (canvasOrSelector && typeof canvasOrSelector === \"object\") {\n return canvasOrSelector;\n }\n\n const doc = readDocument(documentOverride);\n const selector =\n typeof canvasOrSelector === \"string\" && canvasOrSelector.trim().length > 0\n ? canvasOrSelector\n : DEFAULT_CANVAS_SELECTOR;\n const resolved = doc.querySelector(selector);\n if (!resolved) {\n throw new Error(`Unable to find canvas for selector \"${selector}\".`);\n }\n return resolved;\n}\n\nfunction readGpu(navigatorOverride) {\n const currentNavigator = readNavigator(navigatorOverride);\n const gpu = currentNavigator.gpu;\n if (!gpu || typeof gpu.requestAdapter !== \"function\") {\n throw new Error(\"WebGPU runtime unavailable. navigator.gpu is missing.\");\n }\n return gpu;\n}\n\nfunction configureContext(context, device, format, alphaMode) {\n if (typeof context.configure !== \"function\") {\n throw new Error(\"Canvas WebGPU context does not support configure().\");\n }\n context.configure({\n device,\n format,\n alphaMode,\n });\n}\n\nfunction createRenderPassDescriptor(view, clearColor) {\n return {\n colorAttachments: [\n {\n view,\n loadOp: \"clear\",\n clearValue: {\n r: clearColor[0],\n g: clearColor[1],\n b: clearColor[2],\n a: clearColor[3],\n },\n storeOp: \"store\",\n },\n ],\n };\n}\n\nexport function supportsWebGpu(options = {}) {\n try {\n const gpu = readGpu(options.navigator);\n return Boolean(gpu);\n } catch {\n return false;\n }\n}\n\nexport async function createGpuRenderer(options = {}) {\n const {\n canvas,\n navigator: navigatorOverride,\n document: documentOverride,\n powerPreference = \"high-performance\",\n alpha = true,\n format,\n clearColor = DEFAULT_CLEAR_COLOR,\n requestAnimationFrame = globalThis.requestAnimationFrame?.bind(globalThis),\n cancelAnimationFrame = globalThis.cancelAnimationFrame?.bind(globalThis),\n frameIdFactory,\n onFrameStart,\n onBeforeEncode,\n onAfterSubmit,\n onFrameComplete,\n } = options;\n\n const gpu = readGpu(navigatorOverride);\n const adapter = await gpu.requestAdapter({ powerPreference });\n if (!adapter) {\n throw new Error(\"Unable to obtain GPU adapter.\");\n }\n\n const device = await adapter.requestDevice();\n const targetCanvas = resolveCanvas(canvas, documentOverride);\n const context = targetCanvas.getContext?.(\"webgpu\");\n if (!context) {\n throw new Error(\"Unable to obtain WebGPU canvas context.\");\n }\n\n const resolvedFormat =\n format ||\n (typeof gpu.getPreferredCanvasFormat === \"function\"\n ? gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n\n configureContext(context, device, resolvedFormat, alpha ? \"premultiplied\" : \"opaque\");\n\n let running = false;\n let destroyed = false;\n let frame = 0;\n let lastTimestamp = 0;\n let rafId = null;\n let clear = normalizeColor(clearColor);\n let xrActive = false;\n let detachXrBinding = null;\n\n const renderOnce = (timestamp = now()) => {\n if (destroyed) {\n throw new Error(\"Renderer was destroyed.\");\n }\n\n const frameNumber = frame + 1;\n const frameId = normalizeFrameId(\n typeof frameIdFactory === \"function\"\n ? frameIdFactory({\n frame: frameNumber,\n timestamp,\n canvas: targetCanvas,\n xrActive,\n })\n : `renderer.frame.${frameNumber}`\n );\n const frameTimeMs =\n lastTimestamp > 0 ? Math.max(0, timestamp - lastTimestamp) : undefined;\n\n if (typeof onFrameStart === \"function\") {\n onFrameStart({\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n const texture = context.getCurrentTexture?.();\n if (!texture || typeof texture.createView !== \"function\") {\n throw new Error(\"WebGPU context returned an invalid current texture.\");\n }\n\n const encoder = device.createCommandEncoder({\n label: `plasius.gpu-renderer.frame.${frame}`,\n });\n const view = texture.createView();\n\n const pass = encoder.beginRenderPass(createRenderPassDescriptor(view, clear));\n\n if (typeof onBeforeEncode === \"function\") {\n onBeforeEncode({\n frame,\n frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n encoder,\n pass,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n if (typeof pass.end === \"function\") {\n pass.end();\n }\n\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n\n frame = frameNumber;\n lastTimestamp = timestamp;\n\n if (typeof onAfterSubmit === \"function\") {\n onAfterSubmit({\n frame: frameNumber,\n frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n if (typeof onFrameComplete === \"function\") {\n onFrameComplete({\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n return {\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n };\n };\n\n const tick = (timestamp) => {\n if (!running || destroyed) {\n return;\n }\n renderOnce(timestamp);\n if (typeof requestAnimationFrame === \"function\") {\n rafId = requestAnimationFrame(tick);\n }\n };\n\n const start = () => {\n if (destroyed) {\n throw new Error(\"Renderer was destroyed.\");\n }\n if (running) {\n return false;\n }\n running = true;\n if (typeof requestAnimationFrame === \"function\") {\n rafId = requestAnimationFrame(tick);\n } else {\n renderOnce();\n }\n return true;\n };\n\n const stop = () => {\n if (!running) {\n return false;\n }\n running = false;\n if (rafId !== null && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(rafId);\n }\n rafId = null;\n return true;\n };\n\n const resize = (cssWidth, cssHeight, devicePixelRatio = globalThis.devicePixelRatio ?? 1) => {\n const width = Math.max(1, Math.floor(cssWidth * devicePixelRatio));\n const height = Math.max(1, Math.floor(cssHeight * devicePixelRatio));\n targetCanvas.width = width;\n targetCanvas.height = height;\n if (targetCanvas.style) {\n targetCanvas.style.width = `${Math.max(1, Math.floor(cssWidth))}px`;\n targetCanvas.style.height = `${Math.max(1, Math.floor(cssHeight))}px`;\n }\n return { width, height };\n };\n\n const setClearColor = (value) => {\n clear = normalizeColor(value);\n return [...clear];\n };\n\n const setXrActive = (active) => {\n xrActive = Boolean(active);\n };\n\n const getSnapshot = () => {\n const width = Number(targetCanvas.width) || 0;\n const height = Number(targetCanvas.height) || 0;\n return {\n running,\n frame,\n lastTimestamp,\n format: resolvedFormat,\n width,\n height,\n xrActive,\n };\n };\n\n const renderer = {\n canvas: targetCanvas,\n context,\n device,\n format: resolvedFormat,\n renderOnce,\n start,\n stop,\n resize,\n setClearColor,\n setXrActive,\n getSnapshot,\n bindXrManager(xrManager, bindOptions = {}) {\n if (detachXrBinding) {\n detachXrBinding();\n }\n detachXrBinding = bindRendererToXrManager(renderer, xrManager, bindOptions);\n return detachXrBinding;\n },\n destroy() {\n stop();\n destroyed = true;\n if (detachXrBinding) {\n detachXrBinding();\n detachXrBinding = null;\n }\n if (typeof context.unconfigure === \"function\") {\n context.unconfigure();\n }\n },\n };\n\n return renderer;\n}\n\nfunction snapshotFromXrManager(xrManager) {\n if (xrManager && typeof xrManager.getState === \"function\") {\n return xrManager.getState();\n }\n if (xrManager?.store && typeof xrManager.store.getSnapshot === \"function\") {\n return xrManager.store.getSnapshot();\n }\n return null;\n}\n\nexport function bindRendererToXrManager(renderer, xrManager, options = {}) {\n if (!xrManager || typeof xrManager.subscribe !== \"function\") {\n throw new Error(\"XR manager must expose subscribe(listener). Use @plasius/gpu-xr createXrManager().\");\n }\n\n const { onSessionStart, onSessionEnd } = options;\n let previousSession = null;\n\n const applyState = (state) => {\n const session = state?.activeSession ?? null;\n if (session === previousSession) {\n return;\n }\n\n previousSession = session;\n\n if (typeof renderer.setXrActive === \"function\") {\n renderer.setXrActive(Boolean(session));\n }\n\n if (session && typeof onSessionStart === \"function\") {\n onSessionStart(session, renderer);\n }\n\n if (!session && typeof onSessionEnd === \"function\") {\n onSessionEnd(renderer);\n }\n };\n\n applyState(snapshotFromXrManager(xrManager));\n return xrManager.subscribe(applyState);\n}\n\nexport const defaultRendererClearColor = DEFAULT_CLEAR_COLOR;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.js"],"sourcesContent":["const DEFAULT_CLEAR_COLOR = Object.freeze([0.07, 0.11, 0.18, 1.0]);\nconst DEFAULT_CANVAS_SELECTOR = \"canvas[data-plasius-gpu-renderer]\";\nexport const rendererDebugOwner = \"renderer\";\nexport const rendererWorkerQueueClass = \"render\";\nexport const defaultRendererWorkerProfile = \"realtime\";\nexport const rendererRepresentationBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]);\nexport const rendererAccelerationStructureUpdateClasses = Object.freeze([\n \"static\",\n \"rigid-dynamic\",\n \"deforming\",\n \"proxy\",\n]);\nexport const rendererRayTracingStageOrder = Object.freeze([\n \"primaryVisibility\",\n \"shadowAssist\",\n \"opaqueFoundation\",\n \"rtDirectLighting\",\n \"rtReflections\",\n \"rtGlobalIllumination\",\n \"denoiseTemporal\",\n \"transparents\",\n \"composition\",\n \"present\",\n]);\nexport const rendererWavefrontBufferSchemaVersion = 1;\nexport const rendererWavefrontQueuePairStrategy = \"ping-pong-active-next\";\nexport const rendererWavefrontHitTypes = Object.freeze([\n \"surface\",\n \"emissive\",\n \"environment\",\n \"transparent\",\n \"miss\",\n]);\nexport const rendererWavefrontPassOrder = Object.freeze([\n \"generatePrimaryRays\",\n \"intersectActiveQueue\",\n \"resolveSurfaceRecords\",\n \"accumulateTerminalRadiance\",\n \"scatterContinuations\",\n \"compactAndSwapQueues\",\n]);\n\nconst rendererRayTracingStageDefinitions = Object.freeze(\n rendererRayTracingStageOrder.map((key, index) =>\n Object.freeze({\n key,\n order: index + 1,\n required: true,\n description:\n {\n primaryVisibility: \"Primary visibility and depth preparation.\",\n shadowAssist: \"Shadow assist passes and regional shadow preparation.\",\n opaqueFoundation: \"Main opaque foundation for shading and tracing inputs.\",\n rtDirectLighting: \"Ray-traced direct lighting and premium shadows.\",\n rtReflections: \"Ray-traced reflections for important surfaces.\",\n rtGlobalIllumination: \"Selective ray-traced indirect lighting and GI.\",\n denoiseTemporal: \"Required denoise and temporal accumulation stage.\",\n transparents: \"Transparents, particles, and volumetrics composition.\",\n composition: \"Final world composition and color resolve.\",\n present: \"Presentation to the active surface.\",\n }[key],\n })\n )\n);\n\nconst rendererRepresentationBandPolicies = Object.freeze({\n near: Object.freeze({\n band: \"near\",\n rasterMode: \"full-live\",\n rtParticipation: \"premium\",\n shadowSource: \"ray-traced-primary\",\n temporalReuse: \"balanced\",\n updateCadenceDivisor: 1,\n }),\n mid: Object.freeze({\n band: \"mid\",\n rasterMode: \"simplified-live\",\n rtParticipation: \"selective\",\n shadowSource: \"regional-raster-and-proxy\",\n temporalReuse: \"aggressive\",\n updateCadenceDivisor: 2,\n }),\n far: Object.freeze({\n band: \"far\",\n rasterMode: \"proxy-or-cached\",\n rtParticipation: \"proxy\",\n shadowSource: \"merged-proxy-casters\",\n temporalReuse: \"high\",\n updateCadenceDivisor: 8,\n }),\n horizon: Object.freeze({\n band: \"horizon\",\n rasterMode: \"horizon-shell\",\n rtParticipation: \"disabled\",\n shadowSource: \"baked-impression\",\n temporalReuse: \"cached\",\n updateCadenceDivisor: 60,\n }),\n});\n\nconst rendererAccelerationStructurePolicies = Object.freeze(\n rendererAccelerationStructureUpdateClasses.map((updateClass) =>\n Object.freeze({\n updateClass,\n description:\n {\n static: \"Stable static world geometry with infrequent rebuilds.\",\n \"rigid-dynamic\":\n \"Rigid transforms that can be refit or relinked without full deformation updates.\",\n deforming:\n \"Skinned or vertex-deforming content treated as a managed RT cost center.\",\n proxy:\n \"Low-cost RT proxy or distant representation updates.\",\n }[updateClass],\n })\n )\n);\n\nfunction createWavefrontField(name, type, description) {\n return Object.freeze({\n name,\n type,\n description,\n });\n}\n\nconst rendererWavefrontBufferContracts = Object.freeze({\n ray: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"RayRecord\",\n fields: Object.freeze([\n createWavefrontField(\"rayId\", \"u32\", \"Stable ray identifier for correlation and debugging.\"),\n createWavefrontField(\"parentRayId\", \"u32\", \"Parent ray identifier for continuation lineage.\"),\n createWavefrontField(\"sourcePixelId\", \"u32\", \"Screen pixel or texel that owns the sample.\"),\n createWavefrontField(\"sampleId\", \"u32\", \"Per-pixel sample slot for accumulation.\"),\n createWavefrontField(\"bounce\", \"u32\", \"Breadth-first bounce depth for the queue entry.\"),\n createWavefrontField(\"origin\", \"vec3<f32>\", \"Ray origin in renderer world space.\"),\n createWavefrontField(\"direction\", \"vec3<f32>\", \"Normalized ray direction in renderer world space.\"),\n createWavefrontField(\"throughput\", \"vec3<f32>\", \"Current path throughput before the next event.\"),\n createWavefrontField(\"mediumRefId\", \"u32\", \"Active medium reference identifier for the ray.\"),\n createWavefrontField(\"flags\", \"u32\", \"Bit flags for front-face state, debug, and quality toggles.\"),\n ]),\n }),\n hit: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"HitRecord\",\n fields: Object.freeze([\n createWavefrontField(\"rayId\", \"u32\", \"Ray identifier copied from the active queue.\"),\n createWavefrontField(\"sourcePixelId\", \"u32\", \"Pixel/texel owner for the ray sample.\"),\n createWavefrontField(\"hitType\", rendererWavefrontHitTypes.join(\" | \"), \"Resolved hit classification for termination or continuation.\"),\n createWavefrontField(\"distance\", \"f32\", \"Nearest-hit distance or miss sentinel.\"),\n createWavefrontField(\"entityId\", \"u32\", \"Stable scene entity identifier.\"),\n createWavefrontField(\"instanceId\", \"u32\", \"Renderer instance identifier.\"),\n createWavefrontField(\"primitiveId\", \"u32\", \"Primitive or triangle identifier.\"),\n createWavefrontField(\"materialId\", \"u32\", \"Surface material identifier.\"),\n createWavefrontField(\"barycentrics\", \"vec3<f32>\", \"Triangle barycentric coordinates for interpolation.\"),\n createWavefrontField(\"uv\", \"vec2<f32>\", \"Resolved surface UV when available.\"),\n createWavefrontField(\"geometricNormal\", \"vec3<f32>\", \"True geometric face normal.\"),\n createWavefrontField(\"shadingNormal\", \"vec3<f32>\", \"Interpolated or repaired shading normal.\"),\n createWavefrontField(\"frontFace\", \"bool\", \"Front-face classification for shading and medium transitions.\"),\n ]),\n }),\n surface: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"SurfaceRecord\",\n fields: Object.freeze([\n createWavefrontField(\"rayId\", \"u32\", \"Ray identifier matched to the resolved hit.\"),\n createWavefrontField(\"entityId\", \"u32\", \"Stable scene entity identifier.\"),\n createWavefrontField(\"materialRefId\", \"u32\", \"Material-reference indirection for shading lookup tables.\"),\n createWavefrontField(\"mediumRefId\", \"u32\", \"Resolved medium transition/reference identifier.\"),\n createWavefrontField(\"geometricNormal\", \"vec3<f32>\", \"Preserved geometric normal for hemisphere checks.\"),\n createWavefrontField(\"shadingNormal\", \"vec3<f32>\", \"Normal used for BSDF/BTDF evaluation.\"),\n createWavefrontField(\"uv\", \"vec2<f32>\", \"Resolved texture coordinate.\"),\n createWavefrontField(\"tangentFrame\", \"mat3x3<f32>\", \"Optional tangent basis for normal-map transforms.\"),\n ]),\n }),\n materialReference: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"MaterialReferenceRecord\",\n fields: Object.freeze([\n createWavefrontField(\"materialRefId\", \"u32\", \"Stable material lookup identifier.\"),\n createWavefrontField(\"materialId\", \"u32\", \"Authoritative material id from scene submission.\"),\n createWavefrontField(\"shadingModel\", \"u32\", \"Renderer-owned shading model enum.\"),\n createWavefrontField(\"textureSetId\", \"u32\", \"Texture indirection set for the material.\"),\n createWavefrontField(\"flags\", \"u32\", \"Alpha, emissive, transmission, and debug flags.\"),\n ]),\n }),\n mediumReference: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"MediumReferenceRecord\",\n fields: Object.freeze([\n createWavefrontField(\"mediumRefId\", \"u32\", \"Stable medium lookup identifier.\"),\n createWavefrontField(\"mediumId\", \"u32\", \"Authoritative medium or fluid descriptor id.\"),\n createWavefrontField(\"phaseModel\", \"u32\", \"Medium phase-function selector.\"),\n createWavefrontField(\"absorption\", \"vec3<f32>\", \"Absorption coefficients for the active medium.\"),\n createWavefrontField(\"scattering\", \"vec3<f32>\", \"Scattering coefficients for the active medium.\"),\n ]),\n }),\n accumulation: Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n recordName: \"AccumulationRecord\",\n fields: Object.freeze([\n createWavefrontField(\"sourcePixelId\", \"u32\", \"Screen pixel or texel accumulator owner.\"),\n createWavefrontField(\"sampleCount\", \"u32\", \"Committed sample count for the pixel.\"),\n createWavefrontField(\"radiance\", \"vec3<f32>\", \"Accumulated radiance before tone-map/output resolve.\"),\n createWavefrontField(\"throughput\", \"vec3<f32>\", \"Last surviving throughput for debug and variance tracking.\"),\n createWavefrontField(\"resetEpoch\", \"u32\", \"Accumulation reset generation for history invalidation.\"),\n ]),\n }),\n});\n\nfunction buildWavefrontTerminationPolicy() {\n return Object.freeze({\n terminalHitTypes: Object.freeze([\"emissive\", \"environment\", \"miss\"]),\n continuationHitTypes: Object.freeze([\"surface\", \"transparent\"]),\n emissive: Object.freeze({\n action: \"accumulate-and-stop\",\n contributesRadiance: true,\n }),\n environment: Object.freeze({\n action: \"accumulate-and-stop\",\n contributesRadiance: true,\n }),\n miss: Object.freeze({\n action: \"accumulate-environment-or-dark-stop\",\n contributesRadiance: true,\n }),\n });\n}\n\nfunction buildWavefrontBounceSchedule(maxDepth) {\n return Object.freeze(\n Array.from({ length: maxDepth }, (_, index) =>\n Object.freeze({\n bounce: index,\n readQueue: index % 2 === 0 ? \"active\" : \"next\",\n writeQueue: index % 2 === 0 ? \"next\" : \"active\",\n passOrder: rendererWavefrontPassOrder,\n })\n )\n );\n}\n\nexport function createWavefrontPathTracingPlan(options = {}) {\n const maxDepth =\n options.maxDepth === undefined\n ? 6\n : readPositiveInteger(\"maxDepth\", options.maxDepth);\n const queueCapacity =\n options.queueCapacity === undefined\n ? 8192\n : readPositiveInteger(\"queueCapacity\", options.queueCapacity);\n const accumulationResetEpoch =\n options.accumulationResetEpoch === undefined\n ? 0\n : readNonNegativeInteger(\"accumulationResetEpoch\", options.accumulationResetEpoch);\n const explicitLightSampling = options.explicitLightSampling === true;\n\n return Object.freeze({\n schemaVersion: rendererWavefrontBufferSchemaVersion,\n owner: rendererDebugOwner,\n maxDepth,\n queueCapacity,\n explicitLightSampling,\n accumulationResetEpoch,\n queueLayout: Object.freeze({\n strategy: rendererWavefrontQueuePairStrategy,\n compactAfterScatter: true,\n queues: Object.freeze([\n Object.freeze({ name: \"active\", role: \"current-bounce\" }),\n Object.freeze({ name: \"next\", role: \"next-bounce\" }),\n ]),\n }),\n bufferContracts: rendererWavefrontBufferContracts,\n bounceSchedule: buildWavefrontBounceSchedule(maxDepth),\n terminationPolicy: buildWavefrontTerminationPolicy(),\n });\n}\n\nfunction buildRendererWorkerBudgetLevels(jobType, queueClass, levels) {\n return Object.freeze(\n levels.map((level) =>\n Object.freeze({\n id: level.id,\n estimatedCostMs: level.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: level.config.maxDispatchesPerFrame,\n maxJobsPerDispatch: level.config.maxJobsPerDispatch,\n cadenceDivisor: level.config.cadenceDivisor,\n workgroupScale: level.config.workgroupScale,\n maxQueueDepth: level.config.maxQueueDepth,\n metadata: Object.freeze({\n owner: rendererDebugOwner,\n queueClass,\n jobType,\n quality: level.id,\n }),\n }),\n })\n )\n );\n}\n\nconst rendererWorkerProfileSpecs = {\n realtime: {\n description:\n \"Frame-stage DAG for flat rendering with visibility, main encode, post-processing, and submit.\",\n suggestedAllocationIds: [\n \"renderer.surface.current\",\n \"renderer.visibility.worklist\",\n \"renderer.post-process.history\",\n ],\n jobs: {\n acquire: {\n priority: 5,\n dependencies: [],\n domain: \"resolution\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n visibility: {\n priority: 4,\n dependencies: [],\n domain: \"geometry\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.4,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.8,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 384,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.2,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 512,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.visibility.worklist\"],\n },\n mainEncode: {\n priority: 4,\n dependencies: [\"acquire\", \"visibility\"],\n domain: \"geometry\",\n importance: \"critical\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 1.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.6,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 2.1,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 3,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n postProcess: {\n priority: 3,\n dependencies: [\"mainEncode\"],\n domain: \"post-processing\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.5,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.9,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 128,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.4,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.post-process.history\"],\n },\n submit: {\n priority: 2,\n dependencies: [\"postProcess\"],\n domain: \"resolution\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.surface.current\"],\n },\n },\n },\n xr: {\n description:\n \"Frame-stage DAG for XR rendering with late-latch coordination before main encode and submit.\",\n suggestedAllocationIds: [\n \"renderer.xr.surface.current\",\n \"renderer.xr.visibility.worklist\",\n ],\n jobs: {\n acquire: {\n priority: 5,\n dependencies: [],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n visibility: {\n priority: 4,\n dependencies: [],\n domain: \"geometry\",\n importance: \"high\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 0.5,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 0.9,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 1.3,\n config: {\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 320,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.visibility.worklist\"],\n },\n lateLatch: {\n priority: 5,\n dependencies: [\"acquire\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.15,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n mainEncode: {\n priority: 4,\n dependencies: [\"visibility\", \"lateLatch\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"low\",\n estimatedCostMs: 1.1,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 0.6,\n maxQueueDepth: 128,\n },\n },\n {\n id: \"medium\",\n estimatedCostMs: 1.8,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 192,\n },\n },\n {\n id: \"high\",\n estimatedCostMs: 2.6,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n submit: {\n priority: 2,\n dependencies: [\"mainEncode\"],\n domain: \"xr\",\n importance: \"critical\",\n levels: [\n {\n id: \"fixed\",\n estimatedCostMs: 0.2,\n config: {\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 1,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1,\n },\n },\n ],\n suggestedAllocationIds: [\"renderer.xr.surface.current\"],\n },\n },\n },\n};\n\nfunction buildRendererInputBoundary(profile) {\n return Object.freeze({\n type: \"stable-visual-snapshot\",\n owner: rendererDebugOwner,\n profile,\n authority: \"visual\",\n source: \"scene-preparation\",\n stable: true,\n });\n}\n\nfunction buildRendererRenderStages(profile) {\n return Object.freeze(\n rendererRayTracingStageDefinitions.map((stage) =>\n Object.freeze({\n ...stage,\n profile,\n workerJobKeys:\n profile === \"xr\" && stage.key === \"primaryVisibility\"\n ? Object.freeze([\"lateLatch\", \"visibility\"])\n : stage.key === \"present\"\n ? Object.freeze([\"submit\"])\n : stage.key === \"denoiseTemporal\" ||\n stage.key === \"transparents\" ||\n stage.key === \"composition\"\n ? Object.freeze([\"postProcess\"])\n : stage.key === \"primaryVisibility\"\n ? Object.freeze([\"visibility\"])\n : stage.key === \"shadowAssist\" ||\n stage.key === \"opaqueFoundation\" ||\n stage.key === \"rtDirectLighting\" ||\n stage.key === \"rtReflections\" ||\n stage.key === \"rtGlobalIllumination\"\n ? Object.freeze([\"mainEncode\"])\n : Object.freeze([\"mainEncode\"]),\n })\n )\n );\n}\n\nfunction buildRendererRepresentationBands(profile) {\n return Object.freeze(\n rendererRepresentationBands.map((band) =>\n Object.freeze({\n ...rendererRepresentationBandPolicies[band],\n profile,\n })\n )\n );\n}\n\nfunction buildRendererAccelerationStructureUpdates(profile) {\n return Object.freeze(\n rendererAccelerationStructurePolicies.map((policy) =>\n Object.freeze({\n ...policy,\n profile,\n })\n )\n );\n}\n\nfunction assertRendererIdentifier(name, value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n return value.trim();\n}\n\nfunction buildRendererWorkerProfile(name, spec) {\n return Object.freeze({\n name,\n description: spec.description,\n jobs: Object.freeze(Object.keys(spec.jobs)),\n });\n}\n\nfunction buildRendererWorkerManifestJob(profileName, jobName, spec) {\n const label = `renderer.${profileName}.${jobName}`;\n return Object.freeze({\n key: jobName,\n label,\n worker: Object.freeze({\n jobType: label,\n queueClass: rendererWorkerQueueClass,\n priority: spec.priority,\n dependencies: Object.freeze(\n spec.dependencies.map((dependency) => `renderer.${profileName}.${dependency}`)\n ),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: label,\n jobType: label,\n queueClass: rendererWorkerQueueClass,\n domain: spec.domain,\n authority: \"visual\",\n importance: spec.importance,\n levels: buildRendererWorkerBudgetLevels(\n label,\n rendererWorkerQueueClass,\n spec.levels\n ),\n }),\n debug: Object.freeze({\n owner: rendererDebugOwner,\n queueClass: rendererWorkerQueueClass,\n jobType: label,\n tags: Object.freeze([\"renderer\", profileName, jobName, spec.domain]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildRendererWorkerManifest(name, spec) {\n return Object.freeze({\n schemaVersion: 1,\n owner: rendererDebugOwner,\n profile: name,\n description: spec.description,\n queueClass: rendererWorkerQueueClass,\n schedulerMode: \"dag\",\n inputBoundary: buildRendererInputBoundary(name),\n renderStages: buildRendererRenderStages(name),\n representationBands: buildRendererRepresentationBands(name),\n accelerationStructureUpdates: buildRendererAccelerationStructureUpdates(name),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([jobName, jobSpec]) =>\n buildRendererWorkerManifestJob(name, jobName, jobSpec)\n )\n ),\n });\n}\n\nexport const rendererWorkerProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(rendererWorkerProfileSpecs).map(([name, spec]) => [\n name,\n buildRendererWorkerProfile(name, spec),\n ])\n )\n);\n\nexport const rendererWorkerProfileNames = Object.freeze(\n Object.keys(rendererWorkerProfiles)\n);\n\nexport const rendererWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(rendererWorkerProfileSpecs).map(([name, spec]) => [\n name,\n buildRendererWorkerManifest(name, spec),\n ])\n )\n);\n\nexport function getRendererWorkerProfile(name = defaultRendererWorkerProfile) {\n const profile = rendererWorkerProfiles[name];\n if (!profile) {\n const available = rendererWorkerProfileNames.join(\", \");\n throw new Error(`Unknown renderer worker profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nexport function getRendererWorkerManifest(name = defaultRendererWorkerProfile) {\n const manifest = rendererWorkerManifests[name];\n if (!manifest) {\n const available = rendererWorkerProfileNames.join(\", \");\n throw new Error(`Unknown renderer worker profile \"${name}\". Available: ${available}.`);\n }\n return manifest;\n}\n\nexport function createRayTracingRenderPlan(options = {}) {\n const profile = options.profile ?? defaultRendererWorkerProfile;\n const snapshotId = assertRendererIdentifier(\n \"snapshotId\",\n options.snapshotId\n );\n const workerManifest = getRendererWorkerManifest(profile);\n const representations = Array.isArray(options.representations)\n ? Object.freeze(\n options.representations.map((representation, index) => {\n if (!representation || typeof representation !== \"object\") {\n throw new Error(`representations[${index}] must be an object.`);\n }\n const band = assertRendererIdentifier(\n `representations[${index}].band`,\n representation.band\n );\n if (!rendererRepresentationBands.includes(band)) {\n throw new Error(\n `representations[${index}].band must be one of: ${rendererRepresentationBands.join(\", \")}.`\n );\n }\n return Object.freeze({\n ...representation,\n band,\n });\n })\n )\n : workerManifest.representationBands;\n\n return Object.freeze({\n schemaVersion: 1,\n owner: rendererDebugOwner,\n profile,\n inputBoundary: Object.freeze({\n ...workerManifest.inputBoundary,\n snapshotId,\n }),\n renderStages: workerManifest.renderStages,\n representationBands: representations,\n accelerationStructureUpdates: workerManifest.accelerationStructureUpdates,\n wavefront: createWavefrontPathTracingPlan(options.wavefront),\n workerManifest,\n });\n}\n\nfunction clamp01(value) {\n return Math.min(1, Math.max(0, value));\n}\n\nfunction parseHexChannel(channel) {\n return parseInt(channel, 16) / 255;\n}\n\nfunction normalizeColor(value) {\n if (Array.isArray(value)) {\n const [r = 0, g = 0, b = 0, a = 1] = value;\n return [clamp01(Number(r) || 0), clamp01(Number(g) || 0), clamp01(Number(b) || 0), clamp01(Number(a) || 0)];\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (/^#[0-9a-f]{3}$/i.test(trimmed)) {\n const r = trimmed[1];\n const g = trimmed[2];\n const b = trimmed[3];\n return [\n parseHexChannel(r + r),\n parseHexChannel(g + g),\n parseHexChannel(b + b),\n 1,\n ];\n }\n if (/^#[0-9a-f]{6}$/i.test(trimmed)) {\n return [\n parseHexChannel(trimmed.slice(1, 3)),\n parseHexChannel(trimmed.slice(3, 5)),\n parseHexChannel(trimmed.slice(5, 7)),\n 1,\n ];\n }\n }\n\n return [...DEFAULT_CLEAR_COLOR];\n}\n\nfunction readPositiveNumber(name, value) {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a finite number greater than zero.`);\n }\n return value;\n}\n\nfunction readPositiveInteger(name, value) {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer.`);\n }\n return value;\n}\n\nfunction readNonNegativeInteger(name, value) {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be a non-negative integer.`);\n }\n return value;\n}\n\nfunction now() {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction normalizeFrameId(value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(\"frameIdFactory must return a non-empty string.\");\n }\n return value.trim();\n}\n\nfunction resolveTargetFrameTimeMs(options, event) {\n const {\n targetFrameTimeMs: fixedTargetFrameTimeMs,\n targetFrameRate,\n getTargetFrameTimeMs,\n } = options;\n\n if (typeof getTargetFrameTimeMs === \"function\") {\n const resolved = getTargetFrameTimeMs(event);\n return readPositiveNumber(\"getTargetFrameTimeMs()\", resolved);\n }\n\n if (fixedTargetFrameTimeMs !== undefined) {\n return fixedTargetFrameTimeMs;\n }\n\n if (targetFrameRate !== undefined) {\n return 1000 / targetFrameRate;\n }\n\n return undefined;\n}\n\nexport function createRendererDebugHooks(options = {}) {\n const {\n debugSession,\n targetFrameTimeMs,\n targetFrameRate,\n getTargetFrameTimeMs,\n onFrameStart,\n onFrameComplete,\n } = options;\n\n if (!debugSession || typeof debugSession.recordFrame !== \"function\") {\n throw new Error(\n \"debugSession must expose recordFrame(sample). Use @plasius/gpu-debug createGpuDebugSession().\"\n );\n }\n\n const fixedTargetFrameTimeMs = readPositiveNumber(\n \"targetFrameTimeMs\",\n targetFrameTimeMs\n );\n const fixedTargetFrameRate = readPositiveNumber(\n \"targetFrameRate\",\n targetFrameRate\n );\n\n if (\n fixedTargetFrameTimeMs !== undefined &&\n fixedTargetFrameRate !== undefined\n ) {\n throw new Error(\n \"Provide either targetFrameTimeMs or targetFrameRate, not both.\"\n );\n }\n\n if (\n getTargetFrameTimeMs !== undefined &&\n typeof getTargetFrameTimeMs !== \"function\"\n ) {\n throw new Error(\"getTargetFrameTimeMs must be a function when provided.\");\n }\n\n const resolvedOptions = {\n targetFrameTimeMs: fixedTargetFrameTimeMs,\n targetFrameRate: fixedTargetFrameRate,\n getTargetFrameTimeMs,\n };\n\n return {\n onFrameStart(event) {\n if (typeof onFrameStart === \"function\") {\n onFrameStart({\n ...event,\n owner: rendererDebugOwner,\n });\n }\n },\n onFrameComplete(event) {\n const resolvedTargetFrameTimeMs = resolveTargetFrameTimeMs(\n resolvedOptions,\n event\n );\n\n if (\n typeof event.frameTimeMs === \"number\" &&\n Number.isFinite(event.frameTimeMs) &&\n event.frameTimeMs > 0\n ) {\n debugSession.recordFrame({\n frameId: event.frameId,\n frameTimeMs: event.frameTimeMs,\n targetFrameTimeMs: resolvedTargetFrameTimeMs,\n });\n }\n\n if (typeof onFrameComplete === \"function\") {\n onFrameComplete({\n ...event,\n owner: rendererDebugOwner,\n targetFrameTimeMs: resolvedTargetFrameTimeMs,\n });\n }\n },\n };\n}\n\nfunction readNavigator(navigatorOverride) {\n const currentNavigator = navigatorOverride ?? globalThis.navigator;\n if (!currentNavigator || typeof currentNavigator !== \"object\") {\n throw new Error(\"Navigator unavailable. Provide a browser-like navigator object.\");\n }\n return currentNavigator;\n}\n\nfunction readDocument(documentOverride) {\n const doc = documentOverride ?? globalThis.document;\n if (!doc || typeof doc !== \"object\") {\n throw new Error(\"Document unavailable. Provide a browser-like document object.\");\n }\n return doc;\n}\n\nfunction resolveCanvas(canvasOrSelector, documentOverride) {\n if (canvasOrSelector && typeof canvasOrSelector === \"object\") {\n return canvasOrSelector;\n }\n\n const doc = readDocument(documentOverride);\n const selector =\n typeof canvasOrSelector === \"string\" && canvasOrSelector.trim().length > 0\n ? canvasOrSelector\n : DEFAULT_CANVAS_SELECTOR;\n const resolved = doc.querySelector(selector);\n if (!resolved) {\n throw new Error(`Unable to find canvas for selector \"${selector}\".`);\n }\n return resolved;\n}\n\nfunction readGpu(navigatorOverride) {\n const currentNavigator = readNavigator(navigatorOverride);\n const gpu = currentNavigator.gpu;\n if (!gpu || typeof gpu.requestAdapter !== \"function\") {\n throw new Error(\"WebGPU runtime unavailable. navigator.gpu is missing.\");\n }\n return gpu;\n}\n\nfunction configureContext(context, device, format, alphaMode) {\n if (typeof context.configure !== \"function\") {\n throw new Error(\"Canvas WebGPU context does not support configure().\");\n }\n context.configure({\n device,\n format,\n alphaMode,\n });\n}\n\nfunction createRenderPassDescriptor(view, clearColor) {\n return {\n colorAttachments: [\n {\n view,\n loadOp: \"clear\",\n clearValue: {\n r: clearColor[0],\n g: clearColor[1],\n b: clearColor[2],\n a: clearColor[3],\n },\n storeOp: \"store\",\n },\n ],\n };\n}\n\nexport function supportsWebGpu(options = {}) {\n try {\n const gpu = readGpu(options.navigator);\n return Boolean(gpu);\n } catch {\n return false;\n }\n}\n\nexport async function createGpuRenderer(options = {}) {\n const {\n canvas,\n navigator: navigatorOverride,\n document: documentOverride,\n powerPreference = \"high-performance\",\n alpha = true,\n format,\n clearColor = DEFAULT_CLEAR_COLOR,\n requestAnimationFrame = globalThis.requestAnimationFrame?.bind(globalThis),\n cancelAnimationFrame = globalThis.cancelAnimationFrame?.bind(globalThis),\n frameIdFactory,\n onFrameStart,\n onBeforeEncode,\n onAfterSubmit,\n onFrameComplete,\n } = options;\n\n const gpu = readGpu(navigatorOverride);\n const adapter = await gpu.requestAdapter({ powerPreference });\n if (!adapter) {\n throw new Error(\"Unable to obtain GPU adapter.\");\n }\n\n const device = await adapter.requestDevice();\n const targetCanvas = resolveCanvas(canvas, documentOverride);\n const context = targetCanvas.getContext?.(\"webgpu\");\n if (!context) {\n throw new Error(\"Unable to obtain WebGPU canvas context.\");\n }\n\n const resolvedFormat =\n format ||\n (typeof gpu.getPreferredCanvasFormat === \"function\"\n ? gpu.getPreferredCanvasFormat()\n : \"bgra8unorm\");\n\n configureContext(context, device, resolvedFormat, alpha ? \"premultiplied\" : \"opaque\");\n\n let running = false;\n let destroyed = false;\n let frame = 0;\n let lastTimestamp = 0;\n let rafId = null;\n let clear = normalizeColor(clearColor);\n let xrActive = false;\n let detachXrBinding = null;\n\n const renderOnce = (timestamp = now()) => {\n if (destroyed) {\n throw new Error(\"Renderer was destroyed.\");\n }\n\n const frameNumber = frame + 1;\n const frameId = normalizeFrameId(\n typeof frameIdFactory === \"function\"\n ? frameIdFactory({\n frame: frameNumber,\n timestamp,\n canvas: targetCanvas,\n xrActive,\n })\n : `renderer.frame.${frameNumber}`\n );\n const frameTimeMs =\n lastTimestamp > 0 ? Math.max(0, timestamp - lastTimestamp) : undefined;\n\n if (typeof onFrameStart === \"function\") {\n onFrameStart({\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n const texture = context.getCurrentTexture?.();\n if (!texture || typeof texture.createView !== \"function\") {\n throw new Error(\"WebGPU context returned an invalid current texture.\");\n }\n\n const encoder = device.createCommandEncoder({\n label: `plasius.gpu-renderer.frame.${frame}`,\n });\n const view = texture.createView();\n\n const pass = encoder.beginRenderPass(createRenderPassDescriptor(view, clear));\n\n if (typeof onBeforeEncode === \"function\") {\n onBeforeEncode({\n frame,\n frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n encoder,\n pass,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n if (typeof pass.end === \"function\") {\n pass.end();\n }\n\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n\n frame = frameNumber;\n lastTimestamp = timestamp;\n\n if (typeof onAfterSubmit === \"function\") {\n onAfterSubmit({\n frame: frameNumber,\n frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n if (typeof onFrameComplete === \"function\") {\n onFrameComplete({\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n device,\n context,\n canvas: targetCanvas,\n xrActive,\n });\n }\n\n return {\n frame: frameNumber,\n frameId,\n frameTimeMs,\n timestamp,\n };\n };\n\n const tick = (timestamp) => {\n if (!running || destroyed) {\n return;\n }\n renderOnce(timestamp);\n if (typeof requestAnimationFrame === \"function\") {\n rafId = requestAnimationFrame(tick);\n }\n };\n\n const start = () => {\n if (destroyed) {\n throw new Error(\"Renderer was destroyed.\");\n }\n if (running) {\n return false;\n }\n running = true;\n if (typeof requestAnimationFrame === \"function\") {\n rafId = requestAnimationFrame(tick);\n } else {\n renderOnce();\n }\n return true;\n };\n\n const stop = () => {\n if (!running) {\n return false;\n }\n running = false;\n if (rafId !== null && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(rafId);\n }\n rafId = null;\n return true;\n };\n\n const resize = (cssWidth, cssHeight, devicePixelRatio = globalThis.devicePixelRatio ?? 1) => {\n const width = Math.max(1, Math.floor(cssWidth * devicePixelRatio));\n const height = Math.max(1, Math.floor(cssHeight * devicePixelRatio));\n targetCanvas.width = width;\n targetCanvas.height = height;\n if (targetCanvas.style) {\n targetCanvas.style.width = `${Math.max(1, Math.floor(cssWidth))}px`;\n targetCanvas.style.height = `${Math.max(1, Math.floor(cssHeight))}px`;\n }\n return { width, height };\n };\n\n const setClearColor = (value) => {\n clear = normalizeColor(value);\n return [...clear];\n };\n\n const setXrActive = (active) => {\n xrActive = Boolean(active);\n };\n\n const getSnapshot = () => {\n const width = Number(targetCanvas.width) || 0;\n const height = Number(targetCanvas.height) || 0;\n return {\n running,\n frame,\n lastTimestamp,\n format: resolvedFormat,\n width,\n height,\n xrActive,\n };\n };\n\n const renderer = {\n canvas: targetCanvas,\n context,\n device,\n format: resolvedFormat,\n renderOnce,\n start,\n stop,\n resize,\n setClearColor,\n setXrActive,\n getSnapshot,\n bindXrManager(xrManager, bindOptions = {}) {\n if (detachXrBinding) {\n detachXrBinding();\n }\n detachXrBinding = bindRendererToXrManager(renderer, xrManager, bindOptions);\n return detachXrBinding;\n },\n destroy() {\n stop();\n destroyed = true;\n if (detachXrBinding) {\n detachXrBinding();\n detachXrBinding = null;\n }\n if (typeof context.unconfigure === \"function\") {\n context.unconfigure();\n }\n },\n };\n\n return renderer;\n}\n\nfunction snapshotFromXrManager(xrManager) {\n if (xrManager && typeof xrManager.getState === \"function\") {\n return xrManager.getState();\n }\n if (xrManager?.store && typeof xrManager.store.getSnapshot === \"function\") {\n return xrManager.store.getSnapshot();\n }\n return null;\n}\n\nexport function bindRendererToXrManager(renderer, xrManager, options = {}) {\n if (!xrManager || typeof xrManager.subscribe !== \"function\") {\n throw new Error(\"XR manager must expose subscribe(listener). Use @plasius/gpu-xr createXrManager().\");\n }\n\n const { onSessionStart, onSessionEnd } = options;\n let previousSession = null;\n\n const applyState = (state) => {\n const session = state?.activeSession ?? null;\n if (session === previousSession) {\n return;\n }\n\n previousSession = session;\n\n if (typeof renderer.setXrActive === \"function\") {\n renderer.setXrActive(Boolean(session));\n }\n\n if (session && typeof onSessionStart === \"function\") {\n onSessionStart(session, renderer);\n }\n\n if (!session && typeof onSessionEnd === \"function\") {\n onSessionEnd(renderer);\n }\n };\n\n applyState(snapshotFromXrManager(xrManager));\n return xrManager.subscribe(applyState);\n}\n\nexport const defaultRendererClearColor = DEFAULT_CLEAR_COLOR;\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasius/gpu-renderer",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "Framework-agnostic WebGPU renderer runtime for Plasius projects.",
5
5
  "type": "module",
6
6
  "sideEffects": false,