@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.
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/collection/table/RowFirstTable.d.ts +8 -0
- package/src/core/collection/table/RowFirstTable.d.ts.map +1 -1
- package/src/core/collection/table/RowFirstTable.js +40 -11
- package/src/engine/graphics/ecs/sprite/Sprite.d.ts +3 -0
- package/src/engine/graphics/ecs/sprite/Sprite.d.ts.map +1 -1
- package/src/engine/graphics/ecs/sprite/Sprite.js +3 -0
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts +3 -0
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +3 -0
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem.js +6 -2
- package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -1
- package/src/engine/graphics3/PathDisplaySystem.js +311 -307
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/RENDERER_CONTRACT.md +15 -2
- package/src/shade/device/IMMEDIATE_DATA_PLAN_2026_08_28.md +5 -0
- package/src/shade/device/ShadeGPUCommandContext.d.ts +15 -2
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +154 -25
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts +20 -3
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPURenderPassEncoder.js +21 -3
- package/src/shade/renderer/GraphicsContext.d.ts +20 -1
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +105 -52
- package/src/shade/renderer/Renderer.d.ts +19 -4
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +113 -2
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +10 -7
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +147 -45
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts +6 -5
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts.map +1 -1
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.js +241 -240
- package/src/shade/renderer/buffer/GPUBufferStagingAllocator.d.ts +62 -2
- package/src/shade/renderer/buffer/GPUBufferStagingAllocator.d.ts.map +1 -1
- package/src/shade/renderer/buffer/GPUBufferStagingAllocator.js +306 -38
- package/src/shade/renderer/buffer/GPUBufferUploadAllocator.d.ts +60 -0
- package/src/shade/renderer/buffer/GPUBufferUploadAllocator.d.ts.map +1 -0
- package/src/shade/renderer/buffer/GPUBufferUploadAllocator.js +202 -0
- package/src/shade/renderer/buffer/GPUUploadBlock.d.ts +68 -0
- package/src/shade/renderer/buffer/GPUUploadBlock.d.ts.map +1 -0
- package/src/shade/renderer/buffer/GPUUploadBlock.js +97 -0
- package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.d.ts +2 -1
- package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/DynamicMeshAVBOITChannel.js +19 -17
- package/src/shade/renderer/dynamic/GPUDynamicMeshDrawList.d.ts +70 -0
- package/src/shade/renderer/dynamic/GPUDynamicMeshDrawList.d.ts.map +1 -0
- package/src/shade/renderer/dynamic/GPUDynamicMeshDrawList.js +257 -0
- package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.d.ts +20 -7
- package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/GPUDynamicMeshRenderer.js +39 -41
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts +6 -20
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +42 -36
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts +2 -1
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_avboit_vertex.js +4 -3
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.d.ts +4 -3
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/chunk_dynamic_mesh_vertex.js +7 -4
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts +14 -15
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/graph_dynamic_mesh_avboit.js +49 -83
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts +19 -3
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh.js +26 -6
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts +2 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_draw.js +12 -6
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts +3 -2
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/dynamic/shader_dynamic_mesh_avboit_splat.js +21 -13
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts +5 -0
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/build/meshoptimizer/geometry_to_meshlets_meshoptimizer.js +19 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts +3 -1
- package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/rasterization_has_opaque_bucket.js +3 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/shader_instances_rasterization_bucket_sort.js +134 -88
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +57 -26
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +28 -20
- package/src/shade/renderer/rasterize/graph_clear_raster_targets.d.ts +38 -0
- package/src/shade/renderer/rasterize/graph_clear_raster_targets.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/graph_clear_raster_targets.js +105 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +20 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +21 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +12 -20
- package/src/shade/renderer/shader/graph/graph_import_typed_buffer.d.ts +2 -1
- package/src/shade/renderer/shader/graph/graph_import_typed_buffer.d.ts.map +1 -1
- package/src/shade/renderer/shader/graph/graph_import_typed_buffer.js +15 -28
- package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.d.ts.map +1 -1
- package/src/shade/renderer/shader/type/serde/write_gpu_typed_buffer.js +8 -1
- package/src/core/geom/3d/atlas/atlas_bench_lib.d.ts +0 -73
- package/src/core/geom/3d/atlas/atlas_bench_lib.d.ts.map +0 -1
- package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.d.ts +0 -59
- package/src/engine/graphics3/terrain/GPUTerrainSplatRenderer.d.ts.map +0 -1
- package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts +0 -22
- package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts.map +0 -1
- package/src/engine/graphics3/terrain/shader_terrain_splat.d.ts +0 -26
- package/src/engine/graphics3/terrain/shader_terrain_splat.d.ts.map +0 -1
- package/src/shade/renderer/animation/ANIMATION_BOUND_TRACK_GROUP_STRUCT.d.ts +0 -25
- package/src/shade/renderer/animation/ANIMATION_BOUND_TRACK_GROUP_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/animation/ANIMATION_KEYFRAME_BLOCK_STRUCT.d.ts +0 -26
- package/src/shade/renderer/animation/ANIMATION_KEYFRAME_BLOCK_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/animation/ANIMATION_SKIN_JOINT_BLOCK_STRUCT.d.ts +0 -29
- 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
|
-
*
|
|
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
|
|
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,
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
272
|
-
|
|
273
|
-
|
|
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
|
-
|
|
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
|
-
|
|
292
|
-
}
|
|
287
|
+
const bind_group_manager = this.bind_groups;
|
|
293
288
|
|
|
294
|
-
|
|
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
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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
|
-
|
|
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
|
-
|
|
343
|
-
this.materials.update(command_ctx);
|
|
375
|
+
this.geometries.update(command_ctx);
|
|
344
376
|
|
|
345
|
-
|
|
377
|
+
this.textures.update();
|
|
378
|
+
this.materials.update(command_ctx);
|
|
346
379
|
|
|
347
|
-
|
|
380
|
+
this.bind_groups.update();
|
|
348
381
|
|
|
349
|
-
|
|
382
|
+
this.increment_time();
|
|
350
383
|
|
|
351
|
-
|
|
384
|
+
this.allocator_textures.update();
|
|
352
385
|
|
|
353
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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":"
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
431
|
-
* out
|
|
432
|
-
* since the last dispatch
|
|
433
|
-
*
|
|
434
|
-
*
|
|
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":"AA+IA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH;
|
|
1
|
+
{"version":3,"file":"GPUAnimationManager.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/animation/GPUAnimationManager.js"],"names":[],"mappings":"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"}
|