예제 #1
0
파일: Form1.cs 프로젝트: ctapang/GPUCyclops
        /// <summary>
        /// Test all versions of:
        /// 
        /// EnqueueMapBuffer
        /// EnqueueMapImage
        /// 
        /// The test bounces an array from a managed byte buffer to a mapped buffer,
        /// to an image. The image is then mapped and copied to a new managed buffer
        /// where the result is compared to the original.
        /// 
        /// On error, the actual point of failure will have to be identified manually.
        /// </summary>
        /// <param name="c"></param>
        /// <param name="cq"></param>
        private void TestMapBuffer(Context c, CommandQueue cq)
        {
            if (!cq.Device.ImageSupport)
            {
                Output("Skipping EnqueueMapBuffer and EnqueueMapImage tests(not supported on this device)");
                return;
            }

            Output("Testing MapBuffer");

            OpenCLNet.Image img0 = null;
            OpenCLNet.Mem mem0 = null;
            int imgWidth = 1024;
            int imgHeight = 1024;
            int bufLen = imgWidth * 4 * imgHeight;
            byte[] srcData = new byte[bufLen];
            byte[] cmpData = new byte[bufLen];
            Event event0;
            Event event1;

            for (int i = 0; i < srcData.Length; i++)
                srcData[i] = (byte)(i);
            Array.Clear(cmpData, 0, cmpData.Length);

            try
            {
                img0 = c.CreateImage2D(MemFlags.READ_WRITE, ImageFormat.RGBA8U, imgWidth, imgHeight);
                mem0 = c.CreateBuffer(MemFlags.READ_WRITE, bufLen, IntPtr.Zero);

                Array.Clear(cmpData, 0, cmpData.Length);
                fixed (byte* pSrc = srcData)
                {
                    fixed (byte* pCmp = cmpData)
                    {
                        {
                            IntPtr[] origin = new IntPtr[3] { (IntPtr)0, (IntPtr)0, (IntPtr)0 };
                            IntPtr[] region = new IntPtr[3] { (IntPtr)imgWidth, (IntPtr)imgHeight, (IntPtr)1 };
                            IntPtr[] dstOrigin = new IntPtr[3] { (IntPtr)0, (IntPtr)0, (IntPtr)0 };
                            IntPtr[] dstRegion = new IntPtr[3] { (IntPtr)imgWidth, (IntPtr)imgHeight, (IntPtr)1 };
                            IntPtr mapPtr;
                            byte* pMapPtr;
                            IntPtr image_row_pitch;
                            IntPtr image_slice_pitch;

                            Array.Clear(cmpData, 0, cmpData.Length);
                            mapPtr = cq.EnqueueMapBuffer(mem0, true, MapFlags.WRITE, 0, bufLen);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int i = 0; i < bufLen; i++)
                                pMapPtr[i] = srcData[i];
                            cq.EnqueueUnmapMemObject(mem0, mapPtr);
                            cq.EnqueueCopyBufferToImage(mem0, img0, (IntPtr)0, origin, region);

                            mapPtr = cq.EnqueueMapImage(img0, true, MapFlags.READ, origin, region, out image_row_pitch, out image_slice_pitch);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int y = 0; y < imgHeight; y++)
                            {
                                byte* pSrcRowPtr = pMapPtr + y * (int)image_row_pitch;
                                byte* pDstRowPtr = pCmp + y*imgWidth*4;
                                for (int x = 0; x < imgWidth * 4; x++)
                                {
                                    pDstRowPtr[x] = pSrcRowPtr[x];
                                }
                            }
                            cq.EnqueueUnmapMemObject(img0, mapPtr);
                            if (!CompareArray(cmpData, srcData))
                                Error("EnqueueEnqueueMapBuffer/EnqueueMapImage: (IntPtr version)Copy not identical to source when using no event args");

                            Array.Clear(cmpData, 0, cmpData.Length);
                            mapPtr = cq.EnqueueMapBuffer(mem0, true, MapFlags.WRITE, 0, bufLen);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int i = 0; i < bufLen; i++)
                                pMapPtr[i] = srcData[i];
                            cq.EnqueueUnmapMemObject(mem0, mapPtr);
                            Event fdjk;
                            cq.EnqueueCopyBufferToImage(mem0, img0, (IntPtr)0, origin, region, 0, null, out fdjk);
                            cq.Finish();

                            mapPtr = cq.EnqueueMapImage(img0, false, MapFlags.READ, origin, region, out image_row_pitch, out image_slice_pitch, 0, null, out event0 );
                            cq.EnqueueWaitForEvent(event0);
                            cq.Finish();
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int y = 0; y < imgHeight; y++)
                            {
                                byte* pSrcRowPtr = pMapPtr + y * (int)image_row_pitch;
                                byte* pDstRowPtr = pCmp + y * imgWidth * 4;
                                for (int x = 0; x < imgWidth * 4; x++)
                                {
                                    pDstRowPtr[x] = pSrcRowPtr[x];
                                }
                            }
                            cq.EnqueueUnmapMemObject(img0, mapPtr);
                            if (!CompareArray(cmpData, srcData))
                                Error("EnqueueEnqueueMapBuffer/EnqueueMapImage: (IntPtr version)Copy not identical to source when using event output and no wait list");

                            Event[] waitList = new Event[] { event0 };
                            Array.Clear(cmpData, 0, cmpData.Length);
                            mapPtr = cq.EnqueueMapBuffer(mem0, true, MapFlags.WRITE, 0, bufLen);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int i = 0; i < bufLen; i++)
                                pMapPtr[i] = srcData[i];
                            cq.EnqueueUnmapMemObject(mem0, mapPtr);
                            cq.EnqueueCopyBufferToImage(mem0, img0, (IntPtr)0, origin, region);

                            mapPtr = cq.EnqueueMapImage(img0, false, MapFlags.READ, origin, region, out image_row_pitch, out image_slice_pitch, 1, waitList, out event1);
                            cq.EnqueueWaitForEvent(event1);
                            cq.Finish();
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int y = 0; y < imgHeight; y++)
                            {
                                byte* pSrcRowPtr = pMapPtr + y * (int)image_row_pitch;
                                byte* pDstRowPtr = pCmp + y * imgWidth * 4;
                                for (int x = 0; x < imgWidth * 4; x++)
                                {
                                    pDstRowPtr[x] = pSrcRowPtr[x];
                                }
                            }
                            cq.EnqueueUnmapMemObject(img0, mapPtr);
                            if (!CompareArray(cmpData, srcData))
                                Error("EnqueueEnqueueMapBuffer/EnqueueMapImage: (IntPtr version)Copy not identical to source when using event output and no wait list");

                            event0.Dispose();
                            event1.Dispose();
                        }
                        {
                            int[] origin = new int[3] { (int)0, (int)0, (int)0 };
                            int[] region = new int[3] { (int)imgWidth, (int)imgHeight, (int)1 };
                            IntPtr mapPtr;
                            byte* pMapPtr;
                            int image_row_pitch;
                            int image_slice_pitch;

                            Array.Clear(cmpData, 0, cmpData.Length);
                            mapPtr = cq.EnqueueMapBuffer(mem0, true, MapFlags.WRITE, 0, bufLen);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int i = 0; i < bufLen; i++)
                                pMapPtr[i] = srcData[i];
                            cq.EnqueueUnmapMemObject(mem0, mapPtr);
                            cq.EnqueueCopyBufferToImage(mem0, img0, 0, origin, region);

                            mapPtr = cq.EnqueueMapImage(img0, true, MapFlags.READ, origin, region, out image_row_pitch, out image_slice_pitch);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int y = 0; y < imgHeight; y++)
                            {
                                byte* pSrcRowPtr = pMapPtr + y * (int)image_row_pitch;
                                byte* pDstRowPtr = pCmp + y*imgWidth*4;
                                for (int x = 0; x < imgWidth * 4; x++)
                                {
                                    pDstRowPtr[x] = pSrcRowPtr[x];
                                }
                            }
                            cq.EnqueueUnmapMemObject(img0, mapPtr);
                            if (!CompareArray(cmpData, srcData))
                                Error("EnqueueEnqueueMapBuffer/EnqueueMapImage: (int version)Copy not identical to source when using no event args");

                            Array.Clear(cmpData, 0, cmpData.Length);
                            mapPtr = cq.EnqueueMapBuffer(mem0, true, MapFlags.WRITE, 0, bufLen);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int i = 0; i < bufLen; i++)
                                pMapPtr[i] = srcData[i];
                            cq.EnqueueUnmapMemObject(mem0, mapPtr);
                            cq.EnqueueCopyBufferToImage(mem0, img0, 0, origin, region);

                            mapPtr = cq.EnqueueMapImage(img0, false, MapFlags.READ, origin, region, out image_row_pitch, out image_slice_pitch, 0, null, out event0 );
                            cq.EnqueueWaitForEvent(event0);
                            cq.Finish();
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int y = 0; y < imgHeight; y++)
                            {
                                byte* pSrcRowPtr = pMapPtr + y * (int)image_row_pitch;
                                byte* pDstRowPtr = pCmp + y * imgWidth * 4;
                                for (int x = 0; x < imgWidth * 4; x++)
                                {
                                    pDstRowPtr[x] = pSrcRowPtr[x];
                                }
                            }
                            cq.EnqueueUnmapMemObject(img0, mapPtr);
                            if (!CompareArray(cmpData, srcData))
                                Error("EnqueueEnqueueMapBuffer/EnqueueMapImage: (int version)Copy not identical to source when using event output and no wait list");

                            Event[] waitList = new Event[] { event0 };
                            Array.Clear(cmpData, 0, cmpData.Length);
                            mapPtr = cq.EnqueueMapBuffer(mem0, true, MapFlags.WRITE, 0, bufLen);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int i = 0; i < bufLen; i++)
                                pMapPtr[i] = srcData[i];
                            cq.EnqueueUnmapMemObject(mem0, mapPtr);
                            cq.EnqueueCopyBufferToImage(mem0, img0, 0, origin, region);

                            mapPtr = cq.EnqueueMapImage(img0, false, MapFlags.READ, origin, region, out image_row_pitch, out image_slice_pitch, 1, waitList, out event1);
                            cq.EnqueueWaitForEvent(event1);
                            cq.Finish();
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int y = 0; y < imgHeight; y++)
                            {
                                byte* pSrcRowPtr = pMapPtr + y * (int)image_row_pitch;
                                byte* pDstRowPtr = pCmp + y * imgWidth * 4;
                                for (int x = 0; x < imgWidth * 4; x++)
                                {
                                    pDstRowPtr[x] = pSrcRowPtr[x];
                                }
                            }
                            cq.EnqueueUnmapMemObject(img0, mapPtr);
                            if (!CompareArray(cmpData, srcData))
                                Error("EnqueueEnqueueMapBuffer/EnqueueMapImage: (int version)Copy not identical to source when using event output and no wait list");

                            event0.Dispose();
                            event1.Dispose();
                        }
                        {
                            long[] origin = new long[3] { (long)0, (long)0, (long)0 };
                            long[] region = new long[3] { (long)imgWidth, (long)imgHeight, (long)1 };
                            IntPtr mapPtr;
                            byte* pMapPtr;
                            long image_row_pitch;
                            long image_slice_pitch;

                            Array.Clear(cmpData, 0, cmpData.Length);
                            mapPtr = cq.EnqueueMapBuffer(mem0, true, MapFlags.WRITE, 0, bufLen);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int i = 0; i < bufLen; i++)
                                pMapPtr[i] = srcData[i];
                            cq.EnqueueUnmapMemObject(mem0, mapPtr);
                            cq.EnqueueCopyBufferToImage(mem0, img0, (long)0, origin, region);

                            mapPtr = cq.EnqueueMapImage(img0, true, MapFlags.READ, origin, region, out image_row_pitch, out image_slice_pitch);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int y = 0; y < imgHeight; y++)
                            {
                                byte* pSrcRowPtr = pMapPtr + y * image_row_pitch;
                                byte* pDstRowPtr = pCmp + y * imgWidth * 4;
                                for (int x = 0; x < imgWidth * 4; x++)
                                {
                                    pDstRowPtr[x] = pSrcRowPtr[x];
                                }
                            }
                            cq.EnqueueUnmapMemObject(img0, mapPtr);
                            if (!CompareArray(cmpData, srcData))
                                Error("EnqueueEnqueueMapBuffer/EnqueueMapImage: (long version)Copy not identical to source when using no event args");

                            Array.Clear(cmpData, 0, cmpData.Length);
                            mapPtr = cq.EnqueueMapBuffer(mem0, true, MapFlags.WRITE, 0, bufLen);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int i = 0; i < bufLen; i++)
                                pMapPtr[i] = srcData[i];
                            cq.EnqueueUnmapMemObject(mem0, mapPtr);
                            cq.EnqueueCopyBufferToImage(mem0, img0, (long)0, origin, region);

                            mapPtr = cq.EnqueueMapImage(img0, false, MapFlags.READ, origin, region, out image_row_pitch, out image_slice_pitch, 0, null, out event0);
                            cq.EnqueueWaitForEvent(event0);
                            cq.Finish();
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int y = 0; y < imgHeight; y++)
                            {
                                byte* pSrcRowPtr = pMapPtr + y * image_row_pitch;
                                byte* pDstRowPtr = pCmp + y * imgWidth * 4;
                                for (int x = 0; x < imgWidth * 4; x++)
                                {
                                    pDstRowPtr[x] = pSrcRowPtr[x];
                                }
                            }
                            cq.EnqueueUnmapMemObject(img0, mapPtr);
                            if (!CompareArray(cmpData, srcData))
                                Error("EnqueueEnqueueMapBuffer/EnqueueMapImage: (long version)Copy not identical to source when using event output and no wait list");

                            Event[] waitList = new Event[] { event0 };
                            Array.Clear(cmpData, 0, cmpData.Length);
                            mapPtr = cq.EnqueueMapBuffer(mem0, true, MapFlags.WRITE, 0, bufLen);
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int i = 0; i < bufLen; i++)
                                pMapPtr[i] = srcData[i];
                            cq.EnqueueUnmapMemObject(mem0, mapPtr);
                            cq.EnqueueCopyBufferToImage(mem0, img0, (long)0, origin, region);

                            mapPtr = cq.EnqueueMapImage(img0, false, MapFlags.READ, origin, region, out image_row_pitch, out image_slice_pitch, 1, waitList, out event1);
                            cq.EnqueueWaitForEvent(event1);
                            cq.Finish();
                            pMapPtr = (byte*)mapPtr.ToPointer();
                            for (int y = 0; y < imgHeight; y++)
                            {
                                byte* pSrcRowPtr = pMapPtr + y * image_row_pitch;
                                byte* pDstRowPtr = pCmp + y * imgWidth * 4;
                                for (int x = 0; x < imgWidth * 4; x++)
                                {
                                    pDstRowPtr[x] = pSrcRowPtr[x];
                                }
                            }
                            cq.EnqueueUnmapMemObject(img0, mapPtr);
                            if (!CompareArray(cmpData, srcData))
                                Error("EnqueueEnqueueMapBuffer/EnqueueMapImage: (long version)Copy not identical to source when using event output and no wait list");

                            event0.Dispose();
                            event1.Dispose();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Error("Exception during testing: " + e.ToString());
            }
            finally
            {
                if (img0 != null)
                    img0.Dispose();
                if (mem0 != null)
                    mem0.Dispose();
            }
        }
예제 #2
0
파일: Form1.cs 프로젝트: ctapang/GPUCyclops
        /// <summary>
        /// Test all versions of:
        /// 
        /// EnqueueReadBufferRect
        /// EnqueueWriteBufferRect
        /// EnqueueCopyBufferRect
        /// 
        /// The test just copies the entirety of a buffer and checks if the result is equal to the original.
        /// An error indicates that one of the above functions failed and further manual analysis is required
        /// to pinpoint the error.
        /// </summary>
        /// <param name="c"></param>
        /// <param name="cq"></param>
        private void TestBufferRectFunctions(Context c, CommandQueue cq)
        {
            if (!(cq.Device.Platform.OpenCLMajorVersion >= 1 && cq.Device.Platform.OpenCLMinorVersion >= 1))
            {
                Output("Skipping EnqueueReadBufferRect, EnqueueWriteBufferRect and EnqueueCopyBufferRect tests(Requires OpenCL 1.1 or higher)");
                return;
            }

            Output("Testing EnqueueReadBufferRect, EnqueueWriteBufferRect and EnqueueCopyBufferRect");

            OpenCLNet.Mem mem0 = null;
            OpenCLNet.Mem mem1 = null;
            int bufWidth = 16;
            int bufHeight = 16;
            int bufLen = bufWidth * bufHeight;
            byte[] srcData = new byte[bufLen];
            byte[] cmpData = new byte[bufLen];
            Event event0;
            Event event1;
            Event event2;
            Event event3;
            Event event4;
            Event event5;

            Array.Clear(srcData, 0, srcData.Length);
            for (int i = 8; i < 12; i++)
                for (int j = 8; j < 12; j++)
                    srcData[bufWidth * i + j] = (byte)1;
            Array.Clear(cmpData, 0, cmpData.Length);

            try
            {
                mem0 = c.CreateBuffer(MemFlags.READ_WRITE, bufLen, IntPtr.Zero);
                mem1 = c.CreateBuffer(MemFlags.READ_WRITE, bufLen, IntPtr.Zero);

                fixed (byte* pSrc = srcData)
                {
                    fixed (byte* pCmp = cmpData)
                    {
                        {
                            IntPtr[] bufferOffset = new IntPtr[3] { (IntPtr)0, (IntPtr)0, (IntPtr)0 };
                            IntPtr[] hostOffset = new IntPtr[3] { (IntPtr)0, (IntPtr)0, (IntPtr)0 };
                            IntPtr[] region = new IntPtr[3] { (IntPtr)bufWidth, (IntPtr)bufHeight, (IntPtr)1 };
                            IntPtr bufferRowPitch = (IntPtr)bufWidth;
                            IntPtr bufferSlicePitch = (IntPtr)0;
                            IntPtr hostRowPitch = (IntPtr)bufWidth;
                            IntPtr hostSlicePitch = (IntPtr)0;

                            cq.EnqueueWriteBufferRect(mem0, true, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pSrc);
                            cq.EnqueueCopyBufferRect(mem0, mem1, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch);
                            cq.Finish();
                            Array.Clear(cmpData, 0, cmpData.Length);
                            cq.EnqueueReadBufferRect(mem1, true, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pCmp);
                            if (!CompareArray(cmpData, srcData))
                                Error("Read-/Write-/CopyRect: (IntPtr version)Copy not identical to source when using no event args");

                            cq.EnqueueWriteBufferRect(mem0, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pSrc, 0, null, out event0);
                            cq.EnqueueWaitForEvent(event0);
                            cq.EnqueueCopyBufferRect(mem0, mem1, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, 0, null, out event1);
                            cq.EnqueueWaitForEvent(event1);
                            Array.Clear(cmpData, 0, cmpData.Length);
                            cq.EnqueueReadBufferRect(mem1, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pCmp, 0, null, out event2);
                            cq.Finish();
                            if (!CompareArray(cmpData, srcData))
                                Error("Read-/Write-/CopyRect: (IntPtr version)Copy not identical to source when using event output and no event args");

                            Event[] events = new Event[] { event0, event1, event2 };
                            cq.EnqueueWriteBufferRect(mem0, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pSrc, 3, events, out event3);
                            cq.EnqueueWaitForEvent(event3);
                            cq.EnqueueCopyBufferRect(mem0, mem1, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, 3, events, out event4);
                            cq.EnqueueWaitForEvent(event4);
                            Array.Clear(cmpData, 0, cmpData.Length);
                            cq.EnqueueReadBufferRect(mem1, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pCmp, 3, events, out event5);
                            cq.Finish();
                            if (!CompareArray(cmpData, srcData))
                                Error("Read-/Write-/CopyRect: (IntPtr version)Copy not identical to source when using event output and event args");
                            event0.Dispose();
                            event1.Dispose();
                            event2.Dispose();
                            event3.Dispose();
                            event4.Dispose();
                            event5.Dispose();
                        }
                        {
                            int[] bufferOffset = new int[3] { 0, 0, 0 };
                            int[] hostOffset = new int[3] { 0, 0, 0 };
                            int[] region = new int[3] { bufWidth, bufHeight, 1 };
                            int bufferRowPitch = bufWidth;
                            int bufferSlicePitch = 0;
                            int hostRowPitch = bufWidth;
                            int hostSlicePitch = 0;

                            cq.EnqueueWriteBufferRect(mem0, true, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pSrc);
                            cq.EnqueueCopyBufferRect(mem0, mem1, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch);
                            cq.Finish();
                            Array.Clear(cmpData, 0, cmpData.Length);
                            cq.EnqueueReadBufferRect(mem1, true, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pCmp);
                            if (!CompareArray(cmpData, srcData))
                                Error("Read-/Write-/CopyRect: (int version)Copy not identical to source when using no event args");

                            cq.EnqueueWriteBufferRect(mem0, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pSrc, 0, null, out event0);
                            cq.EnqueueWaitForEvent(event0);
                            cq.EnqueueCopyBufferRect(mem0, mem1, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, 0, null, out event1);
                            cq.EnqueueWaitForEvent(event1);
                            Array.Clear(cmpData, 0, cmpData.Length);
                            cq.EnqueueReadBufferRect(mem1, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pCmp, 0, null, out event2);
                            cq.Finish();
                            if (!CompareArray(cmpData, srcData))
                                Error("Read-/Write-/CopyRect: (int version)Copy not identical to source when using event output and no event args");

                            Event[] events = new Event[] { event0, event1, event2 };
                            cq.EnqueueWriteBufferRect(mem0, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pSrc, 3, events, out event3);
                            cq.EnqueueWaitForEvent(event3);
                            cq.EnqueueCopyBufferRect(mem0, mem1, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, 3, events, out event4);
                            cq.EnqueueWaitForEvent(event4);
                            Array.Clear(cmpData, 0, cmpData.Length);
                            cq.EnqueueReadBufferRect(mem1, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pCmp, 3, events, out event5);
                            cq.Finish();
                            if (!CompareArray(cmpData, srcData))
                                Error("Read-/Write-/CopyRect: (int version)Copy not identical to source when using event output and event args");
                            event0.Dispose();
                            event1.Dispose();
                            event2.Dispose();
                            event3.Dispose();
                            event4.Dispose();
                            event5.Dispose();
                        }
                        {
                            long[] bufferOffset = new long[3] { 0L, 0L, 0L };
                            long[] hostOffset = new long[3] { 0L, 0L, 0L };
                            long[] region = new long[3] { (long)bufWidth, (long)bufHeight, (long)1 };
                            long bufferRowPitch = bufWidth;
                            long bufferSlicePitch = 0;
                            long hostRowPitch = bufWidth;
                            long hostSlicePitch = 0;

                            cq.EnqueueWriteBufferRect(mem0, true, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pSrc);
                            cq.EnqueueCopyBufferRect(mem0, mem1, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch);
                            cq.Finish();
                            Array.Clear(cmpData, 0, cmpData.Length);
                            cq.EnqueueReadBufferRect(mem1, true, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pCmp);
                            if (!CompareArray(cmpData, srcData))
                                Error("Read-/Write-/CopyRect: (long version)Copy not identical to source when using no event args");

                            cq.EnqueueWriteBufferRect(mem0, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pSrc, 0, null, out event0);
                            cq.EnqueueWaitForEvent(event0);
                            cq.EnqueueCopyBufferRect(mem0, mem1, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, 0, null, out event1);
                            cq.EnqueueWaitForEvent(event1);
                            Array.Clear(cmpData, 0, cmpData.Length);
                            cq.EnqueueReadBufferRect(mem1, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pCmp, 0, null, out event2);
                            cq.Finish();
                            if (!CompareArray(cmpData, srcData))
                                Error("Read-/Write-/CopyRect: (long version)Copy not identical to source when using event output and no event args");

                            Event[] events = new Event[] { event0, event1, event2 };
                            cq.EnqueueWriteBufferRect(mem0, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pSrc, 3, events, out event3);
                            cq.EnqueueWaitForEvent(event3);
                            cq.EnqueueCopyBufferRect(mem0, mem1, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, 3, events, out event4);
                            cq.EnqueueWaitForEvent(event4);
                            Array.Clear(cmpData, 0, cmpData.Length);
                            cq.EnqueueReadBufferRect(mem1, false, bufferOffset, hostOffset, region, bufferRowPitch, bufferSlicePitch, hostRowPitch, hostSlicePitch, (IntPtr)pCmp, 3, events, out event5);
                            cq.Finish();
                            if (!CompareArray(cmpData, srcData))
                                Error("Read-/Write-/CopyRect: (long version)Copy not identical to source when using event output and event args");
                            event0.Dispose();
                            event1.Dispose();
                            event2.Dispose();
                            event3.Dispose();
                            event4.Dispose();
                            event5.Dispose();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Error("Exception during testing: " + e.ToString());
            }
            finally
            {
                if (mem0 != null)
                    mem0.Dispose();
                if (mem1 != null)
                    mem1.Dispose();
            }
        }