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)); }
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)); }