@@ -526,7 +526,10 @@ impl crate::Device for super::Device {
526526 . private_caps
527527 . contains ( PrivateCapabilities :: BUFFER_ALLOCATION ) ;
528528
529- if emulate_map && desc. usage . intersects ( wgt:: BufferUses :: MAP_WRITE ) {
529+ if emulate_map
530+ && ( desc. usage . intersects ( wgt:: BufferUses :: MAP_WRITE )
531+ && !desc. usage . intersects ( wgt:: BufferUses :: MAP_READ ) )
532+ {
530533 return Ok ( super :: Buffer {
531534 raw : None ,
532535 target,
@@ -692,12 +695,21 @@ impl crate::Device for super::Device {
692695 }
693696 unsafe fn unmap_buffer ( & self , buffer : & super :: Buffer ) {
694697 if let Some ( raw) = buffer. raw {
695- if buffer. data . is_none ( ) {
696- let gl = & self . shared . context . lock ( ) ;
697- unsafe { gl. bind_buffer ( buffer. target , Some ( raw) ) } ;
698- unsafe { gl. unmap_buffer ( buffer. target ) } ;
699- unsafe { gl. bind_buffer ( buffer. target , None ) } ;
700- * lock ( & buffer. offset_of_current_mapping ) = 0 ;
698+ match & buffer. data {
699+ None => {
700+ let gl = & self . shared . context . lock ( ) ;
701+ unsafe { gl. bind_buffer ( buffer. target , Some ( raw) ) } ;
702+ unsafe { gl. unmap_buffer ( buffer. target ) } ;
703+ unsafe { gl. bind_buffer ( buffer. target , None ) } ;
704+ * lock ( & buffer. offset_of_current_mapping ) = 0 ;
705+ }
706+ Some ( data) => {
707+ let gl = & self . shared . context . lock ( ) ;
708+ let data = lock ( & * * data) ;
709+ unsafe { gl. bind_buffer ( buffer. target , Some ( raw) ) } ;
710+ unsafe { gl. buffer_sub_data_u8_slice ( buffer. target , 0 , & data) } ;
711+ unsafe { gl. bind_buffer ( buffer. target , None ) } ;
712+ }
701713 }
702714 }
703715 }
0 commit comments