use super::{DeviceStream, Driver};
use crate::memory_management::drop_queue::Fence;
use crate::memory_management::relocation::{CopyQueue, StorageCopy};
use crate::server::{IoError, ServerError};
use crate::storage::ComputeStorage;
use alloc::vec::Vec;
pub(crate) struct StreamCopies<'a, D: Driver> {
signals: Vec<<D::Stream as DeviceStream>::Signal>,
queue: <D::Stream as DeviceStream>::Signal,
ctx: &'a mut D::Context,
}
impl<'a, D: Driver> StreamCopies<'a, D> {
pub(crate) fn new(
signals: Vec<<D::Stream as DeviceStream>::Signal>,
queue: <D::Stream as DeviceStream>::Signal,
ctx: &'a mut D::Context,
) -> Self {
Self {
signals,
queue,
ctx,
}
}
}
impl<D: Driver> CopyQueue<<D::Stream as DeviceStream>::DeviceStorage> for StreamCopies<'_, D> {
fn wait_device(&mut self) -> Result<(), ServerError> {
for signal in self.signals.iter() {
D::Stream::fence(*signal).wait()?;
}
D::wait_outside_streams(self.ctx)
}
fn copy(
&mut self,
storage: &mut <D::Stream as DeviceStream>::DeviceStorage,
copy: &StorageCopy,
) -> Result<(), IoError> {
let source = storage.get(©.source)?;
let target = storage.get(©.target)?;
unsafe { D::copy_on_device(&source, &target, self.queue) }
}
fn wait_copies(&mut self) -> Result<(), ServerError> {
D::Stream::fence(self.queue).wait()
}
}