pub struct MtlCommandBufferRef { /* private fields */ }Expand description
id<MTLCommandBuffer> borrowed by
ExternalQueue::MetalCommandBuffer. Recording into the same
command buffer from multiple threads is undefined, and nothing
here prevents it — the borrow is shared and the newtype is Copy,
so confining recording to one thread is the caller’s obligation.
Implementations§
Source§impl MtlCommandBufferRef
impl MtlCommandBufferRef
Sourcepub unsafe fn try_from_raw(ptr: *mut c_void) -> Result<Self, InvalidHandleError>
pub unsafe fn try_from_raw(ptr: *mut c_void) -> Result<Self, InvalidHandleError>
Wrap a raw id<MTLCommandBuffer> in the typed newtype, rejecting null.
This is a borrow, not a transfer of ownership. The
newtype is Copy and stores nothing but the pointer’s
bit-pattern — no Arc, no keep-alive, no Drop. It never
retains, releases, destroys or closes the underlying
object, so its lifetime stays entirely the caller’s (or
the caller’s own producer’s) to manage.
§Safety
ptrmust be a liveid<MTLCommandBuffer>— that exact API kind, not merely a non-null pointer. The only check performed is the null rejection below; the value is otherwise stored verbatim and later handed to the bridge dispatcher, which calls into the owning API through it.- The referenced object must stay alive, and must not be
destroyed, for as long as this value or any
Copyof it exists — in particular for the whole of everycrate::ExternalQueue(or sync-target) borrow that names it. BecauseCopyduplicates the pointer with no refcount bump, destroying the object while a copy survives is a use-after-free the borrow checker cannot see. Callers anchor this with theArc<…>(or equivalent) they already hold on the producer side. - The object must tolerate use from a thread other than the
one that created it, and concurrent use from several:
MtlCommandBufferRefisSend + Sync, so a copy may be moved to and shared with the interop worker threads. Where the API forbids that — recording into oneid<MTLCommandBuffer>from two threads, or a GL context that is current on exactly one thread — the caller must confine the value itself; nothing here enforces it. ptrmay be null: that is reported asInvalidHandleError::NullPointerrather than being undefined behaviour, so a null check is not part of the caller’s obligation.
pub fn as_raw(&self) -> *mut c_void
Trait Implementations§
Source§impl Clone for MtlCommandBufferRef
impl Clone for MtlCommandBufferRef
impl Copy for MtlCommandBufferRef
Source§impl Debug for MtlCommandBufferRef
impl Debug for MtlCommandBufferRef
impl Send for MtlCommandBufferRef
impl Sync for MtlCommandBufferRef
Auto Trait Implementations§
impl Freeze for MtlCommandBufferRef
impl RefUnwindSafe for MtlCommandBufferRef
impl Unpin for MtlCommandBufferRef
impl UnsafeUnpin for MtlCommandBufferRef
impl UnwindSafe for MtlCommandBufferRef
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more