| 157 | } |
| 158 | |
| 159 | void kernel(cl::Buffer& image, cl::Buffer& base, cl::Buffer& perlin, |
| 160 | cl::Buffer& histOut, cl::Buffer& colors, |
| 161 | cl::CommandQueue& queue, cl::Device& device) |
| 162 | { |
| 163 | static bool compileFlag = true; |
| 164 | static cl::Program prog; |
| 165 | static cl::Kernel initKernel, computeKernel, normKernel, fillKernel; |
| 166 | static cl::Kernel memSetKernel, genHistogram, genHistColors; |
| 167 | |
| 168 | std::srand((unsigned)(std::time(0))); |
| 169 | |
| 170 | if (compileFlag) { |
| 171 | try { |
| 172 | prog = cl::Program(queue.getInfo<CL_QUEUE_CONTEXT>(), perlinKernels, false); |
| 173 | |
| 174 | std::vector<cl::Device> devs; |
| 175 | devs.push_back(device); |
| 176 | prog.build(devs); |
| 177 | |
| 178 | initKernel = cl::Kernel(prog, "init"); |
| 179 | computeKernel = cl::Kernel(prog, "compute"); |
| 180 | normKernel = cl::Kernel(prog, "normalizeNoise"); |
| 181 | fillKernel = cl::Kernel(prog, "fillImage"); |
| 182 | memSetKernel = cl::Kernel(prog, "memSet"); |
| 183 | genHistogram = cl::Kernel(prog, "histogram"); |
| 184 | genHistColors = cl::Kernel(prog, "setColors"); |
| 185 | } catch (cl::Error err) { |
| 186 | std::cout << "Compile Errors: " << std::endl; |
| 187 | std::cout << err.what() << err.err() << std::endl; |
| 188 | std::cout << prog.getBuildInfo<CL_PROGRAM_BUILD_LOG>(device) << std::endl; |
| 189 | exit(255); |
| 190 | } |
| 191 | std::cout<< "Kernels compiled successfully" << std::endl; |
| 192 | compileFlag = false; |
| 193 | } |
| 194 | |
| 195 | static const NDRange local(16, 16); |
| 196 | NDRange global(local[0] * divup(IMGW, (int)(local[0])), |
| 197 | local[1] * divup(IMGH, (int)(local[1]))); |
| 198 | |
| 199 | float persistence = 0.5f; |
| 200 | float amp = 1.0f; |
| 201 | float tamp = 0.0f; |
| 202 | |
| 203 | initKernel.setArg(0, base); |
| 204 | initKernel.setArg(1, perlin); |
| 205 | initKernel.setArg(2, IMGW); |
| 206 | initKernel.setArg(3, IMGH); |
| 207 | initKernel.setArg(4, std::rand()); |
| 208 | queue.enqueueNDRangeKernel(initKernel, cl::NullRange, global, local); |
| 209 | |
| 210 | for (int octave=6; octave>=0; --octave) { |
| 211 | int period = 1 << octave; |
| 212 | computeKernel.setArg(0, perlin); |
| 213 | computeKernel.setArg(1, base); |
| 214 | computeKernel.setArg(2, IMGW); |
| 215 | computeKernel.setArg(3, IMGH); |
| 216 | computeKernel.setArg(4, amp); |