@@ -7,6 +7,13 @@ use std::sync::{Arc, Mutex, RwLock};
77
88use super :: MetalError ;
99
10+ // iOS and macOS have different storage modes for shared buffers.
11+ // due to the GPU/CPU management differences.
12+ #[ cfg( target_os = "ios" ) ]
13+ pub const SHARED_BUFFER_STORAGE_MODE : MTLResourceOptions = MTLResourceOptions :: StorageModeShared ;
14+ #[ cfg( not( target_os = "ios" ) ) ]
15+ pub const SHARED_BUFFER_STORAGE_MODE : MTLResourceOptions = MTLResourceOptions :: StorageModeManaged ;
16+
1017/// Unique identifier for cuda devices.
1118#[ derive( Clone , Copy , Debug , PartialEq , Eq , Hash ) ]
1219pub struct DeviceId ( usize ) ;
@@ -255,7 +262,7 @@ impl MetalDevice {
255262 /// synchronization when the CPU memory is modified
256263 /// Used as a bridge to gather data back from the GPU
257264 pub fn new_buffer_managed ( & self , size : NSUInteger ) -> Result < Arc < Buffer > > {
258- self . allocate_buffer ( size, MTLResourceOptions :: StorageModeManaged , "managed" )
265+ self . allocate_buffer ( size, SHARED_BUFFER_STORAGE_MODE , "managed" )
259266 }
260267
261268 /// Creates a new buffer from data.
@@ -268,12 +275,12 @@ impl MetalDevice {
268275 let new_buffer = self . device . new_buffer_with_data (
269276 data. as_ptr ( ) . cast ( ) ,
270277 size,
271- MTLResourceOptions :: StorageModeManaged ,
278+ SHARED_BUFFER_STORAGE_MODE ,
272279 ) ;
273280 let mut buffers = self . buffers . write ( ) . map_err ( MetalError :: from) ?;
274281
275282 let subbuffers = buffers
276- . entry ( ( size, MTLResourceOptions :: StorageModeManaged ) )
283+ . entry ( ( size, SHARED_BUFFER_STORAGE_MODE ) )
277284 . or_insert ( vec ! [ ] ) ;
278285
279286 let new_buffer = Arc :: new ( new_buffer) ;
0 commit comments