@@ -465,53 +465,65 @@ pub enum BufferMapAsyncResult<T> {
465
465
Error ,
466
466
}
467
467
468
- struct BufferMapReadAsyncUserData < F : FnOnce ( BufferMapAsyncResult < & [ u8 ] > ) > {
468
+ struct BufferMapReadAsyncUserData < T , F >
469
+ where F : FnOnce ( BufferMapAsyncResult < & [ T ] > ) {
469
470
size : u32 ,
470
471
callback : F ,
472
+ phantom : std:: marker:: PhantomData < T > ,
471
473
}
472
474
473
- struct BufferMapWriteAsyncUserData < F : FnOnce ( BufferMapAsyncResult < & mut [ u8 ] > ) > {
475
+ struct BufferMapWriteAsyncUserData < T , F >
476
+ where F : FnOnce ( BufferMapAsyncResult < & mut [ T ] > ) {
474
477
size : u32 ,
475
478
callback : F ,
479
+ phantom : std:: marker:: PhantomData < T > ,
476
480
}
477
481
478
482
impl Buffer {
479
483
pub fn set_sub_data ( & self , offset : u32 , data : & [ u8 ] ) {
480
484
wgn:: wgpu_buffer_set_sub_data ( self . id , offset, data. len ( ) as u32 , data. as_ptr ( ) ) ;
481
485
}
482
486
483
- pub fn map_read_async < F > ( & self , start : u32 , size : u32 , callback : F )
484
- where F : FnOnce ( BufferMapAsyncResult < & [ u8 ] > ) {
485
- extern "C" fn buffer_map_read_callback_wrapper < F > ( status : wgn:: BufferMapAsyncStatus , data : * const u8 , userdata : * mut u8 )
486
- where F : FnOnce ( BufferMapAsyncResult < & [ u8 ] > ) {
487
- let userdata = unsafe { Box :: from_raw ( userdata as * mut BufferMapReadAsyncUserData < F > ) } ;
488
- let data = unsafe { slice:: from_raw_parts ( data, userdata. size as usize ) } ;
487
+ pub fn map_read_async < T , F > ( & self , start : u32 , size : u32 , callback : F )
488
+ where T : ' static + Copy , F : FnOnce ( BufferMapAsyncResult < & [ T ] > ) {
489
+ let type_size = std:: mem:: size_of :: < T > ( ) as u32 ;
490
+ assert_ne ! ( type_size, 0 ) ;
491
+ assert_eq ! ( size % type_size, 0 ) ;
492
+
493
+ extern "C" fn buffer_map_read_callback_wrapper < T , F > ( status : wgn:: BufferMapAsyncStatus , data : * const u8 , userdata : * mut u8 )
494
+ where F : FnOnce ( BufferMapAsyncResult < & [ T ] > ) {
495
+ let userdata = unsafe { Box :: from_raw ( userdata as * mut BufferMapReadAsyncUserData < T , F > ) } ;
496
+ let data = unsafe { slice:: from_raw_parts ( data as * const T , userdata. size as usize / std:: mem:: size_of :: < T > ( ) ) } ;
489
497
if let wgn:: BufferMapAsyncStatus :: Success = status {
490
- ( userdata. callback ) ( BufferMapAsyncResult :: Success ( data) ) ;
498
+ ( userdata. callback ) ( BufferMapAsyncResult :: Success :: < & [ T ] > ( data) ) ;
491
499
} else {
492
500
( userdata. callback ) ( BufferMapAsyncResult :: Error ) ;
493
501
}
494
502
}
495
503
496
- let userdata = Box :: new ( BufferMapReadAsyncUserData { size, callback} ) ;
497
- wgn:: wgpu_buffer_map_read_async ( self . id , start, size, buffer_map_read_callback_wrapper :: < F > , Box :: into_raw ( userdata) as * mut u8 ) ;
504
+ let userdata = Box :: new ( BufferMapReadAsyncUserData { size, callback, phantom : std :: marker :: PhantomData } ) ;
505
+ wgn:: wgpu_buffer_map_read_async ( self . id , start, size, buffer_map_read_callback_wrapper :: < T , F > , Box :: into_raw ( userdata) as * mut u8 ) ;
498
506
}
499
507
500
- pub fn map_write_async < F > ( & self , start : u32 , size : u32 , callback : F )
501
- where F : FnOnce ( BufferMapAsyncResult < & mut [ u8 ] > ) {
502
- extern "C" fn buffer_map_write_callback_wrapper < F > ( status : wgn:: BufferMapAsyncStatus , data : * mut u8 , userdata : * mut u8 )
503
- where F : FnOnce ( BufferMapAsyncResult < & mut [ u8 ] > ) {
504
- let userdata = unsafe { Box :: from_raw ( userdata as * mut BufferMapWriteAsyncUserData < F > ) } ;
505
- let data = unsafe { slice:: from_raw_parts_mut ( data, userdata. size as usize ) } ;
508
+ pub fn map_write_async < T , F > ( & self , start : u32 , size : u32 , callback : F )
509
+ where T : ' static + Copy , F : FnOnce ( BufferMapAsyncResult < & mut [ T ] > ) {
510
+ let type_size = std:: mem:: size_of :: < T > ( ) as u32 ;
511
+ assert_ne ! ( type_size, 0 ) ;
512
+ assert_eq ! ( size % type_size, 0 ) ;
513
+
514
+ extern "C" fn buffer_map_write_callback_wrapper < T , F > ( status : wgn:: BufferMapAsyncStatus , data : * mut u8 , userdata : * mut u8 )
515
+ where F : FnOnce ( BufferMapAsyncResult < & mut [ T ] > ) {
516
+ let userdata = unsafe { Box :: from_raw ( userdata as * mut BufferMapWriteAsyncUserData < T , F > ) } ;
517
+ let data = unsafe { slice:: from_raw_parts_mut ( data as * mut T , userdata. size as usize / std:: mem:: size_of :: < T > ( ) ) } ;
506
518
if let wgn:: BufferMapAsyncStatus :: Success = status {
507
- ( userdata. callback ) ( BufferMapAsyncResult :: Success ( data) ) ;
519
+ ( userdata. callback ) ( BufferMapAsyncResult :: Success :: < & mut [ T ] > ( data) ) ;
508
520
} else {
509
521
( userdata. callback ) ( BufferMapAsyncResult :: Error ) ;
510
522
}
511
523
}
512
524
513
- let userdata = Box :: new ( BufferMapWriteAsyncUserData { size, callback} ) ;
514
- wgn:: wgpu_buffer_map_write_async ( self . id , start, size, buffer_map_write_callback_wrapper :: < F > , Box :: into_raw ( userdata) as * mut u8 ) ;
525
+ let userdata = Box :: new ( BufferMapWriteAsyncUserData { size, callback, phantom : std :: marker :: PhantomData } ) ;
526
+ wgn:: wgpu_buffer_map_write_async ( self . id , start, size, buffer_map_write_callback_wrapper :: < T , F > , Box :: into_raw ( userdata) as * mut u8 ) ;
515
527
}
516
528
517
529
pub fn unmap ( & self ) {
0 commit comments