@@ -26,9 +26,7 @@ use wgt::{BufferAddress, TextureFormat};
26
26
27
27
use std:: {
28
28
borrow:: Cow ,
29
- iter,
30
- ops:: Range ,
31
- ptr,
29
+ iter, ptr,
32
30
sync:: { atomic:: Ordering , Arc } ,
33
31
} ;
34
32
@@ -2336,15 +2334,18 @@ impl Global {
2336
2334
pub fn buffer_map_async < A : HalApi > (
2337
2335
& self ,
2338
2336
buffer_id : id:: BufferId ,
2339
- range : Range < BufferAddress > ,
2337
+ offset : BufferAddress ,
2338
+ size : Option < BufferAddress > ,
2340
2339
op : BufferMapOperation ,
2341
2340
) -> BufferAccessResult {
2342
- api_log ! ( "Buffer::map_async {buffer_id:?} range {range :?} op: {op:?}" ) ;
2341
+ api_log ! ( "Buffer::map_async {buffer_id:?} offset {offset:?} size {size :?} op: {op:?}" ) ;
2343
2342
2344
2343
// User callbacks must not be called while holding buffer_map_async_inner's locks, so we
2345
2344
// defer the error callback if it needs to be called immediately (typically when running
2346
2345
// into errors).
2347
- if let Err ( ( mut operation, err) ) = self . buffer_map_async_inner :: < A > ( buffer_id, range, op) {
2346
+ if let Err ( ( mut operation, err) ) =
2347
+ self . buffer_map_async_inner :: < A > ( buffer_id, offset, size, op)
2348
+ {
2348
2349
if let Some ( callback) = operation. callback . take ( ) {
2349
2350
callback. call ( Err ( err. clone ( ) ) ) ;
2350
2351
}
@@ -2360,7 +2361,8 @@ impl Global {
2360
2361
fn buffer_map_async_inner < A : HalApi > (
2361
2362
& self ,
2362
2363
buffer_id : id:: BufferId ,
2363
- range : Range < BufferAddress > ,
2364
+ offset : BufferAddress ,
2365
+ size : Option < BufferAddress > ,
2364
2366
op : BufferMapOperation ,
2365
2367
) -> Result < ( ) , ( BufferMapOperation , BufferAccessError ) > {
2366
2368
profiling:: scope!( "Buffer::map_async" ) ;
@@ -2372,22 +2374,43 @@ impl Global {
2372
2374
HostMap :: Write => ( wgt:: BufferUsages :: MAP_WRITE , hal:: BufferUses :: MAP_WRITE ) ,
2373
2375
} ;
2374
2376
2375
- if range. start % wgt:: MAP_ALIGNMENT != 0 || range. end % wgt:: COPY_BUFFER_ALIGNMENT != 0 {
2376
- return Err ( ( op, BufferAccessError :: UnalignedRange ) ) ;
2377
- }
2378
-
2379
2377
let buffer = {
2380
- let buffer = hub
2381
- . buffers
2382
- . get ( buffer_id)
2383
- . map_err ( |_| BufferAccessError :: Invalid ) ;
2378
+ let buffer = hub. buffers . get ( buffer_id) ;
2384
2379
2385
2380
let buffer = match buffer {
2386
2381
Ok ( b) => b,
2387
- Err ( e ) => {
2388
- return Err ( ( op, e ) ) ;
2382
+ Err ( _ ) => {
2383
+ return Err ( ( op, BufferAccessError :: Invalid ) ) ;
2389
2384
}
2390
2385
} ;
2386
+ {
2387
+ let snatch_guard = buffer. device . snatchable_lock . read ( ) ;
2388
+ if buffer. is_destroyed ( & snatch_guard) {
2389
+ return Err ( ( op, BufferAccessError :: Destroyed ) ) ;
2390
+ }
2391
+ }
2392
+
2393
+ let range_size = if let Some ( size) = size {
2394
+ size
2395
+ } else if offset > buffer. size {
2396
+ 0
2397
+ } else {
2398
+ buffer. size - offset
2399
+ } ;
2400
+
2401
+ if offset % wgt:: MAP_ALIGNMENT != 0 {
2402
+ return Err ( ( op, BufferAccessError :: UnalignedOffset { offset } ) ) ;
2403
+ }
2404
+ if range_size % wgt:: COPY_BUFFER_ALIGNMENT != 0 {
2405
+ return Err ( ( op, BufferAccessError :: UnalignedRangeSize { range_size } ) ) ;
2406
+ }
2407
+
2408
+ let range = offset..( offset + range_size) ;
2409
+
2410
+ if range. start % wgt:: MAP_ALIGNMENT != 0 || range. end % wgt:: COPY_BUFFER_ALIGNMENT != 0
2411
+ {
2412
+ return Err ( ( op, BufferAccessError :: UnalignedRange ) ) ;
2413
+ }
2391
2414
2392
2415
let device = & buffer. device ;
2393
2416
if !device. is_valid ( ) {
@@ -2417,11 +2440,6 @@ impl Global {
2417
2440
) ) ;
2418
2441
}
2419
2442
2420
- let snatch_guard = device. snatchable_lock . read ( ) ;
2421
- if buffer. is_destroyed ( & snatch_guard) {
2422
- return Err ( ( op, BufferAccessError :: Destroyed ) ) ;
2423
- }
2424
-
2425
2443
{
2426
2444
let map_state = & mut * buffer. map_state . lock ( ) ;
2427
2445
* map_state = match * map_state {
@@ -2442,6 +2460,8 @@ impl Global {
2442
2460
} ;
2443
2461
}
2444
2462
2463
+ let snatch_guard = buffer. device . snatchable_lock . read ( ) ;
2464
+
2445
2465
{
2446
2466
let mut trackers = buffer. device . as_ref ( ) . trackers . lock ( ) ;
2447
2467
trackers. buffers . set_single ( & buffer, internal_use) ;
0 commit comments