pub struct BufferMemorySettings {
pub size_bytes: Option<u64>,
pub is_physically_contiguous: Option<bool>,
pub is_secure: Option<bool>,
pub coherency_domain: Option<CoherencyDomain>,
pub heap: Option<Heap>,
pub raw_vmo_size: Option<u64>,
/* private fields */
}Expand description
These are memory-related settings for all buffers of a buffer collection.
Fields§
§size_bytes: Option<u64>This field will always be set by sysmem.
Rule for producers: For BufferCollectionInfo with
ImageFormatConstraints, storing an image of a given ImageFormat in a
buffer of that BufferCollection is only allowed if the result of
calling ImageFormatImageSize or a strictly equivalent computation is
less than or equal to size_bytes.
Producer participants must stay within size_bytes when determining
whether an image will fit in a buffer, even if the VMO’s size is larger
than this.
Failure of a producer to use size_bytes as the constraint (not VMO
size) when determining whether a given ImageFormat will fit in a
buffer will, in general, cause problems for any participant that has set
ImageFormatConstraints.pad_for_block_size to larger than {1, 1}, or
pad_beyond_image_size_bytes to greater than 0. Those participants rely
on the ability to access bytes in the VMO beyond the image size. Putting
an image in the VMO that exceeds size_bytes can potentially lead to
those participants trying to access an offset beyond the last page of
the VMO.
Similarly, any future padding-only constraint which is irrelevant to a
non-padding participant when locating each valid pixel’s valid data will
also be accounted for by checking ImageFormatImageSize() against
size_bytes instead of the VMO size.
Following this rule allows producers to not need to worry about arbitrary padding requirements of participants, including future-added padding-only constraints.
The bytes_per_row and rounding up to a tile size boundary are included
in ImageFormatImageSize and accounted for in size_bytes, even though
these two aspects are partially about padding. These two aspects are
included in the ImageFormatImageSize calculation because these two
aspects are also relevant to all participants that need to locate pixel
data. The fuchsia.images2.ImageFormat intentionally doesn’t contain
any padding-only fields.
Participants with a padding constraint (in addition to bytes_per_row
or tile size boundary), such as pad_for_block_size or
pad_beyond_image_size_bytes, are allowed to access, but not treat as
meaningful, bytes which are at offset size_bytes up to the max offset
implied by their own padding constraint, which will never exceed the VMO
size minus 1, as long as the ImageFormatImageSize is less than or
equal to BufferMemorySettings.size_bytes and other constraints under
BufferCollectionInfo aren’t violated by the producer.
The same size_bytes value is sent to all participants.
This field is not page aligned. This value rounded up to zx_system_page_size() boundary is guaranteed to be less than or equal the buffer VMO size. In other words, the VMO can have more pages than implied by this value, due to padding-only constraints from participant(s).
is_physically_contiguous: Option<bool>This field will always be set by sysmem.
is_secure: Option<bool>This field will always be set by sysmem.
coherency_domain: Option<CoherencyDomain>This field will always be set by sysmem.
heap: Option<Heap>The specific heap from which buffers are allocated.
This field will always be set by sysmem.
raw_vmo_size: Option<u64>This is guaranteed to be equal to the VMO size obtained via
zx_vmo_get_size. This field is here because pad_* constraints can
result in the VMO size being larger than implied by size_bytes, and
for participants using pad_* constraints, it can be convenient to have
this field available rather than having to query for the VMO size.
When checking with ImageFormatImageSize to see if an image will fit in
a buffer, use size_bytes as the threshold, not raw_vmo_size.
Producers using pad_* constraints must still only put images in the
buffer which have ImageFormatImageSize() <= size_bytes. Participants
using pad_* constraints are allowed to access bytes beyond
size_bytes consistent with what the participant set for the pad_*
constriant(s), which will always fit within raw_vmo_size assuming
correct operation of the participant and sysmem. This field can be
useful for double-checking that accesses will be within the VMO.
When setting up VMO mappings and VMO pins, a participant using pad_*
constraint(s) should use raw_vmo_size for the size of the mapping. In
contrast, a participant not using any pad_* constraint can use
size_bytes rounded up to a page size boundary or said participant can
use raw_vmo_size, but for that participant, using size_bytes rounded
up to the page size can avoid mapping a few pages.
Trait Implementations§
Source§impl Clone for BufferMemorySettings
impl Clone for BufferMemorySettings
Source§fn clone(&self) -> BufferMemorySettings
fn clone(&self) -> BufferMemorySettings
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BufferMemorySettings
impl Debug for BufferMemorySettings
Source§impl<D> Decode<BufferMemorySettings, D> for BufferMemorySettingswhere
D: ResourceDialect,
impl<D> Decode<BufferMemorySettings, D> for BufferMemorySettingswhere
D: ResourceDialect,
Source§fn new_empty() -> BufferMemorySettings
fn new_empty() -> BufferMemorySettings
Self. The specific value does not matter,
since it will be overwritten by decode.Source§impl Default for BufferMemorySettings
impl Default for BufferMemorySettings
Source§fn default() -> BufferMemorySettings
fn default() -> BufferMemorySettings
Source§impl<D> Encode<BufferMemorySettings, D> for &BufferMemorySettingswhere
D: ResourceDialect,
impl<D> Encode<BufferMemorySettings, D> for &BufferMemorySettingswhere
D: ResourceDialect,
Source§impl PartialEq for BufferMemorySettings
impl PartialEq for BufferMemorySettings
Source§impl TypeMarker for BufferMemorySettings
impl TypeMarker for BufferMemorySettings
Source§type Owned = BufferMemorySettings
type Owned = BufferMemorySettings
Source§fn inline_align(_context: Context) -> usize
fn inline_align(_context: Context) -> usize
Source§fn inline_size(_context: Context) -> usize
fn inline_size(_context: Context) -> usize
inline_align.Source§fn encode_is_copy() -> bool
fn encode_is_copy() -> bool
Self::Owned matches the FIDL wire
format and encoding requires no validation. When true, we can optimize
encoding arrays and vectors of Self::Owned to a single memcpy. Read moreSource§fn decode_is_copy() -> bool
fn decode_is_copy() -> bool
Self::Owned matches the FIDL wire
format and decoding requires no validation. When true, we can optimize
decoding arrays and vectors of Self::Owned to a single memcpy.Source§impl ValueTypeMarker for BufferMemorySettings
impl ValueTypeMarker for BufferMemorySettings
Source§type Borrowed<'a> = &'a BufferMemorySettings
type Borrowed<'a> = &'a BufferMemorySettings
Encode<Self>
type cheaply obtainable from &Self::Owned. There are three cases: Read moreSource§fn borrow(
value: &<BufferMemorySettings as TypeMarker>::Owned,
) -> <BufferMemorySettings as ValueTypeMarker>::Borrowed<'_>
fn borrow( value: &<BufferMemorySettings as TypeMarker>::Owned, ) -> <BufferMemorySettings as ValueTypeMarker>::Borrowed<'_>
&Self::Owned to Self::Borrowed.