@@ -299,12 +299,17 @@ pub struct PendingNv12Readback {
299299}
300300
301301impl 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
421429impl 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