use std::ptr;
use crate::*;
pub struct FrameStream<G: Graphics> {
session: Session<G>,
}
impl<G: Graphics> FrameStream<G> {
pub(crate) fn new(session: Session<G>) -> Self {
Self { session }
}
#[inline]
pub fn begin(&mut self) -> Result<()> {
unsafe {
cvt((self.fp().begin_frame)(self.session.as_raw(), ptr::null()))?;
}
Ok(())
}
#[inline]
pub fn end(
&mut self,
display_time: Time,
environment_blend_mode: EnvironmentBlendMode,
layers: &[&CompositionLayerBase<'_, G>],
) -> Result<()> {
assert!(layers.len() <= u32::MAX as usize);
let info = sys::FrameEndInfo {
ty: sys::FrameEndInfo::TYPE,
next: ptr::null(),
display_time,
environment_blend_mode,
layer_count: layers.len() as u32,
layers: layers.as_ptr() as _,
};
unsafe {
cvt((self.fp().end_frame)(self.session.as_raw(), &info))?;
}
Ok(())
}
#[inline]
pub fn end_secondary(
&mut self,
display_time: Time,
environment_blend_mode: EnvironmentBlendMode,
layers: &[&CompositionLayerBase<'_, G>],
secondary_info: SecondaryEndInfo<'_, '_, '_, G>,
) -> Result<()> {
assert!(layers.len() <= u32::MAX as usize);
assert!(secondary_info.layers.len() <= u32::MAX as usize);
let single_secondary_info = [sys::SecondaryViewConfigurationLayerInfoMSFT {
ty: sys::SecondaryViewConfigurationLayerInfoMSFT::TYPE,
next: ptr::null(),
view_configuration_type: secondary_info.ty,
environment_blend_mode: secondary_info.environment_blend_mode,
layer_count: secondary_info.layers.len() as u32,
layers: secondary_info.layers.as_ptr() as *const _,
}];
let secondary_info = sys::SecondaryViewConfigurationFrameEndInfoMSFT {
ty: sys::SecondaryViewConfigurationFrameEndInfoMSFT::TYPE,
next: ptr::null(),
view_configuration_count: 1,
view_configuration_layers_info: single_secondary_info.as_ptr() as *const _,
};
let info = sys::FrameEndInfo {
ty: sys::FrameEndInfo::TYPE,
next: &secondary_info as *const _ as *const _,
display_time,
environment_blend_mode,
layer_count: layers.len() as u32,
layers: layers.as_ptr() as _,
};
unsafe {
cvt((self.fp().end_frame)(self.session.as_raw(), &info))?;
}
Ok(())
}
#[inline]
fn fp(&self) -> &raw::Instance {
self.session.instance().fp()
}
}