예제 #1
0
    //----------------------------------------------------------------------
    // 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));
    }
예제 #2
0
    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);
    }
예제 #3
0
    //----------------------------------------------------------------------
    // 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);
    }
예제 #4
0
    /********* 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);
    }