Use immediate command lists

This commit is contained in:
Andrzej Janik
2021-07-04 16:46:07 +02:00
parent ecc33f7b10
commit ce25035051
3 changed files with 28 additions and 18 deletions

View File

@ -1122,6 +1122,11 @@ impl<'a> Event<'a> {
Ok(unsafe { Self::from_ffi(result) }) Ok(unsafe { Self::from_ffi(result) })
} }
pub fn host_synchronize(&self, timeout_ns: u64) -> Result<()> {
check!{ sys::zeEventHostSynchronize(self.as_ffi(), timeout_ns) };
Ok(())
}
pub fn is_ready(&self) -> Result<bool> { pub fn is_ready(&self) -> Result<bool> {
let status = unsafe { sys::zeEventQueryStatus(self.as_ffi()) }; let status = unsafe { sys::zeEventQueryStatus(self.as_ffi()) };
match status { match status {

View File

@ -275,23 +275,25 @@ impl GlobalState {
fn lock_enqueue( fn lock_enqueue(
stream: *mut stream::Stream, stream: *mut stream::Stream,
f: impl FnOnce(&l0::CommandList, &l0::Event<'static>, &[&l0::Event<'static>]) -> Result<(), CUresult>, f: impl FnOnce(
&l0::CommandList,
&l0::Event<'static>,
&[&l0::Event<'static>],
) -> Result<(), CUresult>,
) -> Result<(), CUresult> { ) -> Result<(), CUresult> {
Self::lock_stream(stream, |stream_data| { Self::lock_stream(stream, |stream_data| {
let l0_dev = unsafe { (*(*stream_data.context).device).base }; let l0_dev = unsafe { (*(*stream_data.context).device).base };
let l0_ctx = unsafe { &mut (*(*stream_data.context).device).l0_context }; let l0_ctx = unsafe { &mut (*(*stream_data.context).device).l0_context };
let event_pool = unsafe { &mut (*(*stream_data.context).device).event_pool }; let event_pool = unsafe { &mut (*(*stream_data.context).device).event_pool };
let cmd_list = unsafe { mem::transmute(stream_data.command_list()?) }; let cmd_list = unsafe { transmute_lifetime(&stream_data.cmd_list) };
stream_data stream_data
.process_finished_events(&mut |(_, marker)| event_pool.mark_as_free(marker))?; .drop_finished_events(&mut |(_, marker)| event_pool.mark_as_free(marker))?;
let prev_event = stream_data.get_last_event(); let prev_event = stream_data.get_last_event();
let prev_event_array = prev_event.map(|e| [e]); let prev_event_array = prev_event.map(|e| [e]);
let empty = []; let empty = [];
let prev_event_slice = prev_event_array.as_ref().map_or(&empty[..], |arr| &arr[..]); let prev_event_slice = prev_event_array.as_ref().map_or(&empty[..], |arr| &arr[..]);
let (new_event, new_marker) = event_pool.get(l0_dev, l0_ctx)?; let (new_event, new_marker) = event_pool.get(l0_dev, l0_ctx)?;
f(&cmd_list, &new_event, prev_event_slice)?; f(cmd_list, &new_event, prev_event_slice)?;
cmd_list.close()?;
unsafe { stream_data.queue.execute(&cmd_list, None)? };
stream_data.push_event((new_event, new_marker)); stream_data.push_event((new_event, new_marker));
Ok(()) Ok(())
})? })?

View File

@ -33,7 +33,8 @@ impl HasLivenessCookie for StreamData {
pub struct StreamData { pub struct StreamData {
pub context: *mut ContextData, pub context: *mut ContextData,
pub queue: l0::CommandQueue<'static>, // Immediate CommandList
pub cmd_list: l0::CommandList<'static>,
pub prev_events: VecDeque<(l0::Event<'static>, u64)>, pub prev_events: VecDeque<(l0::Event<'static>, u64)>,
} }
@ -44,7 +45,7 @@ impl StreamData {
) -> Result<Self, CUresult> { ) -> Result<Self, CUresult> {
Ok(StreamData { Ok(StreamData {
context: ptr::null_mut(), context: ptr::null_mut(),
queue: l0::CommandQueue::new(ctx, device)?, cmd_list: l0::CommandList::new_immediate(ctx, device)?,
prev_events: VecDeque::new(), prev_events: VecDeque::new(),
}) })
} }
@ -53,18 +54,12 @@ impl StreamData {
let device = unsafe { &*ctx.device }.base; let device = unsafe { &*ctx.device }.base;
Ok(StreamData { Ok(StreamData {
context: ctx as *mut _, context: ctx as *mut _,
queue: l0::CommandQueue::new(l0_ctx, device)?, cmd_list: l0::CommandList::new_immediate(l0_ctx, device)?,
prev_events: VecDeque::new(), prev_events: VecDeque::new(),
}) })
} }
pub fn command_list(&self) -> Result<l0::CommandList, l0::sys::_ze_result_t> { pub fn drop_finished_events(
let ctx = unsafe { &mut *self.context };
let dev = unsafe { &mut *ctx.device };
l0::CommandList::new(&mut dev.l0_context, dev.base)
}
pub fn process_finished_events(
&mut self, &mut self,
f: &mut impl FnMut((l0::Event<'static>, u64)), f: &mut impl FnMut((l0::Event<'static>, u64)),
) -> l0::Result<()> { ) -> l0::Result<()> {
@ -82,6 +77,12 @@ impl StreamData {
} }
} }
pub fn drop_all_events(&mut self, f: &mut impl FnMut((l0::Event<'static>, u64))) {
for x in self.prev_events.drain(..) {
f(x);
}
}
pub fn get_last_event(&self) -> Option<&l0::Event<'static>> { pub fn get_last_event(&self) -> Option<&l0::Event<'static>> {
self.prev_events.iter().next_back().map(|(ev, _)| ev) self.prev_events.iter().next_back().map(|(ev, _)| ev)
} }
@ -91,9 +92,11 @@ impl StreamData {
} }
pub fn synchronize(&mut self) -> l0::Result<()> { pub fn synchronize(&mut self) -> l0::Result<()> {
self.queue.synchronize(u64::MAX)?; if let Some((ev, _)) = self.prev_events.back() {
ev.host_synchronize(u64::MAX)?;
}
let event_pool = unsafe { &mut (*(*self.context).device).event_pool }; let event_pool = unsafe { &mut (*(*self.context).device).event_pool };
self.process_finished_events(&mut |(_, marker)| event_pool.mark_as_free(marker))?; self.drop_all_events(&mut |(_, marker)| event_pool.mark_as_free(marker));
Ok(()) Ok(())
} }
} }