//---------------------------------------------------------------------- // effct static Bitmap effect(string clName, byte[] rgbMat, int width, int height, float param) { string[] src = { System.IO.File.ReadAllText(clName) }; int outWidth, outHeight; byte[] outRgb = createOutBytes(width, height, out outWidth, out outHeight, param); IntPtr[] platformId = GetPlatformIDs(); // get platform id IntPtr[] deviceID = GetDeviceIDs(platformId); // get device id IntPtr context = CreateContext(platformId, deviceID); // create Context IntPtr queue = CreateCommandQueue(context, deviceID[0]); // create CommandQueue IntPtr prog = CreatePragramWithSource(context, src); // create program object BuildPragram(prog, deviceID); // build program IntPtr kernel = CreateKernel(prog, clProc); // create kernel // set image format cl_image_format format = new cl_image_format(CL_BGRA, CL_UNORM_INT8); cl_image_desc idesc = new cl_image_desc(CL_MEM_OBJECT_IMAGE2D, (IntPtr)width, (IntPtr)height); IntPtr memIn = CreateImage(context, rgbMat, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, ref format, ref idesc); cl_image_desc odesc = new cl_image_desc(CL_MEM_OBJECT_IMAGE2D, (IntPtr)outWidth, (IntPtr)outHeight); IntPtr memOut = CreateImage(context, CL_MEM_WRITE_ONLY, ref format, ref odesc); IntPtr[] origin = { (IntPtr)0, (IntPtr)0, (IntPtr)0 }; // obtain results IntPtr[] region = { (IntPtr)outWidth, (IntPtr)outHeight, (IntPtr)1 }; SetKernelAeg(kernel, 0, memIn); // set kerbel parameters SetKernelAeg(kernel, 1, memOut); SetKernelAeg(kernel, 2, param); IntPtr[] globalSize = { (IntPtr)outWidth, (IntPtr)outHeight }; EnqueueNDRangeKernel(queue, kernel, 2, globalSize); // request execute kernel EnqueueReadImage(queue, memOut, outRgb, origin, region); clReleaseMemObject(memIn); // release resources clReleaseMemObject(memOut); clReleaseKernel(kernel); clReleaseProgram(prog); clReleaseCommandQueue(queue); clReleaseContext(context); return(byteArray2bmp(outRgb, (int)outWidth, (int)outHeight)); }
private static IntPtr CreateImage(IntPtr context, uint flags, ref cl_image_format image_format, ref cl_image_desc image_desc) { int errcode_ret; IntPtr memObj = clCreateImage(context, flags, ref image_format, ref image_desc, IntPtr.Zero, out errcode_ret); if (errcode_ret != CL_SUCCESS) { throw new Exception("clCreateImage failed."); } return(memObj); }
//---------------------------------------------------------------------- // effct static void effect(string clName, byte[] rgbMat, int width, int height) { string[] src = { System.IO.File.ReadAllText(clName) }; IntPtr[] platformId = GetPlatformIDs(); // get platform id IntPtr[] deviceID = GetDeviceIDs(platformId); // get device id IntPtr context = CreateContext(platformId, deviceID); // create Context IntPtr queue = CreateCommandQueue(context, deviceID[0]); // create CommandQueue IntPtr prog = CreatePragramWithSource(context, src); // create program object BuildPragram(prog, deviceID); // build program IntPtr kernel = CreateKernel(prog, clPloc); // create kernel // set image format cl_image_format format = new cl_image_format(CL_BGRA, CL_UNORM_INT8); cl_image_desc idesc = new cl_image_desc(CL_MEM_OBJECT_IMAGE2D, (IntPtr)width, (IntPtr)height); IntPtr memIn = CreateImage(context, rgbMat, CL_MEM_READ_ONRY | CL_MEM_USE_HOST_PTR, ref format, ref idesc); IntPtr memOut = CreateImage(context, CL_MEM_WRITE_ONRY, ref format, ref idesc); IntPtr[] origin = { (IntPtr)0, (IntPtr)0, (IntPtr)0 }; // obtain results IntPtr[] region = { (IntPtr)width, (IntPtr)height, (IntPtr)1 }; float[] fill_color = { 0.0f, 0.0f, 0.0f, 255.0f }; EnqueueFillImage(queue, memOut, fill_color, origin, region); SetKernelAeg(kernel, 0, memIn); // set kerbel parameters SetKernelAeg(kernel, 1, memOut); IntPtr[] globalSize = { (IntPtr)(width - 2), (IntPtr)(height - 2) }; EnqueueNDRangeKernel(queue, kernel, 2, globalSize); // request execute kernel EnqueueReadImage(queue, memOut, rgbMat, origin, region); clReleaseMemObject(memOut); clReleaseMemObject(memIn); clReleaseKernel(kernel); clReleaseProgram(prog); clReleaseCommandQueue(queue); clReleaseContext(context); }
/********* image object ***********************************************/ //---------------------------------------------------------------------- //CreateImage private static IntPtr CreateImage <T>(IntPtr context, T[] inData, uint flags, ref cl_image_format image_format, ref cl_image_desc image_desc) where T : struct { int errcode_ret; GCHandle handle = GCHandle.Alloc(inData, GCHandleType.Pinned); IntPtr hst_ptr = flags == CL_MEM_WRITE_ONRY ? IntPtr.Zero : handle.AddrOfPinnedObject(); IntPtr memObj = clCreateImage(context, flags, ref image_format, ref image_desc, hst_ptr, out errcode_ret); handle.Free(); if (errcode_ret != CL_SUCCESS) { throw new Exception("clCreateImage failed"); } return(memObj); }