@woosh/meep-engine 3.46.0 → 3.47.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 (230) hide show
  1. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
  2. package/editor/actions/concrete/TransformModifyAction.js +10 -2
  3. package/editor/ecs/component/FieldDescriptor.js +15 -0
  4. package/editor/ecs/component/createObjectEditor.js +41 -12
  5. package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts.map +1 -1
  6. package/editor/ecs/component/editors/ecs/Transform64Editor.js +77 -70
  7. package/editor/tools/TransformToolV2.d.ts.map +1 -1
  8. package/editor/tools/TransformToolV2.js +4 -0
  9. package/editor/tools/v2/TransformControls.d.ts.map +1 -1
  10. package/editor/tools/v2/TransformControls.js +7 -0
  11. package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
  12. package/editor/view/ecs/EntityEditor.js +4 -2
  13. package/package.json +1 -1
  14. package/src/core/collection/array/array_insert_at.d.ts +16 -0
  15. package/src/core/collection/array/array_insert_at.d.ts.map +1 -0
  16. package/src/core/collection/array/array_insert_at.js +32 -0
  17. package/src/core/collection/array/array_remove_at.d.ts +15 -0
  18. package/src/core/collection/array/array_remove_at.d.ts.map +1 -0
  19. package/src/core/collection/array/array_remove_at.js +30 -0
  20. package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts +37 -0
  21. package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts.map +1 -0
  22. package/src/core/geom/3d/quaternion/quat3_look_rotation.js +172 -0
  23. package/src/core/geom/Quaternion.d.ts +1 -0
  24. package/src/core/geom/Quaternion.d.ts.map +1 -1
  25. package/src/core/geom/Quaternion.js +12 -48
  26. package/src/engine/Engine.d.ts.map +1 -1
  27. package/src/engine/Engine.js +9 -4
  28. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  29. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +10 -0
  30. package/src/engine/ecs/transform/t64_look_rotation.d.ts +4 -4
  31. package/src/engine/ecs/transform/t64_look_rotation.d.ts.map +1 -1
  32. package/src/engine/ecs/transform/t64_look_rotation.js +7 -18
  33. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  34. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +30 -1
  35. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -0
  36. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  37. package/src/engine/graphics3/GPUParticleEmitterSystem.js +72 -29
  38. package/src/engine/input/devices/KeyboardDevice.d.ts +1 -0
  39. package/src/engine/input/devices/KeyboardDevice.d.ts.map +1 -1
  40. package/src/engine/input/devices/KeyboardDevice.js +7 -6
  41. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  42. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +15 -2
  43. package/src/engine/network/CONGESTION_CONTROL.md +9 -9
  44. package/src/engine/network/MESSAGE_TRANSPORT.md +364 -0
  45. package/src/engine/network/NetworkSession.d.ts +31 -11
  46. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  47. package/src/engine/network/NetworkSession.js +453 -286
  48. package/src/engine/network/README.md +77 -27
  49. package/src/engine/network/SMOOTHNESS_DESIGN.md +13 -5
  50. package/src/engine/network/diagnostics/BandwidthMeter.d.ts +1 -1
  51. package/src/engine/network/diagnostics/BandwidthMeter.js +1 -1
  52. package/src/engine/network/orchestrator/HostJoin.d.ts +111 -0
  53. package/src/engine/network/orchestrator/HostJoin.d.ts.map +1 -0
  54. package/src/engine/network/orchestrator/HostJoin.js +271 -0
  55. package/src/engine/network/orchestrator/NetworkPeer.d.ts +151 -112
  56. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  57. package/src/engine/network/orchestrator/NetworkPeer.js +450 -499
  58. package/src/engine/network/orchestrator/PendingSlices.d.ts +30 -0
  59. package/src/engine/network/orchestrator/PendingSlices.d.ts.map +1 -0
  60. package/src/engine/network/orchestrator/PendingSlices.js +83 -0
  61. package/src/engine/network/orchestrator/ReliableFrames.d.ts +34 -0
  62. package/src/engine/network/orchestrator/ReliableFrames.d.ts.map +1 -0
  63. package/src/engine/network/orchestrator/ReliableFrames.js +96 -0
  64. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +77 -10
  65. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  66. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +236 -61
  67. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +20 -6
  68. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  69. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +33 -8
  70. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  71. package/src/engine/network/replication/Replicator.js +7 -1
  72. package/src/engine/network/sim/ActionLog.d.ts +32 -5
  73. package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
  74. package/src/engine/network/sim/ActionLog.js +47 -5
  75. package/src/engine/network/sim/SimActionExecutor.d.ts +42 -2
  76. package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
  77. package/src/engine/network/sim/SimActionExecutor.js +100 -4
  78. package/src/engine/network/sim/Snapshotter.d.ts +12 -0
  79. package/src/engine/network/sim/Snapshotter.d.ts.map +1 -1
  80. package/src/engine/network/sim/Snapshotter.js +43 -0
  81. package/src/engine/network/state/Baseline.d.ts +1 -1
  82. package/src/engine/network/state/Baseline.js +1 -1
  83. package/src/engine/network/state/FrameBufferRing.d.ts +25 -6
  84. package/src/engine/network/state/FrameBufferRing.d.ts.map +1 -1
  85. package/src/engine/network/state/FrameBufferRing.js +51 -6
  86. package/src/engine/network/state/InputRing.d.ts +4 -0
  87. package/src/engine/network/state/InputRing.d.ts.map +1 -1
  88. package/src/engine/network/state/InputRing.js +7 -0
  89. package/src/engine/network/transport/DeferredTransport.d.ts.map +1 -1
  90. package/src/engine/network/transport/DeferredTransport.js +1 -0
  91. package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -1
  92. package/src/engine/network/transport/LoopbackTransport.js +4 -2
  93. package/src/engine/network/transport/Transport.d.ts +7 -0
  94. package/src/engine/network/transport/Transport.d.ts.map +1 -1
  95. package/src/engine/network/transport/Transport.js +8 -0
  96. package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
  97. package/src/engine/network/transport/adapters/NodeUDPTransport.js +20 -5
  98. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.d.ts.map +1 -1
  99. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +8 -0
  100. package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -1
  101. package/src/engine/network/transport/adapters/WebTransportTransport.js +6 -0
  102. package/src/engine/network/transport/connection/Connection.d.ts +191 -0
  103. package/src/engine/network/transport/connection/Connection.d.ts.map +1 -0
  104. package/src/engine/network/transport/connection/Connection.js +1262 -0
  105. package/src/engine/network/transport/connection/RangeSet.d.ts +94 -0
  106. package/src/engine/network/transport/connection/RangeSet.d.ts.map +1 -0
  107. package/src/engine/network/transport/connection/RangeSet.js +260 -0
  108. package/src/engine/network/transport/connection/RxStream.d.ts +48 -0
  109. package/src/engine/network/transport/connection/RxStream.d.ts.map +1 -0
  110. package/src/engine/network/transport/connection/RxStream.js +211 -0
  111. package/src/engine/network/transport/connection/TxStream.d.ts +90 -0
  112. package/src/engine/network/transport/connection/TxStream.d.ts.map +1 -0
  113. package/src/engine/network/transport/connection/TxStream.js +243 -0
  114. package/src/engine/network/transport/connection/bytes_copy.d.ts +17 -0
  115. package/src/engine/network/transport/connection/bytes_copy.d.ts.map +1 -0
  116. package/src/engine/network/transport/connection/bytes_copy.js +34 -0
  117. package/src/engine/network/transport/connection/varint.d.ts +46 -0
  118. package/src/engine/network/transport/connection/varint.d.ts.map +1 -0
  119. package/src/engine/network/transport/connection/varint.js +107 -0
  120. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  121. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +38 -7
  122. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -1
  123. package/src/engine/sound/ecs/audio/AudioEmitter.js +35 -7
  124. package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.d.ts.map +1 -1
  125. package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.js +5 -1
  126. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts +18 -0
  127. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts.map +1 -0
  128. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.js +48 -0
  129. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +12 -2
  130. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
  131. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +173 -9
  132. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +9 -3
  133. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
  134. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +28 -8
  135. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts +8 -0
  136. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts.map +1 -1
  137. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.d.ts.map +1 -1
  138. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.js +5 -1
  139. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts +18 -0
  140. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts.map +1 -0
  141. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.js +51 -0
  142. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
  143. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +15 -1
  144. package/src/engine/sound/sopra/README.md +768 -644
  145. package/src/engine/sound/sopra/SopraEngine.d.ts +104 -8
  146. package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -1
  147. package/src/engine/sound/sopra/SopraEngine.js +327 -12
  148. package/src/engine/sound/sopra/definition/EventDescription.d.ts +28 -2
  149. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -1
  150. package/src/engine/sound/sopra/definition/EventDescription.js +55 -5
  151. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +10 -0
  152. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -1
  153. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +77 -55
  154. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts +31 -0
  155. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts.map +1 -0
  156. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.js +75 -0
  157. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +38 -9
  158. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -1
  159. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +34 -5
  160. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +7 -2
  161. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -1
  162. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +137 -122
  163. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +3 -1
  164. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -1
  165. package/src/engine/sound/sopra/definition/effect/EqEffect.js +146 -131
  166. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +1 -0
  167. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -1
  168. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +6 -1
  169. package/src/engine/sound/sopra/runtime/BusGraph.d.ts +44 -2
  170. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -1
  171. package/src/engine/sound/sopra/runtime/BusGraph.js +83 -43
  172. package/src/engine/sound/sopra/runtime/EffectChain.d.ts +96 -0
  173. package/src/engine/sound/sopra/runtime/EffectChain.d.ts.map +1 -0
  174. package/src/engine/sound/sopra/runtime/EffectChain.js +286 -0
  175. package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts +123 -0
  176. package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts.map +1 -0
  177. package/src/engine/sound/sopra/runtime/EffectParamOverrides.js +320 -0
  178. package/src/engine/sound/sopra/runtime/EventInstance.d.ts +55 -5
  179. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  180. package/src/engine/sound/sopra/runtime/EventInstance.js +201 -26
  181. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +2 -1
  182. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -1
  183. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +6 -1
  184. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +15 -0
  185. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -1
  186. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +32 -0
  187. package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -1
  188. package/src/engine/sound/sopra/util/MockAudioContext.js +3 -0
  189. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +13 -3
  190. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -1
  191. package/src/engine/sound/sopra/util/fadeOutAndStop.js +25 -13
  192. package/src/shade/RENDERER_CONTRACT.md +6 -3
  193. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts +24 -0
  194. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts.map +1 -0
  195. package/src/shade/device/SHADE_DEVICE_FLOOR.js +34 -0
  196. package/src/shade/device/ShadeDeviceFailure.d.ts +12 -5
  197. package/src/shade/device/ShadeDeviceFailure.d.ts.map +1 -1
  198. package/src/shade/device/ShadeDeviceFailure.js +17 -8
  199. package/src/shade/device/ShadeDeviceFailureReason.d.ts +1 -1
  200. package/src/shade/device/ShadeDeviceFailureReason.js +2 -2
  201. package/src/shade/device/shade_device_floor_unmet.d.ts +13 -0
  202. package/src/shade/device/shade_device_floor_unmet.d.ts.map +1 -0
  203. package/src/shade/device/shade_device_floor_unmet.js +32 -0
  204. package/src/shade/renderer/Renderer.d.ts +2 -0
  205. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  206. package/src/shade/renderer/Renderer.js +29 -55
  207. package/src/shade/renderer/buffer/GPUBufferAllocator.d.ts.map +1 -1
  208. package/src/shade/renderer/buffer/GPUBufferAllocator.js +9 -0
  209. package/src/shade/renderer/buffer/buffer_pool_ops.d.ts +21 -12
  210. package/src/shade/renderer/buffer/buffer_pool_ops.d.ts.map +1 -1
  211. package/src/shade/renderer/buffer/buffer_pool_ops.js +18 -19
  212. package/src/shade/renderer/gpu_primitive/test/gpu_test.d.ts.map +1 -1
  213. package/src/shade/renderer/gpu_primitive/test/gpu_test.js +8 -11
  214. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  215. package/src/shade/renderer/pool/TransientResourcePool.d.ts +24 -0
  216. package/src/shade/renderer/pool/TransientResourcePool.d.ts.map +1 -1
  217. package/src/shade/renderer/pool/TransientResourcePool.js +41 -10
  218. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  219. package/src/shade/renderer/shader/ComputeShader.js +18 -2
  220. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  221. package/src/shade/renderer/shader/ImageShader.js +230 -218
  222. package/src/view/graphics/GraphicsContextFailureView.d.ts +1 -2
  223. package/src/view/graphics/GraphicsContextFailureView.d.ts.map +1 -1
  224. package/src/view/graphics/GraphicsContextFailureView.js +1 -2
  225. package/src/engine/network/transport/Channel.js +0 -336
  226. package/src/engine/network/transport/ReliableCommandPipeline.js +0 -335
  227. package/src/engine/network/transport/fragments/FragmentAssembler.js +0 -350
  228. package/src/engine/network/transport/fragments/FragmentRetention.js +0 -191
  229. package/src/engine/network/transport/fragments/fragment_send.js +0 -157
  230. package/src/engine/network/transport/fragments/packet_size.js +0 -107
@@ -13,8 +13,15 @@
13
13
  * immediately (within and across frames) — there is no frames-in-flight reuse gate; only
14
14
  * *destruction* is deferred, by {@link update}.
15
15
  *
16
+ * A record carries what the pool is ordered and accounted by, cached when its resource enters the
17
+ * pool: `size` here, and whatever else {@link describeRecord} adds for {@link compare} and
18
+ * {@link find}. A resource can be a platform object — a `GPUBuffer`'s `size` and `usage` are native
19
+ * reads — and the binary search and scan visit records many times a frame, so they read the record,
20
+ * never the resource.
21
+ *
16
22
  * @typedef {object} PoolRecord
17
23
  * @property {*} resource the pooled resource (or null while the record sits on the free-list)
24
+ * @property {number} size {@link sizeOf} the resource, as it was when it entered the pool
18
25
  * @property {number} last_used_frame frame the resource was last released into the pool
19
26
  * @property {boolean} referenced CLOCK second-chance bit; set on release and on reuse
20
27
  */
@@ -83,6 +90,13 @@ export class TransientResourcePool {
83
90
  * @abstract
84
91
  */
85
92
  destroyResource(resource: any): void;
93
+ /**
94
+ * Cache on a record entering the pool whatever {@link compare} and {@link find} read beyond `size`,
95
+ * so neither has to ask the resource. Called on {@link release} once `resource` and `size` are set,
96
+ * and before the record is placed in order. Default: nothing.
97
+ * @param {PoolRecord} record
98
+ */
99
+ describeRecord(record: PoolRecord): void;
86
100
  /**
87
101
  * Hook invoked at the end of {@link get}, after the resource is acquired and tracked. Subclasses
88
102
  * override it for post-acquire work (clear-on-reuse, postcondition asserts). Default: nothing.
@@ -147,12 +161,22 @@ export class TransientResourcePool {
147
161
  * Reuse safety: within WebGPU's single in-order queue, reusing a GPU-only transient is safe
148
162
  * immediately (within and across frames) — there is no frames-in-flight reuse gate; only
149
163
  * *destruction* is deferred, by {@link update }.
164
+ *
165
+ * A record carries what the pool is ordered and accounted by, cached when its resource enters the
166
+ * pool: `size` here, and whatever else {@link describeRecord } adds for {@link compare } and
167
+ * {@link find }. A resource can be a platform object — a `GPUBuffer`'s `size` and `usage` are native
168
+ * reads — and the binary search and scan visit records many times a frame, so they read the record,
169
+ * never the resource.
150
170
  */
151
171
  export type PoolRecord = {
152
172
  /**
153
173
  * the pooled resource (or null while the record sits on the free-list)
154
174
  */
155
175
  resource: any;
176
+ /**
177
+ * {@link sizeOf } the resource, as it was when it entered the pool
178
+ */
179
+ size: number;
156
180
  /**
157
181
  * frame the resource was last released into the pool
158
182
  */
@@ -1 +1 @@
1
- {"version":3,"file":"TransientResourcePool.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/pool/TransientResourcePool.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;IAII,+EAA+E;IAC/E,wBADqE,MAAM,CACjC;IAE1C,6EAA6E;IAC7E,mBADmE,MAAM,CAClD;IAEvB,oEAAoE;IACpE,6BAD0D,MAAM,CAChC;IAEhC,sGAAsG;IACtG,uBAD4F,MAAM,CACtE;IAE5B,6EAA6E;IAC7E,mBADmE,MAAM,CACjD;IAExB,0EAA0E;IAC1E,mBADgE,MAAM,CAC9C;IAExB;;;;OAIG;IACH,SAFU,UAAU,EAAE,CAET;IAEb;;;OAGG;IACH,OAFU,QAAM,CAEE;IAElB;;;;OAIG;IACH,kBAFU,OAAO,CAEQ;IAyBzB;;;;;OAKG;IACH,uBAHa,MAAM,CAKlB;IAED;;;;;;OAMG;IACH,WALW,UAAU,KACV,UAAU,GACR,MAAM,CAKlB;IAED;;;;;OAKG;IACH,uBAHa,MAAM,CAKlB;IAED;;;;;OAKG;IACH,2BAEC;IAED;;;;OAIG;IACH,qCAEC;IAED;;;;;;;OAOG;IACH,qDAHW,OAAO,uBAIjB;IAID,uBAEC;IAED,oBAEC;IAqBD;;;;;;;OAOG;IACH,yCAsCC;IAED;;;;;;OAMG;IACH,wBAFa,OAAO,CA0BnB;IAED;;;;;OAKG;IACH,eAsDC;IAED;;OAEG;IACH,+BAEC;IAED;;OAEG;IACH,gBAcC;IAED;;;OAGG;IACH,yBAsCC;;CACJ;;;;;;;;;;;;;;;;;;;;;;;;qBAnXa,MAAM;;;;gBACN,OAAO"}
1
+ {"version":3,"file":"TransientResourcePool.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/pool/TransientResourcePool.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH;IAII,+EAA+E;IAC/E,wBADqE,MAAM,CACjC;IAE1C,6EAA6E;IAC7E,mBADmE,MAAM,CAClD;IAEvB,oEAAoE;IACpE,6BAD0D,MAAM,CAChC;IAEhC,sGAAsG;IACtG,uBAD4F,MAAM,CACtE;IAE5B,6EAA6E;IAC7E,mBADmE,MAAM,CACjD;IAExB,0EAA0E;IAC1E,mBADgE,MAAM,CAC9C;IAExB;;;;OAIG;IACH,SAFU,UAAU,EAAE,CAET;IAEb;;;OAGG;IACH,OAFU,QAAM,CAEE;IAElB;;;;OAIG;IACH,kBAFU,OAAO,CAEQ;IAyBzB;;;;;OAKG;IACH,uBAHa,MAAM,CAKlB;IAED;;;;;;OAMG;IACH,WALW,UAAU,KACV,UAAU,GACR,MAAM,CAKlB;IAED;;;;;OAKG;IACH,uBAHa,MAAM,CAKlB;IAED;;;;;OAKG;IACH,2BAEC;IAED;;;;OAIG;IACH,qCAEC;IAED;;;;;OAKG;IACH,uBAFW,UAAU,QAGpB;IAED;;;;;;;OAOG;IACH,qDAHW,OAAO,uBAIjB;IAID,uBAEC;IAED,oBAEC;IAqBD;;;;;;;OAOG;IACH,yCA0CC;IAED;;;;;;OAMG;IACH,wBAFa,OAAO,CAiCnB;IAED;;;;;OAKG;IACH,eAsDC;IAED;;OAEG;IACH,+BAEC;IAED;;OAEG;IACH,gBAcC;IAED;;;OAGG;IACH,yBAwCC;;CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA1Ya,MAAM;;;;qBACN,MAAM;;;;gBACN,OAAO"}
@@ -1,4 +1,6 @@
1
1
  import { assert } from "../../../core/assert.js";
2
+ import { array_insert_at } from "../../../core/collection/array/array_insert_at.js";
3
+ import { array_remove_at } from "../../../core/collection/array/array_remove_at.js";
2
4
  import { binarySearchHighIndex } from "../../../core/collection/array/binarySearchHighIndex.js";
3
5
 
4
6
  /**
@@ -16,8 +18,15 @@ import { binarySearchHighIndex } from "../../../core/collection/array/binarySear
16
18
  * immediately (within and across frames) — there is no frames-in-flight reuse gate; only
17
19
  * *destruction* is deferred, by {@link update}.
18
20
  *
21
+ * A record carries what the pool is ordered and accounted by, cached when its resource enters the
22
+ * pool: `size` here, and whatever else {@link describeRecord} adds for {@link compare} and
23
+ * {@link find}. A resource can be a platform object — a `GPUBuffer`'s `size` and `usage` are native
24
+ * reads — and the binary search and scan visit records many times a frame, so they read the record,
25
+ * never the resource.
26
+ *
19
27
  * @typedef {object} PoolRecord
20
28
  * @property {*} resource the pooled resource (or null while the record sits on the free-list)
29
+ * @property {number} size {@link sizeOf} the resource, as it was when it entered the pool
21
30
  * @property {number} last_used_frame frame the resource was last released into the pool
22
31
  * @property {boolean} referenced CLOCK second-chance bit; set on release and on reuse
23
32
  */
@@ -137,6 +146,15 @@ export class TransientResourcePool {
137
146
  throw new Error('TransientResourcePool.destroyResource is abstract');
138
147
  }
139
148
 
149
+ /**
150
+ * Cache on a record entering the pool whatever {@link compare} and {@link find} read beyond `size`,
151
+ * so neither has to ask the resource. Called on {@link release} once `resource` and `size` are set,
152
+ * and before the record is placed in order. Default: nothing.
153
+ * @param {PoolRecord} record
154
+ */
155
+ describeRecord(record) {
156
+ }
157
+
140
158
  /**
141
159
  * Hook invoked at the end of {@link get}, after the resource is acquired and tracked. Subclasses
142
160
  * override it for post-acquire work (clear-on-reuse, postcondition asserts). Default: nothing.
@@ -164,7 +182,7 @@ export class TransientResourcePool {
164
182
  const record = this.#free_records.pop();
165
183
 
166
184
  if (record === undefined) {
167
- return { resource: null, last_used_frame: 0, referenced: false };
185
+ return { resource: null, size: 0, last_used_frame: 0, referenced: false };
168
186
  }
169
187
 
170
188
  return record;
@@ -191,21 +209,25 @@ export class TransientResourcePool {
191
209
  const index = this.find(descriptor);
192
210
 
193
211
  let resource;
212
+ let size;
194
213
  let reused;
195
214
 
196
215
  if (index !== -1) {
197
216
  const record = this.records[index];
198
217
 
199
218
  resource = record.resource;
219
+ size = record.size;
200
220
 
201
- this.records.splice(index, 1);
202
- this.#bytes_pooled -= this.sizeOf(resource);
221
+ array_remove_at(this.records, index);
222
+ this.#bytes_pooled -= size;
203
223
 
204
224
  this.#recycle_record(record);
205
225
 
206
226
  reused = true;
207
227
  } else {
208
228
  resource = this.make(descriptor);
229
+ size = this.sizeOf(resource);
230
+
209
231
  this.#surge++;
210
232
 
211
233
  reused = false;
@@ -214,7 +236,7 @@ export class TransientResourcePool {
214
236
  assert.notOk(this.bound.has(resource), 'resource is already bound');
215
237
 
216
238
  this.bound.add(resource);
217
- this.#bytes_bound += this.sizeOf(resource);
239
+ this.#bytes_bound += size;
218
240
 
219
241
  this.afterAcquire(resource, descriptor, reused, context);
220
242
 
@@ -238,18 +260,25 @@ export class TransientResourcePool {
238
260
  }
239
261
 
240
262
  this.bound.delete(resource);
241
- this.#bytes_bound -= this.sizeOf(resource);
263
+
264
+ // the one time a pooling asks the resource its size: the record keeps it from here on
265
+ const size = this.sizeOf(resource);
266
+
267
+ this.#bytes_bound -= size;
242
268
 
243
269
  const record = this.#take_record();
244
270
 
245
271
  record.resource = resource;
272
+ record.size = size;
246
273
  record.last_used_frame = this.#frame;
247
274
  record.referenced = true;
248
275
 
276
+ this.describeRecord(record);
277
+
249
278
  const index = binarySearchHighIndex(this.records, record, this.#compare);
250
279
 
251
- this.records.splice(index, 0, record);
252
- this.#bytes_pooled += this.sizeOf(resource);
280
+ array_insert_at(this.records, index, record);
281
+ this.#bytes_pooled += size;
253
282
 
254
283
  if (this.debug_invariants) {
255
284
  this.assertInvariants();
@@ -294,9 +323,9 @@ export class TransientResourcePool {
294
323
 
295
324
  if (reclaim_budget > 0 && (under_pressure || idle_too_long)) {
296
325
  const resource = record.resource;
297
- const size = this.sizeOf(resource);
326
+ const size = record.size;
298
327
 
299
- records.splice(cursor, 1);
328
+ array_remove_at(records, cursor);
300
329
  this.#bytes_pooled -= size;
301
330
  over_budget -= size;
302
331
  record_count--;
@@ -371,7 +400,9 @@ export class TransientResourcePool {
371
400
  assert.lessThanOrEqual(this.compare(record, records[i + 1]), 0, `records not sorted at index ${i}`);
372
401
  }
373
402
 
374
- pooled_bytes += this.sizeOf(record.resource);
403
+ assert.equal(record.size, this.sizeOf(record.resource), `records[${i}].size is not its resource's`);
404
+
405
+ pooled_bytes += record.size;
375
406
  }
376
407
 
377
408
  assert.equal(this.#bytes_pooled, pooled_bytes, 'bytes_pooled drifted from actual pooled total');
@@ -1 +1 @@
1
- {"version":3,"file":"ComputeShader.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/shader/ComputeShader.js"],"names":[],"mappings":"AAMA;IA8FI;;;;;;;;;;OAUG;IACH;QAR4B,KAAK,GAAtB,MAAM;QAC+B,SAAS;QAC3B,IAAI;QACJ,UAAU,GAA7B,MAAM,EAAE;QAGN,aAAa,CAuBzB;IA5DD;;;OAGG;IACH,wBAFW,gBAAgB,EAwB1B;IAhFD;;;OAGG;IACH,0CAEC;IAgBD;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,mCAEC;IAgED;;;;;;OAMG;IACH;QAJ2C,OAAO;QACvB,QAAQ;mCA0BlC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH;QAP2C,OAAO;QACvB,QAAQ;QACP,cAAc,GAA/B,MAAM;QACW,cAAc,GAA/B,MAAM;QACW,cAAc,GAA/B,MAAM;aAgChB;IAED;;;;;;;;;;;;OAYG;IACH;QAL2C,OAAO;QACvB,QAAQ;QACR,aAAa,EAA7B,MAAM;aAsBhB;IAED;;;;;;;;OAQG;IACH;QAN2C,OAAO;QACvB,QAAQ;QACP,aAAa,GAA9B,MAAM;QACW,aAAa,GAA9B,MAAM;QACW,aAAa,GAA9B,MAAM;aA2ChB;IAED;;;;;;;;;;;;OAYG;IACH;QAL2C,OAAO;QACpB,OAAO;QACV,QAAQ;QACP,cAAc,GAA/B,MAAM;aAwChB;IAGL;;;OAGG;IACH,0BAFU,OAAO,CAEsB;;CANtC;0CA/VyC,gEAAgE;iCACzE,uBAAuB"}
1
+ {"version":3,"file":"ComputeShader.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/shader/ComputeShader.js"],"names":[],"mappings":"AAMA;IA0GI;;;;;;;;;;OAUG;IACH;QAR4B,KAAK,GAAtB,MAAM;QAC+B,SAAS;QAC3B,IAAI;QACJ,UAAU,GAA7B,MAAM,EAAE;QAGN,aAAa,CAuBzB;IA5DD;;;OAGG;IACH,wBAFW,gBAAgB,EAwB1B;IAhFD;;;OAGG;IACH,0CAEC;IAgBD;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;;OAGG;IACH,mCAEC;IAgED;;;;;;OAMG;IACH;QAJ2C,OAAO;QACvB,QAAQ;mCA8BlC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH;QAP2C,OAAO;QACvB,QAAQ;QACP,cAAc,GAA/B,MAAM;QACW,cAAc,GAA/B,MAAM;QACW,cAAc,GAA/B,MAAM;aAgChB;IAED;;;;;;;;;;;;OAYG;IACH;QAL2C,OAAO;QACvB,QAAQ;QACR,aAAa,EAA7B,MAAM;aAsBhB;IAED;;;;;;;;OAQG;IACH;QAN2C,OAAO;QACvB,QAAQ;QACP,aAAa,GAA9B,MAAM;QACW,aAAa,GAA9B,MAAM;QACW,aAAa,GAA9B,MAAM;aA2ChB;IAED;;;;;;;;;;;;OAYG;IACH;QAL2C,OAAO;QACpB,OAAO;QACV,QAAQ;QACP,cAAc,GAA/B,MAAM;aAwChB;IAGL;;;OAGG;IACH,0BAFU,OAAO,CAEsB;;CANtC;0CA/WyC,gEAAgE;iCACzE,uBAAuB"}
@@ -16,6 +16,18 @@ export class ComputeShader {
16
16
  */
17
17
  #pipeline;
18
18
 
19
+ /**
20
+ * The device this shader last passed {@link ShaderDescriptor#validate_against_device} on, or null.
21
+ *
22
+ * A device's limits and features are fixed for its life, and what this shader asks of them is fixed
23
+ * once it compiles, at construction. So the check is one per device rather than one per pass, which
24
+ * was ~400 native reads of `device.limits` and `device.features` a frame. Set only once the check
25
+ * has passed: a refused device is asked again, and refused again, every time.
26
+ *
27
+ * @type {GPUDevice|null}
28
+ */
29
+ #validated_device = null;
30
+
19
31
  /**
20
32
  *
21
33
  * @return {ComputePipelineDescriptor}
@@ -147,8 +159,12 @@ export class ComputeShader {
147
159
  assert.defined(encoder, 'encoder');
148
160
  assert.defined(bindings, 'bindings');
149
161
 
150
- if (VALIDATION_ENABLED) {
151
- this.#descriptor.validate_against_device(encoder.device);
162
+ const device = encoder.device;
163
+
164
+ if (VALIDATION_ENABLED && device !== this.#validated_device) {
165
+ this.#descriptor.validate_against_device(device);
166
+
167
+ this.#validated_device = device;
152
168
  }
153
169
 
154
170
  const resources = this.#descriptor.resources;
@@ -1 +1 @@
1
- {"version":3,"file":"ImageShader.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/shader/ImageShader.js"],"names":[],"mappings":"AAQA;;GAEG;AACH;IAyGI;;;;;;;OAOG;IACH;QALqC,UAAU;QACR,OAAO,EAAnC,kBAAkB;QACU,YAAY;QACtC,WAAW,CAavB;IAnFD;;;;;OAKG;IACH,sEAuDC;IAhGD;;;OAGG;IACH,mCAEC;IAED;;;OAGG;IACH,cAFU,MAAM,EAAE,EAAE,CAEF;IAOlB;;;OAGG;IACH,yCAEC;IAED;;;OAGG;IACH,6BAEC;IAuFD;;;;;;;;;OASG;IACH,6HAsEC;;CACJ"}
1
+ {"version":3,"file":"ImageShader.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/shader/ImageShader.js"],"names":[],"mappings":"AAQA;;GAEG;AACH;IAiHI;;;;;;;OAOG;IACH;QALqC,UAAU;QACR,OAAO,EAAnC,kBAAkB;QACU,YAAY;QACtC,WAAW,CAavB;IAnFD;;;;;OAKG;IACH,sEAuDC;IAxGD;;;OAGG;IACH,mCAEC;IAED;;;OAGG;IACH,cAFU,MAAM,EAAE,EAAE,CAEF;IAelB;;;OAGG;IACH,yCAEC;IAED;;;OAGG;IACH,6BAEC;IAuFD;;;;;;;;;OASG;IACH,6HA0EC;;CACJ"}