Пример #1
0
        public void Process()
        {
            GL.Finish();
            screen.Clear(0);
            timer.Start();

            generatie++;
            // if (generatie % 2 == 1) {
            //     k_sim.SetArgument(0, patroon);
            //     k_sim.SetArgument(1, volgende); // @Todo: dit ook voor de halo kernels
            //     k_copy.SetArgument(0, patroon);
            //     k_copy.SetArgument(1, volgende);
            // }
            // else {
            //     k_sim.SetArgument(0, volgende);
            //     k_sim.SetArgument(1, patroon);
            //     k_copy.SetArgument(0, volgende);
            //     k_copy.SetArgument(1, patroon);
            // }

            if (GLInterop)
            {
                if (resolution != lastResolution)
                {
                    image          = new OpenCLImage <int>(ocl, resolution.x, resolution.y);
                    lastResolution = resolution;
                    k_sim.SetArgument(3, resolution);
                }

                k_sim.SetArgument(5, image);
                k_sim.LockOpenGLObject(image.texBuffer);
                k_sim.Execute(werk);
                k_sim.UnlockOpenGLObject(image.texBuffer);
            }
            else
            {
                k_sim.SetArgument(5, buffer);
                k_sim.Execute(werk);
                buffer.CopyFromDevice();
                for (int i = 0; i < buffer.Length; ++i)
                {
                    screen.pixels[i] = buffer[i];
                }
            }

            k_copy.Execute(werk_klein);  // Kopieer wat zojuist in patroon is geschreven naar de tweede buffer

            timer.Stop();
            Console.Write("\r{0}ms", timer.ElapsedMilliseconds);
            timer.Reset();
        }
Пример #2
0
 public void SetArgument(int i, OpenCLImage <float> v)
 {
     kernel.SetMemoryArgument(i, v.texBuffer);
 }
Пример #3
0
        // TICK
        // Main application entry point: the template calls this function once per frame.
        public void Tick()
        {
            GL.Finish();
            // start timer
            timer.Restart();
            //Initiate work sizes
            long[] workSize  = { pw, ph };
            long[] workSize2 = { pw *ph };
            //Set kernel arguments
            kernel.SetArgument(5, xoffset);
            kernel.SetArgument(6, yoffset);
            resolution = (int)(zoom * 512);
            long[] workSize3 = { resolution / 32, resolution };
            kernel.SetArgument(7, resolution);
            // run the simulation, 1 step
            screen.Clear(0);
            if (GLinterop)
            {
                if (resolution != oldResolution)
                {
                    image         = new OpenCLImage <int>(ocl, resolution, resolution);
                    oldResolution = resolution;
                }

                //set image as argument
                imageClearKernel.SetArgument(0, image);

                imageClearKernel.LockOpenGLObject(image.texBuffer);
                imageClearKernel.Execute(workSize3);
                imageClearKernel.UnlockOpenGLObject(image.texBuffer);

                //lock image object
                kernel.SetArgument(0, image);
                kernel.LockOpenGLObject(image.texBuffer);

                //run kernel
                kernel.Execute(workSize);

                //unlock image object
                kernel.UnlockOpenGLObject(image.texBuffer);

                secondKernel.Execute(workSize2);
            }
            else
            {
                kernel.SetArgument(0, buffer);
                for (int i = 0; i < buffer.Length; i++)
                {
                    buffer[i] = 0;
                }
                buffer.CopyToDevice();
                kernel.Execute(workSize);
                secondKernel.Execute(workSize2);
                buffer.CopyFromDevice();
                for (uint y = 0; y < screen.height; y++)
                {
                    for (uint x = 0; x < screen.width; x++)
                    {
                        screen.Plot(x, y, buffer[x + y * 512]);
                    }
                }
            }
            // visualize current state
            // report performance
            Console.WriteLine("generation " + generation++ + ": " + timer.ElapsedMilliseconds + "ms");
            //Console.ReadLine();
        }
Пример #4
0
        public void ReadGoLFile()
        {
            StreamReader sr = new StreamReader("../../maps/turing_js_r.rle");
            uint         state = 0, n = 0, x = 1, y = 1;

            while (true)
            {
                String line = sr.ReadLine();
                if (line == null)
                {
                    break;               // end of file
                }
                int pos = 0;
                if (line[pos] == '#')
                {
                    continue;                /* comment line */
                }
                else if (line[pos] == 'x')   //Header
                {
                    String[] sub = line.Split(new char[] { '=', ',' }, StringSplitOptions.RemoveEmptyEntries);

                    size         = new int2(Int32.Parse(sub[1]), Int32.Parse(sub[3]));
                    size_in_ints = new int2((size.x + 31) / 32 + 2, size.y + 2); // Voeg padding toe
                    int lengte_in_ints = size_in_ints.x * size_in_ints.y;

                    // Console.WriteLine("Grootte van arrays: {0}x{1}", size_in_ints.x*32, size_in_ints.y);

                    patroon  = new OpenCLBuffer <uint>(ocl, lengte_in_ints);
                    volgende = new OpenCLBuffer <uint>(ocl, lengte_in_ints);
                    image    = new OpenCLImage <int> (ocl, screen.width, screen.height);
                    buffer   = new OpenCLBuffer <int> (ocl, screen.width * screen.height);

                    werk       = new long[] { size.x, size.y };
                    werk_klein = new long[] { lengte_in_ints };
                }
                else
                {
                    while (pos < line.Length)
                    {
                        Char c = line[pos++];
                        if (state == 0)
                        {
                            if (c < '0' || c > '9')
                            {
                                state = 1; n = Math.Max(n, 1);
                            }
                            else
                            {
                                n = (uint)(n * 10 + (c - '0'));
                            }
                        }
                        if (state == 1) // expect other character
                        {
                            if (c == '$')
                            {
                                y += n; x = 1;
                            }                            // newline
                            else if (c == 'o')
                            {
                                for (int i = 0; i < n; i++)
                                {
                                    patroon[(int)((y) * size_in_ints.x + ((x >> 5)))] |= 1U << (int)(x & 31);
                                    x++;
                                }
                            }
                            else if (c == 'b')
                            {
                                x += n;
                            }
                            state = n = 0;
                        }
                    }
                }
            }
        }