pub mod blitter;
pub mod framebuffers;
pub mod spritemem;
use crate::{
scr::VideoFlags,
video_dma::{
blitter::{Blitter, BlitterGuard},
framebuffers::{Framebuffers, FramebuffersGuard},
spritemem::{SpriteMem, SpriteMemGuard},
},
};
#[repr(C)]
pub(crate) enum VideoDma {
DmaFb(Framebuffers),
DmaBlit(Blitter),
DmaSprites(SpriteMem),
}
#[repr(C)]
pub struct DmaManager {
pub(crate) video_dma: Option<VideoDma>,
}
impl DmaManager {
pub(crate) fn new(vdma: VideoDma) -> Self {
Self {
video_dma: Some(vdma),
}
}
pub fn blitter<'a>(&'a mut self, vf: &'a mut VideoFlags) -> Option<BlitterGuard<'a>> {
let b = self.video_dma.take()?.blitter(vf);
Some(BlitterGuard {
dma_slot: &mut self.video_dma,
video_flags: vf,
inner: b,
})
}
pub fn framebuffers<'a>(&'a mut self, vf: &'a mut VideoFlags) -> Option<FramebuffersGuard<'a>> {
let fb = self.video_dma.take()?.framebuffers(vf);
Some(FramebuffersGuard {
dma_slot: &mut self.video_dma,
inner: fb,
})
}
pub fn sprite_mem<'a>(&'a mut self, vf: &'a mut VideoFlags) -> Option<SpriteMemGuard<'a>> {
let sm = self.video_dma.take()?.sprite_mem(vf);
Some(SpriteMemGuard {
dma_slot: &mut self.video_dma,
inner: sm,
})
}
}
impl VideoDma {
#[inline(always)]
fn framebuffers(self, vf: &mut VideoFlags) -> Framebuffers {
match self {
VideoDma::DmaFb(framebuffers) => framebuffers,
VideoDma::DmaBlit(blitter) => blitter.framebuffers(vf),
VideoDma::DmaSprites(sprite_mem) => sprite_mem.framebuffers(vf),
}
}
#[inline(always)]
fn blitter(self, vf: &mut VideoFlags) -> Blitter {
match self {
VideoDma::DmaFb(framebuffers) => framebuffers.blitter(vf),
VideoDma::DmaBlit(blitter) => blitter,
VideoDma::DmaSprites(sprite_mem) => sprite_mem.blitter(vf),
}
}
#[inline(always)]
fn sprite_mem(self, vf: &mut VideoFlags) -> SpriteMem {
match self {
VideoDma::DmaFb(framebuffers) => framebuffers.sprite_mem(vf),
VideoDma::DmaBlit(blitter) => blitter.sprite_mem(vf),
VideoDma::DmaSprites(sprite_mem) => sprite_mem,
}
}
}