use std::ffi::c_void;
use crate::effect::host::{Host, RenderKind};
use crate::types::Backend;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u32)]
pub enum PixelLayout {
Rgba = 0,
Bgra = 1,
Vuya601 = 2,
Vuya709 = 3,
}
impl PixelLayout {
pub const fn as_u32(self) -> u32 {
self as u32
}
pub const fn from_u32(v: u32) -> Self {
match v {
0 => PixelLayout::Rgba,
2 => PixelLayout::Vuya601,
3 => PixelLayout::Vuya709,
_ => PixelLayout::Bgra,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct FrameBinding {
pub data: *mut c_void,
pub pitch_px: i32,
pub width: u32,
pub height: u32,
pub mip_levels: u32,
pub bytes_per_pixel: u32,
pub pixel_layout: PixelLayout,
}
unsafe impl Send for FrameBinding {}
unsafe impl Sync for FrameBinding {}
impl FrameBinding {
pub const fn null(bytes_per_pixel: u32, pixel_layout: PixelLayout) -> Self {
Self {
data: std::ptr::null_mut(),
pitch_px: 0,
width: 0,
height: 0,
mip_levels: 0,
bytes_per_pixel,
pixel_layout,
}
}
pub fn is_null(&self) -> bool {
self.data.is_null()
}
}
pub struct InvocationBase {
pub host: Host,
pub backend: Backend,
pub render_kind: RenderKind,
pub device_handle: *mut c_void,
pub context_handle: Option<*mut c_void>,
pub command_queue_handle: *mut c_void,
pub bytes_per_pixel: u32,
pub pixel_layout: PixelLayout,
pub storage: u32,
pub time: f32,
pub progress: f32,
pub render_generation: u64,
pub main_source: FrameBinding,
pub incoming_source: Option<FrameBinding>,
pub outgoing_source: Option<FrameBinding>,
pub output: FrameBinding,
}
impl InvocationBase {
pub fn capabilities(&self) -> crate::effect::host::HostCapabilities {
crate::effect::host::HostCapabilities::new(self.host, self.backend)
}
}