public static void Test()
        {
            if (test == null)
            {
                test = CL.GetKernel("myKernelFunction");
            }

            const int BUFFERSIZE = 10;
            CLBuffer  buf        = CL.GenBuffer(new float[BUFFERSIZE]);

            test.SetArgument(0, buf);

            CL.EnqueueRange(test, new MultiDimension(BUFFERSIZE), new MultiDimension(1));

            float[] readBack = new float[BUFFERSIZE];
            CL.ReadBuffer(buf, readBack);

            foreach (var v in readBack)
            {
                Console.WriteLine(v);
            }
        }
        public static void FillRectangle(CLBuffer trg, IBRectangle trgSize, PixelData color, IBRectangle rect)
        {
            if (fillRect == null)
            {
                fillRect = CL.GetKernel("fillRect");
            }

            int[]    _trgSize  = new int[] { (int)trgSize.Width, (int)trgSize.Height };
            int[]    _offset   = new int[] { (int)rect.OffsetX, (int)rect.OffsetY };
            int[]    _size     = new int[] { (int)rect.Width, (int)rect.Height };
            float[]  _color    = new float[] { color.b / 255.0f, color.g / 255.0f, color.r / 255.0f, color.a / 255.0f };
            CLBuffer __trgSize = CL.GenBuffer(_trgSize);
            CLBuffer __offset  = CL.GenBuffer(_offset);
            CLBuffer __size    = CL.GenBuffer(_size);
            CLBuffer __color   = CL.GenBuffer(_color);

            fillRect.SetArgument(0, trg.InternalPointer);
            fillRect.SetArgument(1, __trgSize);
            fillRect.SetArgument(2, __color);
            fillRect.SetArgument(3, __offset);
            fillRect.SetArgument(4, __size);

            CL.EnqueueRange(fillRect, new MultiDimension(1080), new MultiDimension(1));
        }
예제 #3
0
 /// <summary>
 /// 現在のコンテキストからバッファを作成します
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="data"></param>
 /// <returns></returns>
 public static CLBuffer GenBuffer <T>(T[] data) where T : struct
 {
     return(CLBuffer.FromCopiedHostMemory(Context, data));
 }
예제 #4
0
 /// <summary>
 /// 現在のコマンドキューを使ってバッファを読み出します
 /// </summary>
 public static void ReadBuffer <T>(CLBuffer buffer, T[] systemBuffer) where T : struct
 {
     CommandQueue.ReadBuffer(buffer, systemBuffer);
 }
예제 #5
0
        public override void Blend(SingleColorImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer)
        {
            CLImageProcessing.FillRectangle(trg, trgSize, source.Color, source.Rect);
            //int trgSizeW = (int)trg.size.Width;
            //int trgSizeH = (int)trg.size.Height;

            //if ((int)source.Size.OffsetX > trgSizeW || (int)source.Size.OffsetY > trgSizeH)
            //    return;



            //int strX = 0, strY = 0;

            //if ((int)source.Size.OffsetX < 0)
            //    strX = 0;
            //else if ((int)source.Size.OffsetX > (int)trg.size.Width)
            //    strX = (int)trg.size.Width;
            //else
            //    strX = (int)source.Size.OffsetX;

            //if ((int)source.Size.OffsetY < 0)
            //    strY = 0;
            //else if ((int)source.Size.OffsetY > (int)trg.size.Height)
            //    strY = (int)trg.size.Height;
            //else
            //    strY = (int)source.Size.OffsetY;


            //int maxX = 0, maxY = 0;

            //if ((int)source.Size.OffsetX + (int)source.Size.Width < 0)
            //    maxX = 0;
            //else if ((int)source.Size.OffsetX + (int)source.Size.Width > (int)trg.size.Width)
            //    maxX = (int)trg.size.Width;
            //else
            //    maxX = (int)source.Size.OffsetX + (int)source.Size.Width;

            //if ((int)source.Size.OffsetY + (int)source.Size.Height < 0)
            //    maxY = 0;
            //else if ((int)source.Size.OffsetY + (int)source.Size.Height > (int)trg.size.Height)
            //    maxY = (int)trg.size.Height;
            //else
            //    maxY = (int)source.Size.OffsetY + (int)source.Size.Height;



            //int trgDataLength = trg.data.Length;

            //double Cb2 = source.color.b;
            //double Cg2 = source.color.g;
            //double Cr2 = source.color.r;

            //Parallel.For(strY, maxY, y =>
            //{
            //    if (trg.size.OffsetY <= y && y < trg.size.OffsetY + trg.size.Height)
            //        for (int x = strX; x < maxX; x++)
            //        {
            //            double A1;
            //            double A2;
            //            double _A2;

            //            double A;
            //            double B;
            //            double G;
            //            double R;

            //            if (trg.size.OffsetX <= y && y < trg.size.OffsetX + trg.size.Width)
            //            {
            //                int index = (x + y * trgSizeW) * 4;
            //                if (index >= trgDataLength) break;

            //                A1 = trg.data[index + 3] / 255.0;
            //                A2 = source.color.a / 255.0;
            //                _A2 = 1 - A2;

            //                A = A2 + _A2 * A1;
            //                B = (Cb2 * A2 + _A2 * A1 * trg.data[index]) / A;
            //                G = (Cg2 * A2 + _A2 * A1 * trg.data[index + 1]) / A;
            //                R = (Cr2 * A2 + _A2 * A1 * trg.data[index + 2]) / A;

            //                trg.data[index] = (byte)B;
            //                trg.data[index + 1] = (byte)G;
            //                trg.data[index + 2] = (byte)R;
            //                trg.data[index + 3] = (byte)(A * 255.0);
            //            }
            //        }
            //});
        }
예제 #6
0
 public override void Blend(PixcelImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer)
 {
     throw new NotImplementedException();
 }
예제 #7
0
        static void Main(string[] args)
        {
            ToGrayscale.ConvertToGrayscale("image.jpg");

            //Get the ids of available opencl platforms

            CL.GetPlatformIds(0, null, out uint platformCount);
            CLPlatform[] platformIds = new CLPlatform[platformCount];
            CL.GetPlatformIds(platformCount, platformIds, out _);

            Console.WriteLine(platformIds.Length);
            foreach (CLPlatform platform in platformIds)
            {
                Console.WriteLine(platform.Handle);
                CL.GetPlatformInfo(platform, PlatformInfo.Name, out byte[] val);
            }

            //Get the device ids for each platform
            foreach (IntPtr platformId in platformIds)
            {
                CL.GetDeviceIds(new CLPlatform(platformId), DeviceType.All, out CLDevice[] deviceIds);

                CLContext context = CL.CreateContext(IntPtr.Zero, (uint)deviceIds.Length, deviceIds, IntPtr.Zero,
                                                     IntPtr.Zero, out CLResultCode result);
                if (result != CLResultCode.Success)
                {
                    throw new Exception("The context couldn't be created.");
                }

                string code = @"
                __kernel void add(__global float* A, __global float* B,__global float* result, const float mul)
                {
                    int i = get_global_id(0);
                    result[i] = (A[i] + B[i])*mul;
                }";

                CLProgram program = CL.CreateProgramWithSource(context, code, out result);

                CL.BuildProgram(program, (uint)deviceIds.Length, deviceIds, null, IntPtr.Zero, IntPtr.Zero);

                CLKernel kernel = CL.CreateKernel(program, "add", out result);

                int     arraySize = 20;
                float[] A         = new float[arraySize];
                float[] B         = new float[arraySize];

                for (int i = 0; i < arraySize; i++)
                {
                    A[i] = 1;
                    B[i] = i;
                }

                CLBuffer bufferA = CL.CreateBuffer(context, MemoryFlags.ReadOnly | MemoryFlags.CopyHostPtr, A,
                                                   out result);
                CLBuffer bufferB = CL.CreateBuffer(context, MemoryFlags.ReadOnly | MemoryFlags.CopyHostPtr, B,
                                                   out result);

                float[] pattern = new float[] { 1, 3, 5, 7 };

                CLBuffer resultBuffer = new CLBuffer(CL.CreateBuffer(context, MemoryFlags.WriteOnly,
                                                                     new UIntPtr((uint)(arraySize * sizeof(float))), IntPtr.Zero, out result));

                try
                {
                    CL.SetKernelArg(kernel, 0, bufferA);
                    CL.SetKernelArg(kernel, 1, bufferB);
                    CL.SetKernelArg(kernel, 2, resultBuffer);
                    CL.SetKernelArg(kernel, 3, -1f);

                    CLCommandQueue commandQueue = new CLCommandQueue(
                        CL.CreateCommandQueueWithProperties(context, deviceIds[0], IntPtr.Zero, out result));

                    CL.EnqueueFillBuffer(commandQueue, bufferB, pattern, UIntPtr.Zero, (UIntPtr)(arraySize * sizeof(float)), null,
                                         out _);

                    //CL.EnqueueNDRangeKernel(commandQueue, kernel, 1, null, new UIntPtr[] {new UIntPtr((uint)A.Length)},
                    //	null, 0, null,  out CLEvent eventHandle);

                    CL.EnqueueNDRangeKernel(commandQueue, kernel, 1, null, new UIntPtr[] { new UIntPtr((uint)A.Length) },
                                            null, 0, null, out CLEvent eventHandle);


                    CL.Finish(commandQueue);

                    CL.SetEventCallback(eventHandle, (int)CommandExecutionStatus.Complete, (waitEvent, data) =>
                    {
                        float[] resultValues = new float[arraySize];
                        CL.EnqueueReadBuffer(commandQueue, resultBuffer, true, UIntPtr.Zero, resultValues, null, out _);

                        StringBuilder line = new StringBuilder();
                        foreach (float res in resultValues)
                        {
                            line.Append(res);
                            line.Append(", ");
                        }

                        Console.WriteLine(line.ToString());
                    });

                    //get rid of the buffers because we no longer need them
                    CL.ReleaseMemoryObject(bufferA);
                    CL.ReleaseMemoryObject(bufferB);
                    CL.ReleaseMemoryObject(resultBuffer);

                    //Release the program kernels and queues
                    CL.ReleaseProgram(program);
                    CL.ReleaseKernel(kernel);
                    CL.ReleaseCommandQueue(commandQueue);
                    CL.ReleaseContext(context);
                    CL.ReleaseEvent(eventHandle);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                    throw;
                }
            }
        }
예제 #8
0
        public static void Add()
        {
            CLResultCode error = CLResultCode.Success;

            CLPlatform[] platforms = new CLPlatform[1];
            CL.GetPlatformIds(1, platforms, out _);

            CLDevice[] devices = new CLDevice[1];
            CL.GetDeviceIds(platforms[0], DeviceType.All, 1, devices, out _);

            CLContext context = CL.CreateContext(IntPtr.Zero, devices, IntPtr.Zero, IntPtr.Zero, out _);


            CLProgram program =
                CL.CreateProgramWithSource(context, File.ReadAllText("Kernels/add_arrays.cl"), out error);

            error = CL.BuildProgram(program, 1, devices, null, IntPtr.Zero, IntPtr.Zero);

            if (error != CLResultCode.Success)
            {
                throw new Exception(error.ToString());
            }

            CLKernel kernel = CL.CreateKernel(program, "add", out error);

            Span <float> inputA = new float[]
            {
                1, 24, 5, 43, 41, 56
            };
            Span <float> inputB = new float[]
            {
                72, -323, -1, 43, -41, -26
            };
            Span <float> output = stackalloc float[inputA.Length];

            CLBuffer bufferA = CL.CreateBuffer(context, MemoryFlags.ReadOnly | MemoryFlags.CopyHostPtr, inputA, out _);
            CLBuffer bufferB = CL.CreateBuffer(context, MemoryFlags.ReadOnly | MemoryFlags.CopyHostPtr, inputB, out _);

            CLBuffer outputBuffer = CL.CreateBuffer(context, MemoryFlags.WriteOnly, (UIntPtr)(output.Length * sizeof(float)), IntPtr.Zero, out _);

            //For outputs I wouldn't use that also enqueueing a ReadBuffer is needed regardless
            //CLBuffer outputBuffer = CL.CreateBuffer(context, MemoryFlags.WriteOnly | MemoryFlags.UseHostPtr, output, out _);

            CL.SetKernelArg(kernel, 0, bufferA);
            CL.SetKernelArg(kernel, 1, bufferB);
            CL.SetKernelArg(kernel, 2, outputBuffer);

            CLCommandQueue queue = CL.CreateCommandQueueWithProperties(context, devices[0], IntPtr.Zero, out error);

            CL.EnqueueNDRangeKernel(queue, kernel, 1, null,
                                    new[] { (UIntPtr)inputA.Length }, null, 0, null, out _);

            CL.EnqueueReadBuffer(queue, outputBuffer, true, UIntPtr.Zero, output, null, out _);

            foreach (float f in output)
            {
                Console.WriteLine(f);
            }


            CL.ReleaseMemoryObject(bufferA);
            CL.ReleaseMemoryObject(bufferB);
            CL.ReleaseMemoryObject(outputBuffer);
            CL.ReleaseCommandQueue(queue);
            CL.ReleaseKernel(kernel);
            CL.ReleaseProgram(program);
            CL.ReleaseContext(context);
        }
예제 #9
0
 public abstract void Blend(PixcelImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer);
예제 #10
0
 public abstract void Blend(SingleColorImage source, CLBuffer trg, IBRectangle trgSize, CLBuffer buffer);