@@ -1029,6 +1029,54 @@ impl Device {
1029
1029
Ok ( buffer)
1030
1030
}
1031
1031
1032
+ #[ cfg( feature = "replay" ) ]
1033
+ pub fn set_buffer_data (
1034
+ self : & Arc < Self > ,
1035
+ buffer : & Arc < Buffer > ,
1036
+ offset : wgt:: BufferAddress ,
1037
+ data : & [ u8 ] ,
1038
+ ) -> resource:: BufferAccessResult {
1039
+ use crate :: resource:: RawResourceAccess ;
1040
+
1041
+ let device = & buffer. device ;
1042
+
1043
+ device. check_is_valid ( ) ?;
1044
+ buffer. check_usage ( wgt:: BufferUsages :: MAP_WRITE ) ?;
1045
+
1046
+ let last_submission = device
1047
+ . get_queue ( )
1048
+ . and_then ( |queue| queue. lock_life ( ) . get_buffer_latest_submission_index ( buffer) ) ;
1049
+
1050
+ if let Some ( last_submission) = last_submission {
1051
+ device. wait_for_submit ( last_submission) ?;
1052
+ }
1053
+
1054
+ let snatch_guard = device. snatchable_lock . read ( ) ;
1055
+ let raw_buf = buffer. try_raw ( & snatch_guard) ?;
1056
+
1057
+ let mapping = unsafe {
1058
+ device
1059
+ . raw ( )
1060
+ . map_buffer ( raw_buf, offset..offset + data. len ( ) as u64 )
1061
+ }
1062
+ . map_err ( |e| device. handle_hal_error ( e) ) ?;
1063
+
1064
+ unsafe { core:: ptr:: copy_nonoverlapping ( data. as_ptr ( ) , mapping. ptr . as_ptr ( ) , data. len ( ) ) } ;
1065
+
1066
+ if !mapping. is_coherent {
1067
+ #[ allow( clippy:: single_range_in_vec_init) ]
1068
+ unsafe {
1069
+ device
1070
+ . raw ( )
1071
+ . flush_mapped_ranges ( raw_buf, & [ offset..offset + data. len ( ) as u64 ] )
1072
+ } ;
1073
+ }
1074
+
1075
+ unsafe { device. raw ( ) . unmap_buffer ( raw_buf) } ;
1076
+
1077
+ Ok ( ( ) )
1078
+ }
1079
+
1032
1080
pub ( crate ) fn create_texture_from_hal (
1033
1081
self : & Arc < Self > ,
1034
1082
hal_texture : Box < dyn hal:: DynTexture > ,
@@ -2279,7 +2327,33 @@ impl Device {
2279
2327
. collect ( )
2280
2328
}
2281
2329
2282
- pub ( crate ) fn create_bind_group_layout (
2330
+ pub fn create_bind_group_layout (
2331
+ self : & Arc < Self > ,
2332
+ desc : & binding_model:: BindGroupLayoutDescriptor ,
2333
+ ) -> Result < Arc < BindGroupLayout > , binding_model:: CreateBindGroupLayoutError > {
2334
+ // this check can't go in the body of `create_bind_group_layout_internal` since the closure might not get called
2335
+ self . check_is_valid ( ) ?;
2336
+
2337
+ let entry_map = bgl:: EntryMap :: from_entries ( & self . limits , & desc. entries ) ?;
2338
+
2339
+ let bgl_result = self . bgl_pool . get_or_init ( entry_map, |entry_map| {
2340
+ let bgl =
2341
+ self . create_bind_group_layout_internal ( & desc. label , entry_map, bgl:: Origin :: Pool ) ?;
2342
+ bgl. exclusive_pipeline
2343
+ . set ( binding_model:: ExclusivePipeline :: None )
2344
+ . unwrap ( ) ;
2345
+ Ok ( bgl)
2346
+ } ) ;
2347
+
2348
+ match bgl_result {
2349
+ Ok ( layout) => Ok ( layout) ,
2350
+ Err ( e) => Err ( e) ,
2351
+ }
2352
+ }
2353
+
2354
+ /// Internal function exposed for use by `player` crate only.
2355
+ #[ doc( hidden) ]
2356
+ pub fn create_bind_group_layout_internal (
2283
2357
self : & Arc < Self > ,
2284
2358
label : & crate :: Label ,
2285
2359
entry_map : bgl:: EntryMap ,
@@ -3473,7 +3547,7 @@ impl Device {
3473
3547
match unique_bind_group_layouts. entry ( bgl_entry_map) {
3474
3548
hashbrown:: hash_map:: Entry :: Occupied ( v) => Ok ( Arc :: clone ( v. get ( ) ) ) ,
3475
3549
hashbrown:: hash_map:: Entry :: Vacant ( e) => {
3476
- match self . create_bind_group_layout (
3550
+ match self . create_bind_group_layout_internal (
3477
3551
& None ,
3478
3552
e. key ( ) . clone ( ) ,
3479
3553
bgl:: Origin :: Derived ,
0 commit comments