Beispiel #1
0
        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));
        }
Beispiel #2
0
        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));
        }