Exemple #1
0
        ///<summary>
        ///Enqueues a command to copy data between buffers.
        ///</summary>
        ///<typeparam name = "T"> The type of data in the buffers. </typeparam>
        ///<param name = "source"> The buffer to copy from. </param>
        ///<param name = "destination"> The buffer to copy to. </param>
        ///<param name = "sourceOffset"> The <paramref name = "source"/> element position where reading starts. </param>
        ///<param name = "destinationOffset"> The <paramref name = "destination"/> element position where writing starts. </param>
        ///<param name = "region"> The region of elements to copy. </param>
        ///<paramref name = "events"/> is not <c> null </c> or read-only a new <param name = "events"> A collection of events that need to complete before this command   <see cref = "ComputeEvent"/> identifying this command is created and attached to the end of the collection. </param>
        public void Copy <T>(ComputeBufferBase <T> source, ComputeBufferBase <T> destination, long sourceOffset, long destinationOffset, long region, ICollection <ComputeEventBase> events) where T : struct
        {
            int sizeofT = Marshal.SizeOf(typeof(T));

            int eventWaitListSize;

            CLEventHandle[] eventHandles   = ComputeTools.ExtractHandles(events, out eventWaitListSize);
            bool            eventsWritable = (events != null && !events.IsReadOnly);

            CLEventHandle[] newEventHandle = (eventsWritable) ? new CLEventHandle[1] : null;

            ComputeErrorCode error = CL12.EnqueueCopyBuffer(Handle, source.Handle, destination.Handle, new IntPtr(sourceOffset * sizeofT), new IntPtr(destinationOffset * sizeofT), new IntPtr(region * sizeofT), eventWaitListSize, eventHandles, newEventHandle);

            ComputeException.ThrowOnError(error);

            if (eventsWritable)
            {
                events.Add(new ComputeEvent(newEventHandle[0], this));
            }
        }