pub struct PresentArgs {
pub requested_presentation_time: Option<i64>,
pub acquire_fences: Option<Vec<Event>>,
pub release_fences: Option<Vec<Event>>,
pub unsquashable: Option<bool>,
pub server_wait_fences: Option<Vec<Event>>,
pub server_signal_fences: Option<Vec<Event>>,
/* private fields */
}
Expand description
Arguments passed into [Present
]. All arguments are optional, and if an
argument is omitted Flatland will use a reasonable default, specified below.
Fields§
§requested_presentation_time: Option<i64>
requested_presentation_time
specifies the time on or after which the client would like the
enqueued operations to take visible effect (light up pixels on the screen), expressed in
nanoseconds in the CLOCK_MONOTONIC
timebase.
The default requested_presentation_time
is 0.
Using a requested_presentation_time
in the present or past (such as 0) schedules enqueued
operations to take visible effect as soon as possible, during the next frame to be prepared.
Using a requested_presentation_time
in the future schedules the enqueued operations to
take visible effect on or as closely as possible after the stated time, but no earlier.
Each rendered frame has a target presentation time. This is when Flatland aims to have the
frame presented to the user. Before rendering a frame, Flatland applies all
enqueued operations associated with all squashable calls to [Present
] whose
requested_presentation_time
is on or before the frame’s target presentation time.
acquire_fences: Option<Vec<Event>>
Flatland will wait until all of a Flatland instance’s acquire_fences
are ready before it
will execute the presented commands. Not signaling acquire_fences
will block the current
[Present
] as well as the following ones even if their acquire_fences
are signaled.
The default acquire_fences
value is the empty vector.
release_fences: Option<Vec<Event>>
Flatland will signal all release_fences
when it is safe to reuse resources which no longer
appear in the local scene graph at the time of the current [Present
]. At the latest, this
will happen when the local scene graph (checkpointed at this [Present
]) has been
integrated into the global scene graph, and the global scene has been displayed on screen.
(Under some circumstances, the fences may be signaled earlier, but clients do not need to worry about this: the fences will only be signaled when it is safe to reuse the associated resources).
These fences are intended to manage the reuse of shared memory resources such as sysmem buffers. For example, it is undesirable for the client to render into an image which is currently displayed on screen, because this may result in graphical artifacts such as tearing.
It is up to the client to maintain the mapping between each fence and the resources which
will become reusable when the fence is signaled. A common strategy is to keep track of
resources which were used by the previous [Present
] but are no longer used by the current
[Present
]. For example, if an image is removed from the scene by the current [Present
],
the client would insert a fence here. When the fence is later signaled, the client knows
that it is safe to render into the image and insert it into the local scene graph in a
subsequent [Present
].
If an error occurs, Flatland may close the channel without signaling these fences. Clients may immediately release shared buffers, but they should not immediately modify such buffers, because they may still be displayed on screen. There is currently no good signal available to the client about when it is safe to reuse shared buffers.
The default release_fences
value is the empty vector.
unsquashable: Option<bool>
If unsquashable
is true, then the update is guaranteed to be uniquely shown for at
least one vsync interval.
If unsquashable
is false, then the update can be combined with those that come after
it.
If absent, unsquashable
is false.
server_wait_fences: Option<Vec<Event>>
Unused. Originally intended to be a renaming of acquire_fences
, but was never hooked up.
server_signal_fences: Option<Vec<Event>>
Unused. Originally intended to be a renaming of release_fences
, but was never hooked up.
Trait Implementations§
Source§impl Debug for PresentArgs
impl Debug for PresentArgs
Source§impl Decode<PresentArgs, DefaultFuchsiaResourceDialect> for PresentArgs
impl Decode<PresentArgs, DefaultFuchsiaResourceDialect> for PresentArgs
Source§fn new_empty() -> PresentArgs
fn new_empty() -> PresentArgs
Self
. The specific value does not matter,
since it will be overwritten by decode
.Source§impl Default for PresentArgs
impl Default for PresentArgs
Source§fn default() -> PresentArgs
fn default() -> PresentArgs
Source§impl Encode<PresentArgs, DefaultFuchsiaResourceDialect> for &mut PresentArgs
impl Encode<PresentArgs, DefaultFuchsiaResourceDialect> for &mut PresentArgs
Source§impl PartialEq for PresentArgs
impl PartialEq for PresentArgs
Source§impl ResourceTypeMarker for PresentArgs
impl ResourceTypeMarker for PresentArgs
Source§type Borrowed<'a> = &'a mut PresentArgs
type Borrowed<'a> = &'a mut PresentArgs
Encode<Self>
type cheaply obtainable from &mut Self::Owned
. There are three cases: Read moreSource§fn take_or_borrow<'a>(
value: &'a mut <PresentArgs as TypeMarker>::Owned,
) -> <PresentArgs as ResourceTypeMarker>::Borrowed<'a>
fn take_or_borrow<'a>( value: &'a mut <PresentArgs as TypeMarker>::Owned, ) -> <PresentArgs as ResourceTypeMarker>::Borrowed<'a>
&mut Self::Owned
to Self::Borrowed
. For
HandleBased
types this is “take” (it returns an owned handle and
replaces value
with Handle::invalid
), and for all other types it is
“borrow” (just converts from one reference to another).Source§impl TypeMarker for PresentArgs
impl TypeMarker for PresentArgs
Source§type Owned = PresentArgs
type Owned = PresentArgs
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.