@@ -650,6 +650,9 @@ impl Queue {
650650 buffer_offset : u64 ,
651651 buffer_size : wgt:: BufferSize ,
652652 ) -> Result < ( ) , TransferError > {
653+ if !matches ! ( & * buffer. map_state. lock( ) , BufferMapState :: Idle ) {
654+ todo ! ( ) ;
655+ }
653656 buffer. check_usage ( wgt:: BufferUsages :: COPY_DST ) ?;
654657 if buffer_size. get ( ) % wgt:: COPY_BUFFER_ALIGNMENT != 0 {
655658 return Err ( TransferError :: UnalignedCopySize ( buffer_size. get ( ) ) ) ;
@@ -692,27 +695,34 @@ impl Queue {
692695
693696 self . validate_write_buffer_impl ( & buffer, buffer_offset, staging_buffer. size ) ?;
694697
695- let region = hal:: BufferCopy {
696- src_offset : 0 ,
697- dst_offset : buffer_offset,
698- size : staging_buffer. size ,
699- } ;
700- let barriers = iter:: once ( hal:: BufferBarrier {
701- buffer : staging_buffer. raw ( ) ,
702- usage : hal:: StateTransition {
703- from : wgt:: BufferUses :: MAP_WRITE ,
704- to : wgt:: BufferUses :: COPY_SRC ,
705- } ,
706- } )
707- . chain ( transition. map ( |pending| pending. into_hal ( & buffer, snatch_guard) ) )
708- . collect :: < Vec < _ > > ( ) ;
709- let encoder = pending_writes. activate ( ) ;
710- unsafe {
711- encoder. transition_buffers ( & barriers) ;
712- encoder. copy_buffer_to_buffer ( staging_buffer. raw ( ) , dst_raw, & [ region] ) ;
713- }
698+ if buffer
699+ . usage
700+ . intersects ( wgt:: BufferUsages :: MAP_READ | wgt:: BufferUsages :: MAP_WRITE )
701+ {
702+ let asdf = buffer. raw ( & self . device . snatchable_lock . read ( ) ) . unwrap ( ) ;
703+ } else {
704+ let region = hal:: BufferCopy {
705+ src_offset : 0 ,
706+ dst_offset : buffer_offset,
707+ size : staging_buffer. size ,
708+ } ;
709+ let barriers = iter:: once ( hal:: BufferBarrier {
710+ buffer : staging_buffer. raw ( ) ,
711+ usage : hal:: StateTransition {
712+ from : wgt:: BufferUses :: MAP_WRITE ,
713+ to : wgt:: BufferUses :: COPY_SRC ,
714+ } ,
715+ } )
716+ . chain ( transition. map ( |pending| pending. into_hal ( & buffer, snatch_guard) ) )
717+ . collect :: < Vec < _ > > ( ) ;
718+ let encoder = pending_writes. activate ( ) ;
719+ unsafe {
720+ encoder. transition_buffers ( & barriers) ;
721+ encoder. copy_buffer_to_buffer ( staging_buffer. raw ( ) , dst_raw, & [ region] ) ;
722+ }
714723
715- pending_writes. insert_buffer ( & buffer) ;
724+ pending_writes. insert_buffer ( & buffer) ;
725+ }
716726
717727 // Ensure the overwritten bytes are marked as initialized so
718728 // they don't need to be nulled prior to mapping or binding.
0 commit comments