@@ -104,29 +104,65 @@ CuTextureArray(A::AbstractArray{T,N}) where {T,N} = CuTextureArray{T,N}(A)
104104
105105# # memory operations
106106
107- function Base. copyto! (dst:: CuTextureArray{T,1} , src:: Union{Array{T,1}, CuArray {T,1}} ) where {T}
107+ function Base. copyto! (dst:: CuTextureArray{T,1} , src:: Union{Array{T,1}, CuTextureArray {T,1}} ) where {T}
108108 size (dst) == size (src) || throw (DimensionMismatch (" source and destination sizes must match" ))
109109 Base. unsafe_copyto! (pointer (dst), pointer (src), length (dst))
110110 return dst
111111end
112112
113- function Base. copyto! (dst:: CuTextureArray{T,2 } , src:: Union{Array{T,2}, CuArray{T,2}} ) where {T}
113+ function Base. copyto! (dst:: CuTextureArray{T,1 } , src:: CuArray{T,1,M} ) where {T, M }
114114 size (dst) == size (src) || throw (DimensionMismatch (" source and destination sizes must match" ))
115- unsafe_copy2d! (pointer (dst), ArrayMemory,
116- pointer (src), isa (src, Array) ? HostMemory : DeviceMemory,
117- size (dst)... )
115+ if M <: Union{HostMemory, DeviceMemory}
116+ Base. unsafe_copyto! (pointer (dst), pointer (src; type= M), length (dst))
117+ else
118+ Base. unsafe_copyto! (pointer (dst), pointer (src), length (dst))
119+ end
118120 return dst
119121end
120122
121- function Base. copyto! (dst:: CuTextureArray{T,3 } , src:: Union{ Array{T,3}, CuArray{T,3} } ) where {T}
123+ function Base. copyto! (dst:: CuTextureArray{T,2 } , src:: Array{T,2 } ) where {T}
122124 size (dst) == size (src) || throw (DimensionMismatch (" source and destination sizes must match" ))
123- unsafe_copy3d! (pointer (dst), ArrayMemory,
124- pointer (src), isa (src, Array) ? HostMemory : DeviceMemory,
125- size (dst)... )
125+ unsafe_copy2d! (pointer (dst), ArrayMemory, pointer (src), HostMemory, size (dst)... )
126126 return dst
127127end
128128
129+ function Base. copyto! (dst:: CuTextureArray{T,2} , src:: CuArray{T,2,M} ) where {T, M}
130+ size (dst) == size (src) || throw (DimensionMismatch (" source and destination sizes must match" ))
131+ if M <: Union{HostMemory, DeviceMemory}
132+ unsafe_copy2d! (pointer (dst), ArrayMemory, pointer (src; type= M), M, size (dst)... )
133+ else
134+ unsafe_copy2d! (pointer (dst), ArrayMemory, pointer (src), M, size (dst)... )
135+ end
136+ return dst
137+ end
129138
139+ function Base. copyto! (dst:: CuTextureArray{T,2} , src:: CuTextureArray{T,2} ) where {T}
140+ size (dst) == size (src) || throw (DimensionMismatch (" source and destination sizes must match" ))
141+ unsafe_copy2d! (pointer (dst), ArrayMemory, pointer (src), ArrayMemory, size (dst)... )
142+ return dst
143+ end
144+
145+ function Base. copyto! (dst:: CuTextureArray{T,3} , src:: Array{T,3} ) where {T}
146+ size (dst) == size (src) || throw (DimensionMismatch (" source and destination sizes must match" ))
147+ unsafe_copy3d! (pointer (dst), ArrayMemory, pointer (src), HostMemory, size (dst)... )
148+ return dst
149+ end
150+
151+ function Base. copyto! (dst:: CuTextureArray{T,3} , src:: CuArray{T,3,M} ) where {T, M}
152+ size (dst) == size (src) || throw (DimensionMismatch (" source and destination sizes must match" ))
153+ if M <: Union{HostMemory, DeviceMemory}
154+ unsafe_copy3d! (pointer (dst), ArrayMemory, pointer (src; type= M), M, size (dst)... )
155+ else
156+ unsafe_copy3d! (pointer (dst), ArrayMemory, pointer (src), M, size (dst)... )
157+ end
158+ return dst
159+ end
160+
161+ function Base. copyto! (dst:: CuTextureArray{T,3} , src:: CuTextureArray{T,3} ) where {T}
162+ size (dst) == size (src) || throw (DimensionMismatch (" source and destination sizes must match" ))
163+ unsafe_copy3d! (pointer (dst), ArrayMemory, pointer (src), ArrayMemory, size (dst)... )
164+ return dst
165+ end
130166
131167#
132168# Texture objects
0 commit comments