pub struct BlobPlane<'a> {
pub handle: i64,
pub offset: u64,
pub stride: u64,
pub size: u64,
pub used: u64,
pub modifier: u64,
pub handle_bytes: &'a [u8],
pub data: &'a [u8],
}Expand description
One plane record, borrowed from the buffer.
Field names and widths mirror TensorPlane.msg so the two map 1:1. All
scalars are 64-bit, and handle is i64 rather than an fd-sized i32:
cheap now, and the alternative breaks the round-trip property, since a
u32 size would cap a plane at 4 GiB — which camera frames never reach
but a tensor carrying model weights plausibly does.
The two transport modes are distinguished by handle:
handle >= 0— reference: the bytes live behind the handle, anddatais empty.handle == -1— inline: the bytes are indata,offsetis ignored,sizedescribesdata, andmodifiermust be 0.
Fields§
§handle: i64In reference mode, an INDEX into the accompanying fd table — not a
raw file descriptor. -1 when inline.
This is an ABI decision, not an implementation detail. A raw fd is
meaningless in the receiving process: fds travel out of band via
SCM_RIGHTS or pidfd_getfd, and the receiver is handed different
numbers than the sender used. Wayland, D-Bus and CameraFrame all carry
the same (payload, fds) split for the same reason.
Indices also let planes share a descriptor: NV12’s luma and chroma commonly live in one dma-buf at different offsets, and both planes then carry index 0 while the table holds a single fd.
Windows has no fd table: a D3D11 texture is shared by NT handle, which
is a value in the exporting process’s handle table rather than a
descriptor an out-of-band table can carry. Such a plane carries index
0 over an empty table — non-negative, so the record is still a
reference and not an inline one — and its handles live in
Self::handle_bytes.
offset: u64Byte offset of this plane within the handle; ignored when inline.
stride: u64Bytes per line of this plane.
size: u64Plane capacity in bytes.
used: u64Valid payload bytes; used <= size.
modifier: u64DRM format modifier. 0 = linear. A consumer that does not recognise a non-zero value must refuse, not read the plane as linear.
handle_bytes: &'a [u8]Opaque handle for backends whose handle is not an integer (a
cudaIpcMemHandle_t is 64 bytes), or whose handle does not travel in
the fd table at all.
Windows D3D11 textures are the one storage kind that fills this in
today: D3D11_HANDLE_BYTES bytes holding the texture’s NT handle
value, the process device fence’s NT handle value and the fence value
of the producer’s last recorded GPU write, each a little-endian u64.
All three are values in the exporting process’s handle table, which is
why the header’s BlobHeader::pid is what makes them reachable –
and why that field documents the trust boundary they share.
data: &'a [u8]Inlined plane bytes; non-empty only when handle == -1.
Implementations§
Trait Implementations§
impl<'a> Copy for BlobPlane<'a>
impl<'a> Eq for BlobPlane<'a>
impl<'a> StructuralPartialEq for BlobPlane<'a>
Auto Trait Implementations§
impl<'a> Freeze for BlobPlane<'a>
impl<'a> RefUnwindSafe for BlobPlane<'a>
impl<'a> Send for BlobPlane<'a>
impl<'a> Sync for BlobPlane<'a>
impl<'a> Unpin for BlobPlane<'a>
impl<'a> UnsafeUnpin for BlobPlane<'a>
impl<'a> UnwindSafe for BlobPlane<'a>
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more