@woosh/meep-engine 3.31.0 → 3.33.0

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.
Files changed (117) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/collection/table/RowFirstTable.d.ts +8 -0
  4. package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
  5. package/src/core/collection/table/RowFirstTable.js +40 -11
  6. package/src/engine/graphics/ecs/sprite/Sprite.d.ts +3 -0
  7. package/src/engine/graphics/ecs/sprite/Sprite.d.ts.map +1 -1
  8. package/src/engine/graphics/ecs/sprite/Sprite.js +3 -0
  9. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts +3 -0
  10. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
  11. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +3 -0
  12. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
  13. package/src/engine/graphics3/DebugDrawSystem.js +6 -2
  14. package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -1
  15. package/src/engine/graphics3/PathDisplaySystem.js +311 -307
  16. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  17. package/src/shade/RENDERER_CONTRACT.md +15 -2
  18. package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +5 -0
  19. package/src/shade/device/ShadeGPUCommandContext.d.ts +15 -2
  20. package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
  21. package/src/shade/device/ShadeGPUCommandContext.js +154 -25
  22. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +20 -3
  23. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
  24. package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +21 -3
  25. package/src/shade/renderer/GraphicsContext.d.ts +20 -1
  26. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  27. package/src/shade/renderer/GraphicsContext.js +105 -52
  28. package/src/shade/renderer/Renderer.d.ts +19 -4
  29. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  30. package/src/shade/renderer/Renderer.js +113 -2
  31. package/src/shade/renderer/animation/GPUAnimationManager.d.ts +10 -7
  32. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  33. package/src/shade/renderer/animation/GPUAnimationManager.js +147 -45
  34. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts +6 -5
  35. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts.map +1 -1
  36. package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.js +241 -240
  37. package/src/shade/renderer/buffer/GPUBufferStagingAllocator.d.ts +62 -2
  38. package/src/shade/renderer/buffer/GPUBufferStagingAllocator.d.ts.map +1 -1
  39. package/src/shade/renderer/buffer/GPUBufferStagingAllocator.js +306 -38
  40. package/src/shade/renderer/buffer/GPUBufferUploadAllocator.d.ts +60 -0
  41. package/src/shade/renderer/buffer/GPUBufferUploadAllocator.d.ts.map +1 -0
  42. package/src/shade/renderer/buffer/GPUBufferUploadAllocator.js +202 -0
  43. package/src/shade/renderer/buffer/GPUUploadBlock.d.ts +68 -0
  44. package/src/shade/renderer/buffer/GPUUploadBlock.d.ts.map +1 -0
  45. package/src/shade/renderer/buffer/GPUUploadBlock.js +97 -0
  46. package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.d.ts +2 -1
  47. package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.d.ts.map +1 -1
  48. package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.js +19 -17
  49. package/src/shade/renderer/dynamic/GPUDynamicMeshDrawList.d.ts +70 -0
  50. package/src/shade/renderer/dynamic/GPUDynamicMeshDrawList.d.ts.map +1 -0
  51. package/src/shade/renderer/dynamic/GPUDynamicMeshDrawList.js +257 -0
  52. package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.d.ts +20 -7
  53. package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.d.ts.map +1 -1
  54. package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.js +39 -41
  55. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +6 -20
  56. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
  57. package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +42 -36
  58. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts +2 -1
  59. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts.map +1 -1
  60. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.js +4 -3
  61. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.d.ts +4 -3
  62. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.d.ts.map +1 -1
  63. package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.js +7 -4
  64. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts +14 -15
  65. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts.map +1 -1
  66. package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.js +49 -83
  67. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts +19 -3
  68. package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
  69. package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +26 -6
  70. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts +2 -1
  71. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -1
  72. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +12 -6
  73. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts +3 -2
  74. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts.map +1 -1
  75. package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +21 -13
  76. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +5 -0
  77. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
  78. package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +19 -0
  79. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  80. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  81. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts +3 -1
  82. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts.map +1 -1
  83. package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.js +3 -1
  84. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
  85. package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +134 -88
  86. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  87. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +57 -26
  88. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
  89. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +28 -20
  90. package/src/shade/renderer/rasterize/graph_clear_raster_targets.d.ts +38 -0
  91. package/src/shade/renderer/rasterize/graph_clear_raster_targets.d.ts.map +1 -0
  92. package/src/shade/renderer/rasterize/graph_clear_raster_targets.js +105 -0
  93. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +20 -0
  94. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts +1 -1
  95. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  96. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +21 -1
  97. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  98. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +12 -20
  99. package/src/shade/renderer/shader/graph/graph_import_typed_buffer.d.ts +2 -1
  100. package/src/shade/renderer/shader/graph/graph_import_typed_buffer.d.ts.map +1 -1
  101. package/src/shade/renderer/shader/graph/graph_import_typed_buffer.js +15 -28
  102. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.d.ts.map +1 -1
  103. package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.js +8 -1
  104. package/src/core/geom/3d/atlas/atlas_bench_lib.d.ts +0 -73
  105. package/src/core/geom/3d/atlas/atlas_bench_lib.d.ts.map +0 -1
  106. package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.d.ts +0 -59
  107. package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.d.ts.map +0 -1
  108. package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts +0 -22
  109. package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts.map +0 -1
  110. package/src/engine/graphics3/terrain/shader_terrain_splat.d.ts +0 -26
  111. package/src/engine/graphics3/terrain/shader_terrain_splat.d.ts.map +0 -1
  112. package/src/shade/renderer/animation/ANIMATION_BOUND_TRACK_GROUP_STRUCT.d.ts +0 -25
  113. package/src/shade/renderer/animation/ANIMATION_BOUND_TRACK_GROUP_STRUCT.d.ts.map +0 -1
  114. package/src/shade/renderer/animation/ANIMATION_KEYFRAME_BLOCK_STRUCT.d.ts +0 -26
  115. package/src/shade/renderer/animation/ANIMATION_KEYFRAME_BLOCK_STRUCT.d.ts.map +0 -1
  116. package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_BLOCK_STRUCT.d.ts +0 -29
  117. package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_BLOCK_STRUCT.d.ts.map +0 -1
@@ -11,6 +11,7 @@ import { GPUBufferAllocatorNative } from "./buffer/GPUBufferAllocatorNative.js";
11
11
  import { create_buffer, GPUBufferContext } from "./buffer/GPUBufferContext.js";
12
12
  import { GPUBufferReadbackAllocator } from "./buffer/GPUBufferReadbackAllocator.js";
13
13
  import { GPUBufferStagingAllocator } from "./buffer/GPUBufferStagingAllocator.js";
14
+ import { GPUBufferUploadAllocator } from "./buffer/GPUBufferUploadAllocator.js";
14
15
  import { GPUGeometryManager } from "./geometry/GPUGeometryManager.js";
15
16
  import { GPUCollectionLimits } from "./rasterize/expand/GPUCollectionLimits.js";
16
17
  import { GPUSamplerManager } from "./GPUSamplerManager.js";
@@ -137,11 +138,19 @@ export class GraphicsContext {
137
138
  buffer_allocator_native;
138
139
 
139
140
  /**
140
- * Used to upload data to the GPU
141
+ * Mapped `MAP_WRITE` buffers, one per upload: where a {@link ShadeGPUCommandContext} sends its
142
+ * large writes, for which a mapping is the faster road (see `MAPPED_UPLOAD_THRESHOLD`).
141
143
  * @type {GPUBufferStagingAllocator}
142
144
  */
143
145
  buffer_allocator_staging;
144
146
 
147
+ /**
148
+ * Upload blocks for {@link ShadeGPUCommandContext}'s small writes — every uniform a pass is
149
+ * handed by value among them. Sent with one queue write per block, not mapped.
150
+ * @type {GPUBufferUploadAllocator}
151
+ */
152
+ buffer_allocator_upload;
153
+
145
154
  /**
146
155
  * Used to read data back from the GPU: `MAP_READ` buffers, held by the CPU across frames, which
147
156
  * is why they cannot come from {@link buffer_allocator_main}.
@@ -174,8 +183,10 @@ export class GraphicsContext {
174
183
  increment_time() {
175
184
  this.#timer_increment++;
176
185
 
177
- // advance the single frame clock for both substitutable pools in lockstep
186
+ // advance the single frame clock for the pools in lockstep
178
187
  this.buffer_allocator_main.increment_time();
188
+ this.buffer_allocator_staging.increment_time();
189
+ this.buffer_allocator_upload.increment_time();
179
190
  this.allocator_textures.increment_time();
180
191
  }
181
192
 
@@ -197,6 +208,7 @@ export class GraphicsContext {
197
208
  this.buffer_allocator_main = new GPUBufferAllocator(device);
198
209
  this.buffer_allocator_native = new GPUBufferAllocatorNative(device);
199
210
  this.buffer_allocator_staging = new GPUBufferStagingAllocator(device);
211
+ this.buffer_allocator_upload = new GPUBufferUploadAllocator(device);
200
212
  this.buffer_allocator_readback = new GPUBufferReadbackAllocator(device);
201
213
 
202
214
  this.allocator_textures = new GPUTextureAllocator(device);
@@ -246,53 +258,65 @@ export class GraphicsContext {
246
258
  pass.setImmediates(0, immediate.buffer.raw_bytes, immediate.offset, immediate.size);
247
259
  }
248
260
 
249
- const bind_group_descriptors = pipeline.layout.bindGroupLayouts;
250
-
251
261
  const bind_group_count = bindings.length;
252
262
 
253
- assert.lessThanOrEqual(bind_group_count, bind_group_descriptors.length, 'too many bind groups (more than in descriptor)');
254
-
255
- const bind_group_manager = this.bind_groups;
263
+ assert.lessThanOrEqual(bind_group_count, pipeline.layout.bindGroupLayouts.length, 'too many bind groups (more than in descriptor)');
256
264
 
257
265
  for (let i = 0; i < bind_group_count; i++) {
258
- const group_resource_set = bindings[i];
259
-
260
- assert.isArray(group_resource_set, `bindings[${i}]`);
261
-
262
- const bind_group_layout_descriptor = bind_group_descriptors[i];
263
-
264
- const descriptor = BindGroupDescriptor.from(
265
- bind_group_layout_descriptor,
266
- group_resource_set
267
- );
268
-
269
- const bind_group = bind_group_manager.obtain(descriptor);
266
+ this.setPipelineBindGroup(pass, pipeline, i, bindings[i]);
267
+ }
268
+ }
270
269
 
271
- if (DEBUG_LOGGING) {
272
- // debug
273
- const descriptor_rev = bind_group_manager.reverse_lookup(bind_group);
270
+ /**
271
+ * Set one bind group of `pipeline`'s layout, leaving the others as they are — for a pass whose
272
+ * groups change at different rates, where {@link setPipelineBindings} would set every group up
273
+ * to the last one on each change.
274
+ *
275
+ * @param {GPUBindingCommandsMixin} pass
276
+ * @param {PipelineDescriptorBase} pipeline
277
+ * @param {number} index the group's index in the pipeline's layout
278
+ * @param {GPUBindingResource[]} resources the group's entries, in binding order
279
+ */
280
+ setPipelineBindGroup(pass, pipeline, index, resources) {
281
+ assert.isArray(resources, `bindings[${index}]`);
274
282
 
275
- const entries = descriptor_rev.entries
276
- .map(e => {
277
- if (e.buffer !== undefined) {
278
- return `buffer:"${e.buffer.label}"`;
279
- } else if (e instanceof GPUTextureView) {
280
- return "texture_view"
281
- } else if (e instanceof GPUSampler) {
282
- return "sampler"
283
- } else {
284
- // something else
285
- return "unknown";
286
- }
283
+ const bind_group_descriptors = pipeline.layout.bindGroupLayouts;
287
284
 
288
- })
289
- .filter(e => e !== undefined);
285
+ assert.lessThan(index, bind_group_descriptors.length, 'index is past the last group in the descriptor');
290
286
 
291
- console.log(`pass.setBindGrpup(${i}, [ ${entries.join(', ')} ])`);
292
- }
287
+ const bind_group_manager = this.bind_groups;
293
288
 
294
- pass.setBindGroup(i, bind_group);
289
+ const descriptor = BindGroupDescriptor.from(
290
+ bind_group_descriptors[index],
291
+ resources
292
+ );
293
+
294
+ const bind_group = bind_group_manager.obtain(descriptor);
295
+
296
+ if (DEBUG_LOGGING) {
297
+ // debug
298
+ const descriptor_rev = bind_group_manager.reverse_lookup(bind_group);
299
+
300
+ const entries = descriptor_rev.entries
301
+ .map(e => {
302
+ if (e.buffer !== undefined) {
303
+ return `buffer:"${e.buffer.label}"`;
304
+ } else if (e instanceof GPUTextureView) {
305
+ return "texture_view"
306
+ } else if (e instanceof GPUSampler) {
307
+ return "sampler"
308
+ } else {
309
+ // something else
310
+ return "unknown";
311
+ }
312
+
313
+ })
314
+ .filter(e => e !== undefined);
315
+
316
+ console.log(`pass.setBindGrpup(${index}, [ ${entries.join(', ')} ])`);
295
317
  }
318
+
319
+ pass.setBindGroup(index, bind_group);
296
320
  }
297
321
 
298
322
  /**
@@ -316,6 +340,7 @@ export class GraphicsContext {
316
340
 
317
341
  r += this.buffer_allocator_main.gpu_memory_usage;
318
342
  r += this.buffer_allocator_staging.gpu_memory_usage;
343
+ r += this.buffer_allocator_upload.gpu_memory_usage;
319
344
  r += this.buffer_allocator_readback.gpu_memory_usage;
320
345
 
321
346
  r += this.allocator_textures.gpu_memory_usage;
@@ -331,28 +356,55 @@ export class GraphicsContext {
331
356
  update() {
332
357
  const command_ctx = ShadeGPUCommandContext.create(this, 'GraphicsContext.update');
333
358
 
334
- // The one place per frame the meshlet pool compacts, at the head of the frame: before the
335
- // clone flush in geometries.update, before the VG runtime's flush, before any pass. Its
336
- // per-frame bound is a bound because this is the only call (COMPACTION_PLAN_2026_09_16
337
- // §4.5).
338
- this.geometries.meshlets.sweep(command_ctx);
359
+ /**
360
+ * What the update raised, if anything. Held so the context is finished before it is
361
+ * re-raised: a context never finished keeps everything it took for good — an upload block,
362
+ * transient buffers — and a manager that throws every frame would leak that much every
363
+ * frame.
364
+ * @type {*}
365
+ */
366
+ let update_error = null;
339
367
 
340
- this.geometries.update(command_ctx);
368
+ try {
369
+ // The one place per frame the meshlet pool compacts, at the head of the frame: before the
370
+ // clone flush in geometries.update, before the VG runtime's flush, before any pass. Its
371
+ // per-frame bound is a bound because this is the only call (COMPACTION_PLAN_2026_09_16
372
+ // §4.5).
373
+ this.geometries.meshlets.sweep(command_ctx);
341
374
 
342
- this.textures.update();
343
- this.materials.update(command_ctx);
375
+ this.geometries.update(command_ctx);
344
376
 
345
- this.bind_groups.update();
377
+ this.textures.update();
378
+ this.materials.update(command_ctx);
346
379
 
347
- this.increment_time();
380
+ this.bind_groups.update();
348
381
 
349
- this.allocator_textures.update();
382
+ this.increment_time();
350
383
 
351
- this.#collection_limits.update(command_ctx, this.buffer_allocator_main);
384
+ this.allocator_textures.update();
352
385
 
353
- command_ctx.finish();
386
+ this.#collection_limits.update(command_ctx, this.buffer_allocator_main);
387
+ } catch (e) {
388
+ update_error = e;
389
+ }
390
+
391
+ try {
392
+ command_ctx.finish();
393
+ } catch (teardown_error) {
394
+ if (update_error === null) {
395
+ throw teardown_error;
396
+ }
397
+
398
+ // already unwinding: the update's own error is the one the caller needs to see
399
+ }
400
+
401
+ if (update_error !== null) {
402
+ throw update_error;
403
+ }
354
404
 
355
405
  this.buffer_allocator_main.update();
406
+ this.buffer_allocator_staging.update();
407
+ this.buffer_allocator_upload.update();
356
408
  }
357
409
 
358
410
  destroy() {
@@ -371,6 +423,7 @@ export class GraphicsContext {
371
423
  this.buffer_allocator_main.destroy();
372
424
  this.buffer_allocator_native.destroy();
373
425
  this.buffer_allocator_staging.destroy();
426
+ this.buffer_allocator_upload.destroy();
374
427
  this.buffer_allocator_readback.destroy();
375
428
 
376
429
  this.#collection_limits.destroy();
@@ -210,7 +210,18 @@ export class Renderer {
210
210
  * @type {Signal<ShadeDeviceFailure>}
211
211
  */
212
212
  onDeviceFailure: any;
213
- onFrameFinished: Signal;
213
+ /**
214
+ * Sent at the end of every frame {@link render} or {@link render_to_target} completes, with the
215
+ * number of frames completed so far. A frame that throws is not one of them: whatever it had
216
+ * recorded may still have been submitted, but it sends nothing and is not counted.
217
+ *
218
+ * **Submitted, not finished.** The frame's commands have been handed to the queue and the GPU
219
+ * may not have started them; a listener that needs the GPU to be done with the frame waits on
220
+ * {@link GPUQueue#onSubmittedWorkDone} instead.
221
+ *
222
+ * @type {Signal<number>}
223
+ */
224
+ onFrameFinished: any;
214
225
  /**
215
226
  *
216
227
  * @param {number} v
@@ -440,7 +451,9 @@ export class Renderer {
440
451
  * simulation, the animation tick and exposure adaptation all step by it. Zero by default, which
441
452
  * draws the current state and moves nothing; a fixed fraction of a second here instead would run
442
453
  * the simulation at that rate no matter what the caller's clock was doing.
443
- * @returns {boolean} whether frame was rendered, will return false if previous frame hasn't finished yet
454
+ * @returns {boolean} whether a frame was encoded and submitted. False only when there is nothing
455
+ * to draw with — the device was lost, or the renderer destroyed. Frames the GPU has not finished
456
+ * yet neither hold this one back nor make it return false.
444
457
  */
445
458
  render(camera: PerspectiveCamera, scene: Scene, time_delta_seconds?: number): boolean;
446
459
  /**
@@ -457,11 +470,14 @@ export class Renderer {
457
470
  * @param {Scene} scene
458
471
  * @param {number} time_delta_seconds
459
472
  * @param {GPUTextureContext} target must match {@link output_resolution}
460
- * @returns {boolean} whether frame was rendered, will return false if previous frame hasn't finished yet
473
+ * @returns {boolean} whether a frame was encoded and submitted. False only when there is nothing
474
+ * to draw with — the device was lost, or the renderer destroyed. Frames the GPU has not finished
475
+ * yet neither hold this one back nor make it return false.
461
476
  */
462
477
  render_to_target(camera: PerspectiveCamera, scene: Scene, time_delta_seconds: number, target: GPUTextureContext): boolean;
463
478
  #private;
464
479
  }
480
+ export type GPUFrameRecorder = import("../device/timing/profile/GPUFrameRecorder.js").GPUFrameRecorder;
465
481
  export type GPUProfileSession = import("../device/timing/profile/GPUProfileSession.js").GPUProfileSession;
466
482
  export type PerspectiveCamera = import("./camera/PerspectiveCamera.js").PerspectiveCamera;
467
483
  export type RenderExtension = import("./extension/RenderExtension.js").RenderExtension;
@@ -477,7 +493,6 @@ import { DepthOfField } from "./postprocess/dof/raymarch/DepthOfField.js";
477
493
  import { DepthOfFieldU } from "./postprocess/dof/gather/DepthOfFieldU.js";
478
494
  import { ViewManager } from "./view/ViewManager.js";
479
495
  import { GraphicsContext } from "./GraphicsContext.js";
480
- import Signal from "../../core/events/signal/Signal.js";
481
496
  import Vector2 from "../../core/geom/Vector2.js";
482
497
  import { GPUTextureContext } from "./texture/GPUTextureContext.js";
483
498
  import { FramePhase } from "./extension/FramePhase.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/Renderer.js"],"names":[],"mappings":"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"}
@@ -85,6 +85,7 @@ import { View } from "./view/View.js";
85
85
  import { ViewManager } from "./view/ViewManager.js";
86
86
 
87
87
  /**
88
+ * @typedef {import("../device/timing/profile/GPUFrameRecorder.js").GPUFrameRecorder} GPUFrameRecorder
88
89
  * @typedef {import("../device/timing/profile/GPUProfileSession.js").GPUProfileSession} GPUProfileSession
89
90
  * @typedef {import("./camera/PerspectiveCamera.js").PerspectiveCamera} PerspectiveCamera
90
91
  * @typedef {import("./extension/RenderExtension.js").RenderExtension} RenderExtension
@@ -472,6 +473,17 @@ export class Renderer {
472
473
  */
473
474
  onDeviceFailure = new Signal();
474
475
 
476
+ /**
477
+ * Sent at the end of every frame {@link render} or {@link render_to_target} completes, with the
478
+ * number of frames completed so far. A frame that throws is not one of them: whatever it had
479
+ * recorded may still have been submitted, but it sends nothing and is not counted.
480
+ *
481
+ * **Submitted, not finished.** The frame's commands have been handed to the queue and the GPU
482
+ * may not have started them; a listener that needs the GPU to be done with the frame waits on
483
+ * {@link GPUQueue#onSubmittedWorkDone} instead.
484
+ *
485
+ * @type {Signal<number>}
486
+ */
475
487
  onFrameFinished = new Signal();
476
488
 
477
489
  /**
@@ -1898,7 +1910,9 @@ export class Renderer {
1898
1910
  * simulation, the animation tick and exposure adaptation all step by it. Zero by default, which
1899
1911
  * draws the current state and moves nothing; a fixed fraction of a second here instead would run
1900
1912
  * the simulation at that rate no matter what the caller's clock was doing.
1901
- * @returns {boolean} whether frame was rendered, will return false if previous frame hasn't finished yet
1913
+ * @returns {boolean} whether a frame was encoded and submitted. False only when there is nothing
1914
+ * to draw with — the device was lost, or the renderer destroyed. Frames the GPU has not finished
1915
+ * yet neither hold this one back nor make it return false.
1902
1916
  */
1903
1917
  render(
1904
1918
  camera,
@@ -1937,13 +1951,100 @@ export class Renderer {
1937
1951
  * @param {Scene} scene
1938
1952
  * @param {number} time_delta_seconds
1939
1953
  * @param {GPUTextureContext} target must match {@link output_resolution}
1940
- * @returns {boolean} whether frame was rendered, will return false if previous frame hasn't finished yet
1954
+ * @returns {boolean} whether a frame was encoded and submitted. False only when there is nothing
1955
+ * to draw with — the device was lost, or the renderer destroyed. Frames the GPU has not finished
1956
+ * yet neither hold this one back nor make it return false.
1941
1957
  */
1942
1958
  render_to_target(
1943
1959
  camera,
1944
1960
  scene,
1945
1961
  time_delta_seconds,
1946
1962
  target
1963
+ ) {
1964
+ try {
1965
+ return this.#draw_to_target(camera, scene, time_delta_seconds, target);
1966
+ } catch (error) {
1967
+ this.#finish_stranded_frame();
1968
+
1969
+ throw error;
1970
+ }
1971
+ }
1972
+
1973
+ /**
1974
+ * The frame's command context from the moment it is created until the frame's teardown takes
1975
+ * it, and null otherwise — so a frame that throws before its teardown leaves it here for
1976
+ * {@link render_to_target} to finish.
1977
+ *
1978
+ * @type {ShadeGPUCommandContext|null}
1979
+ */
1980
+ #frame_command_ctx = null;
1981
+
1982
+ /**
1983
+ * The profiler's recorder for the frame {@link #frame_command_ctx} belongs to, and the session
1984
+ * that handed it out — null when that frame is not profiled — so a frame that throws before its
1985
+ * teardown still closes its profile frame. Otherwise a capture leaves out exactly the frames
1986
+ * that failed.
1987
+ *
1988
+ * @type {GPUFrameRecorder|null}
1989
+ */
1990
+ #frame_profile_recorder = null;
1991
+
1992
+ /**
1993
+ * @type {GPUProfileSession|null}
1994
+ */
1995
+ #frame_profile_session = null;
1996
+
1997
+ /**
1998
+ * Finish the context a frame left behind when it threw before its teardown: the scene tick, the
1999
+ * shadow draw and every extension phase run between the context's creation and the teardown,
2000
+ * and a throw from any of them used to leave it open for good, holding its upload block, its
2001
+ * transient buffers and its profiler's buffers — every frame it happened.
2002
+ *
2003
+ * What comes back is what it holds. What it recorded is submitted if the encoder can still be
2004
+ * finished: a throw once the `Shade` debug group is open leaves that group unclosed, the
2005
+ * command buffer is invalid, and the submission is refused with nothing of the frame run — as it
2006
+ * is for a pass that throws, whose teardown shares the same unclosed group.
2007
+ */
2008
+ #finish_stranded_frame() {
2009
+ const stranded = this.#frame_command_ctx;
2010
+ const recorder = this.#frame_profile_recorder;
2011
+ const session = this.#frame_profile_session;
2012
+
2013
+ this.#frame_command_ctx = null;
2014
+ this.#frame_profile_recorder = null;
2015
+ this.#frame_profile_session = null;
2016
+
2017
+ if (stranded === null) {
2018
+ return;
2019
+ }
2020
+
2021
+ try {
2022
+ stranded.finish();
2023
+ } catch (teardown_error) {
2024
+ // already unwinding: the frame's own error is the one the caller needs to see
2025
+ }
2026
+
2027
+ if (recorder !== null) {
2028
+ stranded.profiling_absorbed.then(() => {
2029
+ session.end_frame(recorder, performance.now());
2030
+ });
2031
+ }
2032
+ }
2033
+
2034
+ /**
2035
+ * The whole of {@link render_to_target}, which only adds the finishing of a frame that throws.
2036
+ *
2037
+ * @param {PerspectiveCamera} camera
2038
+ * @param {Scene} scene
2039
+ * @param {number} time_delta_seconds
2040
+ * @param {GPUTextureContext} target
2041
+ * @returns {boolean}
2042
+ */
2043
+ #draw_to_target(
2044
+ camera,
2045
+ scene,
2046
+ time_delta_seconds,
2047
+ target
1947
2048
  ) {
1948
2049
  assert.defined(target, 'target');
1949
2050
  assert.equal(target.isGPUTextureContext, true, 'target.isGPUTextureContext !== true');
@@ -2020,6 +2121,8 @@ export class Renderer {
2020
2121
  "Renderer/main-0"
2021
2122
  );
2022
2123
 
2124
+ this.#frame_command_ctx = command_ctx;
2125
+
2023
2126
  /**
2024
2127
  * The frame recorder for this frame, or null when nothing is profiling.
2025
2128
  * @type {GPUFrameRecorder|null}
@@ -2033,6 +2136,9 @@ export class Renderer {
2033
2136
 
2034
2137
  if (profile_recorder !== null) {
2035
2138
  command_ctx.enable_profiling(profile_recorder, 0);
2139
+
2140
+ this.#frame_profile_recorder = profile_recorder;
2141
+ this.#frame_profile_session = this.profile_session;
2036
2142
  }
2037
2143
  }
2038
2144
 
@@ -2822,6 +2928,11 @@ export class Renderer {
2822
2928
  destroyed, and the session's frame accounting silently short a frame. A render loop that
2823
2929
  catches and carries on repeats that every failing frame until the device complains.
2824
2930
  */
2931
+ // the teardown has it from here, whatever the finish does
2932
+ this.#frame_command_ctx = null;
2933
+ this.#frame_profile_recorder = null;
2934
+ this.#frame_profile_session = null;
2935
+
2825
2936
  try {
2826
2937
  command_ctx.finish();
2827
2938
  } catch (teardown_error) {
@@ -418,8 +418,10 @@ export class GPUAnimationManager {
418
418
  * correct ping-pong behaviour across frames without leaking the
419
419
  * buffer-role bookkeeping into every caller.
420
420
  *
421
- * No-op when the joints table has no rows to walk
422
- * (`group_count_x === 0`).
421
+ * No-op when the joints table has no page for it to walk
422
+ * (`group_count_x === 0`), which is never while a skin is
423
+ * registered: a page emptied of joints goes at the next database
424
+ * update.
423
425
  *
424
426
  * Per-frame ordering:
425
427
  * 1. Flip {@link #skin_matrices_current_index}: last frame's
@@ -427,11 +429,12 @@ export class GPUAnimationManager {
427
429
  * ({@link prev_skin_matrices_buffer}), and the buffer that
428
430
  * held the frame before it becomes the write target.
429
431
  * 2. Dispatch the prep shader into the new "current".
430
- * 3. If {@link #first_frame_skin_matrices} is set — a run handed
431
- * out, a pending skin's joints named, or the buffers grown
432
- * since the last dispatch — copy all of "current" over
433
- * "previous", so the first velocity read over those rows sees
434
- * matching matrices and produces zero velocity.
432
+ * 3. Copy "current" over "previous" on the rows that have no last
433
+ * frame — every run handed out and every pending skin's run
434
+ * named since the last dispatch, or all of it after a grow —
435
+ * so the first velocity read over those rows sees matching
436
+ * matrices and produces zero velocity. Every other row of
437
+ * "previous" keeps last frame's matrices.
435
438
  *
436
439
  * @param {ShadeGPUCommandContext} cmd_ctx
437
440
  */
@@ -1 +1 @@
1
- {"version":3,"file":"GPUAnimationManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/GPUAnimationManager.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GPUAnimationManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/GPUAnimationManager.js"],"names":[],"mappings":"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"}