File size: 1,352 Bytes
eae424a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | //! Compile-time constraints that dictate how inference is threaded.
//!
//! `blade_graphics::Context` is `Send + Sync` — it guards its queue,
//! memory manager, and XR session state behind mutexes — so an
//! `Arc<Context>` can be shared with a worker thread.
//!
//! `meganeura::Session` is **not** `Send`: it owns a
//! `blade_graphics::CommandEncoder`. The single offending field is
//! `ScratchBuffer::mapped`, a raw pointer into a persistently mapped
//! allocation — everything else is Vulkan handles, which are fine. (Rust has
//! no stable way to *assert* a negative, hence a comment not a test.)
//!
//! That is why [`dinovision::inference`] hands the worker an
//! `Arc<Context>` and has it construct the session in place. A one-line
//! `unsafe impl Send for ScratchBuffer` in blade lifts the constraint —
//! verified, and on the `command-encoder-send` branch there.
fn assert_send<T: Send>() {}
fn assert_sync<T: Sync>() {}
#[test]
fn context_can_be_shared_across_threads() {
assert_send::<blade_graphics::Context>();
assert_sync::<blade_graphics::Context>();
// Buffer handles carry explicit `unsafe impl Send/Sync`, so GPU-side
// results can be published to the render thread by handle.
assert_send::<blade_graphics::Buffer>();
assert_sync::<blade_graphics::Buffer>();
}
|