예제 #1
0
        public Event EnqueueReadBuffer <T>(Mem <T> buffer, bool blockingRead, uint offset, uint length, T[] ptr, Event[] eventWaitList) where T : struct
        {
            var numEvents = 0;

            IntPtr[] events = null;
            if (eventWaitList != null)
            {
                numEvents = eventWaitList.Length;
                events    = Event.ToIntPtr(eventWaitList);
            }
            IntPtr   result = IntPtr.Zero;
            GCHandle gch    = GCHandle.Alloc(ptr, GCHandleType.Pinned);

            try {
                var error = NativeMethods.clEnqueueReadBuffer(
                    this.handle,
                    buffer.handle,
                    blockingRead ? 1u : 0u,
                    (IntPtr)offset,
                    (IntPtr)length,
                    gch.AddrOfPinnedObject(),
                    (uint)numEvents,
                    events,
                    out result);
                if (error != ErrorCode.Success)
                {
                    throw new OpenClException(error);
                }
            }
            finally {
                gch.Free();
            }
            return(new Event(result));
        }
예제 #2
0
        public Event EnqueueReadBuffer <T>(Mem <T> buffer, bool blockingRead, T[] ptr, Event[] eventWaitList) where T : struct
        {
            var offset = 0;
            var length = buffer.Size;

            if (length > (uint)(Marshal.SizeOf <T>() * ptr.Length))
            {
                throw new ArgumentException(String.Format("Data array is to small: expected length >= {0}, found {1}.", length, Marshal.SizeOf <T>() * ptr.Length));
            }
            var numEvents = 0;

            IntPtr[] events = null;
            if (eventWaitList != null)
            {
                numEvents = eventWaitList.Length;
                events    = Event.ToIntPtr(eventWaitList);
            }
            IntPtr   result = IntPtr.Zero;
            GCHandle gch    = GCHandle.Alloc(ptr, GCHandleType.Pinned);

            try {
                var error = NativeMethods.clEnqueueReadBuffer(
                    this.handle,
                    buffer.handle,
                    blockingRead ? 1u : 0u,
                    (IntPtr)offset,
//                    (IntPtr)(Marshal.SizeOf<T>()*ptr.Length),
                    (IntPtr)length,
                    gch.AddrOfPinnedObject(),
                    (uint)numEvents,
                    events,
                    out result);
                if (error != ErrorCode.Success)
                {
                    throw new OpenClException(error);
                }
            }
            finally {
                gch.Free();
            }
            return(new Event(result));
        }