public void SetKernelArg(uint idx, HandleObject val) { var size = (IntPtr)Marshal.SizeOf <IntPtr>(); IntPtr obj = val.handle; var error = NativeMethods.clSetKernelArg(this.handle, idx, size, ref obj); if (error != ErrorCode.Success) { throw new OpenClException(error); } }
// Kernel methods public void SetKernelArg <T> (uint idx, T val) where T : struct { var size = (IntPtr)Marshal.SizeOf <T> (); GCHandle gch = GCHandle.Alloc(val, GCHandleType.Pinned); try { var error = NativeMethods.clSetKernelArg(this.handle, idx, size, gch.AddrOfPinnedObject()); if (error != ErrorCode.Success) { throw new OpenClException(error); } } finally { gch.Free(); } }