| 84 | } |
| 85 | |
| 86 | void kernel(cl::Buffer& devOut, int fnCode, int outFlags, |
| 87 | cl::Buffer& colorsOut, cl::Buffer& alphasOut, cl::Buffer& radiiOut, |
| 88 | cl::CommandQueue& queue, cl::Device& device) |
| 89 | { |
| 90 | static bool compileFlag = true; |
| 91 | |
| 92 | static cl::Program prog; |
| 93 | static cl::Kernel randKernel, colorsKernel, mapKernel; |
| 94 | |
| 95 | std::srand((unsigned)(std::time(0))); |
| 96 | |
| 97 | if (compileFlag) { |
| 98 | try { |
| 99 | prog = cl::Program(queue.getInfo<CL_QUEUE_CONTEXT>(), chartKernels, false); |
| 100 | |
| 101 | std::vector<cl::Device> devs; |
| 102 | devs.push_back(device); |
| 103 | prog.build(devs); |
| 104 | |
| 105 | randKernel = cl::Kernel(prog, "randKernel"); |
| 106 | colorsKernel = cl::Kernel(prog, "colorsKernel"); |
| 107 | mapKernel = cl::Kernel(prog, "mapKernel"); |
| 108 | } catch (cl::Error err) { |
| 109 | std::cout << "Compile Errors: " << std::endl; |
| 110 | std::cout << err.what() << err.err() << std::endl; |
| 111 | std::cout << prog.getBuildInfo<CL_PROGRAM_BUILD_LOG>(device) << std::endl; |
| 112 | exit(255); |
| 113 | } |
| 114 | std::cout<< "Kernels compiled successfully" << std::endl; |
| 115 | compileFlag = false; |
| 116 | } |
| 117 | |
| 118 | static const NDRange local(32); |
| 119 | NDRange global(local[0] * divup(DATA_SIZE, (int)(local[0]))); |
| 120 | |
| 121 | mapKernel.setArg(0, devOut); |
| 122 | mapKernel.setArg(1, fnCode); |
| 123 | mapKernel.setArg(2, FRANGE_START); |
| 124 | mapKernel.setArg(3, DX); |
| 125 | mapKernel.setArg(4, DATA_SIZE); |
| 126 | queue.enqueueNDRangeKernel(mapKernel, cl::NullRange, global, local); |
| 127 | |
| 128 | if (outFlags & 0x00000001) { |
| 129 | colorsKernel.setArg(0, colorsOut); |
| 130 | colorsKernel.setArg(1, std::rand()); |
| 131 | colorsKernel.setArg(2, std::rand()); |
| 132 | colorsKernel.setArg(3, std::rand()); |
| 133 | colorsKernel.setArg(4, DATA_SIZE); |
| 134 | queue.enqueueNDRangeKernel(colorsKernel, cl::NullRange, global, local); |
| 135 | } |
| 136 | |
| 137 | if (outFlags & 0x00000002) { |
| 138 | randKernel.setArg(0, alphasOut); |
| 139 | randKernel.setArg(1, std::rand()); |
| 140 | randKernel.setArg(2, 0.0f); |
| 141 | randKernel.setArg(3, 1.0f); |
| 142 | randKernel.setArg(4, DATA_SIZE); |
| 143 | queue.enqueueNDRangeKernel(randKernel, cl::NullRange, global, local); |