@@ -31,7 +31,7 @@ Base.convert(::Type{Ptr{T}}, ptr::MtlPtr) where {T} =
3131
3232#  CPU -> GPU
3333function  Base. unsafe_copyto! (dev:: MTLDevice , dst:: MtlPtr{T} , src:: Ptr{T} , N:: Integer ;
34-                              queue:: MTLCommandQueue = global_queue (dev), async:: Bool = false ) where  T
34+                              queue= use_metal4 ()  ?   global_queue4 (dev)  :   global_queue (dev), async:: Bool = false ) where  T
3535    storage_type =  dst. buffer. storageMode
3636    if  storage_type ==  MTL. MTLStorageModePrivate
3737        #  stage through a shared buffer
5353
5454#  GPU -> CPU
5555function  Base. unsafe_copyto! (dev:: MTLDevice , dst:: Ptr{T} , src:: MtlPtr{T} , N:: Integer ;
56-                              queue:: MTLCommandQueue = global_queue (dev), async:: Bool = false ) where  T
56+                              queue= use_metal4 ()  ?   global_queue4 (dev)  :   global_queue (dev), async:: Bool = false ) where  T
5757    storage_type =  src. buffer. storageMode
5858    if  storage_type ==  MTL. MTLStorageModePrivate
5959        #  stage through a shared buffer
8888#  GPU -> GPU
8989@autoreleasepool  function  Base. unsafe_copyto! (dev:: MTLDevice , dst:: MtlPtr{T} ,
9090                                              src:: MtlPtr{T} , N:: Integer ;
91-                                               queue:: MTLCommandQueue = global_queue (dev),
91+                                               queue= use_metal4 ()  ?   global_queue4 (dev)  :   global_queue (dev),
9292                                              async:: Bool = false ) where  T
9393    if  N >  0 
94-         cmdbuf =  MTLCommandBuffer (queue)
95-         MTLBlitCommandEncoder (cmdbuf) do  enc
96-             append_copy! (enc, dst. buffer, dst. offset, src. buffer, src. offset, N *  sizeof (T))
94+         if  queue isa  MTL4CommandQueue
95+             @info  " MTL4" 
96+             cmdbuf =  MTL4CommandBuffer (dev; queue) do  cmdbuf
97+                 MTL4ComputeCommandEncoder (cmdbuf, ! async) do  enc
98+                     append_copy! (enc, dst. buffer, dst. offset, src. buffer, src. offset, N *  sizeof (T))
99+                 end 
100+             end 
101+         else 
102+             @info  " MTL3" 
103+             cmdbuf =  MTLCommandBuffer (queue)
104+             MTLBlitCommandEncoder (cmdbuf) do  enc
105+                 append_copy! (enc, dst. buffer, dst. offset, src. buffer, src. offset, N *  sizeof (T))
106+             end 
107+             commit! (cmdbuf)
108+             async ||  wait_completed (cmdbuf)
97109        end 
98-         commit! (cmdbuf)
99-         async ||  wait_completed (cmdbuf)
100110    end 
101111    return  dst
102112end 
0 commit comments