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(); }
public void SetArgument(int i, OpenCLImage <float> v) { kernel.SetMemoryArgument(i, v.texBuffer); }
// 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(); }
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; } } } } }