public Event EnqueueWriteBuffer <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.clEnqueueWriteBuffer( 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 EnqueueWriteBuffer <T>(Mem <T> buffer, bool blockingWrite, T[] ptr, Event[] eventWaitList) where T : struct { var offset = 0; var length = (uint)(Marshal.SizeOf <T>() * ptr.Length); if (buffer.Size < length) { throw new ArgumentException($"Memory buffer is to small: expected length >= {length}, found {buffer.Size}."); } 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.clEnqueueWriteBuffer( this.handle, buffer.handle, blockingWrite ? 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)); }