Skip to content

Commit e28c000

Browse files
committed
Add cancel helper and improve readback error handling
1 parent b34291a commit e28c000

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

crates/rendering/src/frame_pipeline.rs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -299,12 +299,17 @@ pub struct PendingNv12Readback {
299299
}
300300

301301
impl PendingNv12Readback {
302+
fn cancel(self) -> RenderingError {
303+
self.buffer.unmap();
304+
RenderingError::BufferMapWaitingFailed
305+
}
306+
302307
pub async fn wait(
303308
mut self,
304309
device: &wgpu::Device,
305310
) -> Result<Nv12RenderedFrame, RenderingError> {
306311
let Some(mut rx) = self.rx.take() else {
307-
return Err(RenderingError::BufferMapWaitingFailed);
312+
return Err(self.cancel());
308313
};
309314

310315
let mut poll_count = 0u32;
@@ -313,14 +318,17 @@ impl PendingNv12Readback {
313318

314319
loop {
315320
if start_time.elapsed() > timeout_duration {
316-
return Err(RenderingError::BufferMapWaitingFailed);
321+
return Err(self.cancel());
317322
}
318323

319324
match rx.try_recv() {
320-
Ok(result) => {
321-
result?;
322-
break;
323-
}
325+
Ok(result) => match result {
326+
Ok(()) => break,
327+
Err(error) => {
328+
self.buffer.unmap();
329+
return Err(RenderingError::BufferMapFailed(error));
330+
}
331+
},
324332
Err(oneshot::error::TryRecvError::Empty) => {
325333
device.poll(wgpu::PollType::Poll)?;
326334
poll_count += 1;
@@ -333,7 +341,7 @@ impl PendingNv12Readback {
333341
}
334342
}
335343
Err(oneshot::error::TryRecvError::Closed) => {
336-
return Err(RenderingError::BufferMapWaitingFailed);
344+
return Err(self.cancel());
337345
}
338346
}
339347
}
@@ -419,6 +427,11 @@ pub struct PendingReadback {
419427
}
420428

421429
impl PendingReadback {
430+
fn cancel(&self) -> RenderingError {
431+
self.buffer.unmap();
432+
RenderingError::BufferMapWaitingFailed
433+
}
434+
422435
pub async fn wait(mut self, device: &wgpu::Device) -> Result<RenderedFrame, RenderingError> {
423436
let mut poll_count = 0u32;
424437
let start_time = Instant::now();
@@ -433,14 +446,17 @@ impl PendingReadback {
433446
"GPU buffer mapping timed out after {}s",
434447
GPU_BUFFER_WAIT_TIMEOUT_SECS
435448
);
436-
return Err(RenderingError::BufferMapWaitingFailed);
449+
return Err(self.cancel());
437450
}
438451

439452
match self.rx.try_recv() {
440-
Ok(result) => {
441-
result?;
442-
break;
443-
}
453+
Ok(result) => match result {
454+
Ok(()) => break,
455+
Err(error) => {
456+
self.buffer.unmap();
457+
return Err(RenderingError::BufferMapFailed(error));
458+
}
459+
},
444460
Err(oneshot::error::TryRecvError::Empty) => {
445461
device.poll(wgpu::PollType::Poll)?;
446462
poll_count += 1;
@@ -461,7 +477,7 @@ impl PendingReadback {
461477
}
462478
}
463479
Err(oneshot::error::TryRecvError::Closed) => {
464-
return Err(RenderingError::BufferMapWaitingFailed);
480+
return Err(self.cancel());
465481
}
466482
}
467483
}

0 commit comments

Comments
 (0)