41 string filename =
"assets/input.bmp";
43 cl_context context = 0;
44 cl_command_queue commandQueue = 0;
45 cl_program program = 0;
46 cl_device_id device = 0;
48 const unsigned int numberOfMemoryObjects = 3;
49 cl_mem memoryObjects[numberOfMemoryObjects] = {0, 0, 0};
54 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
55 cerr <<
"Failed to create an OpenCL context. " << __FILE__ <<
":"<< __LINE__ << endl;
61 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
62 cerr <<
"Failed to create the OpenCL command queue. " << __FILE__ <<
":"<< __LINE__ << endl;
66 if (!
createProgram(context, device,
"assets/sobel_no_vectors.cl", &program))
68 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
69 cerr <<
"Failed to create OpenCL program." << __FILE__ <<
":"<< __LINE__ << endl;
73 kernel = clCreateKernel(program,
"sobel_no_vectors", &errorNumber);
76 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
77 cerr <<
"Failed to create OpenCL kernel. " << __FILE__ <<
":"<< __LINE__ << endl;
84 unsigned char* imageData = NULL;
87 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
88 cerr <<
"Failed loading bitmap. " << __FILE__ <<
":"<< __LINE__ << endl;
93 size_t bufferSize = width * height *
sizeof(cl_uchar);
96 bool createMemoryObjectsSuccess =
true;
97 memoryObjects[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, bufferSize, NULL, &errorNumber);
99 memoryObjects[1] = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, bufferSize, NULL, &errorNumber);
100 createMemoryObjectsSuccess &=
checkSuccess(errorNumber);
101 memoryObjects[2] = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, bufferSize, NULL, &errorNumber);
102 createMemoryObjectsSuccess &=
checkSuccess(errorNumber);
103 if (!createMemoryObjectsSuccess)
105 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
106 cerr <<
"Failed to create OpenCL buffers. " << __FILE__ <<
":"<< __LINE__ << endl;
111 cl_uchar* luminance = (cl_uchar*)clEnqueueMapBuffer(commandQueue, memoryObjects[0], CL_TRUE, CL_MAP_WRITE, 0, bufferSize, 0, NULL, NULL, &errorNumber);
114 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
115 cerr <<
"Mapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
125 bool setKernelArgumentsSuccess =
true;
126 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 0,
sizeof(cl_mem), &memoryObjects[0]));
127 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 1,
sizeof(cl_int), &width));
128 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 2,
sizeof(cl_mem), &memoryObjects[1]));
129 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 3,
sizeof(cl_mem), &memoryObjects[2]));
130 if (!setKernelArgumentsSuccess)
132 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
133 cerr <<
"Failed setting OpenCL kernel arguments. " << __FILE__ <<
":"<< __LINE__ << endl;
145 size_t globalWorksize[2] = {width, height};
149 if (!
checkSuccess(clEnqueueNDRangeKernel(commandQueue, kernel, 2, NULL, globalWorksize, NULL, 0, NULL, &event)))
151 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
152 cerr <<
"Failed enqueuing the kernel. " << __FILE__ <<
":"<< __LINE__ << endl;
159 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
160 cerr <<
"Failed waiting for kernel execution to finish. " << __FILE__ <<
":"<< __LINE__ << endl;
169 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
170 cerr <<
"Failed releasing the event object. " << __FILE__ <<
":"<< __LINE__ << endl;
175 bool mapMemoryObjectsSuccess =
true;
176 cl_char* outputDx = (cl_char*)clEnqueueMapBuffer(commandQueue, memoryObjects[1], CL_TRUE, CL_MAP_READ, 0, bufferSize, 0, NULL, NULL, &errorNumber);
178 cl_char* outputDy = (cl_char*)clEnqueueMapBuffer(commandQueue, memoryObjects[2], CL_TRUE, CL_MAP_READ, 0, bufferSize, 0, NULL, NULL, &errorNumber);
180 if (!mapMemoryObjectsSuccess)
182 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
183 cerr <<
"Mapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
195 unsigned char *absDX =
new unsigned char[width * height];
196 unsigned char *absDY =
new unsigned char[width * height];
197 for (
int i = 0; i < width * height; i++)
199 absDX[i] = abs(outputDx[i]);
200 absDY[i] = abs(outputDy[i]);
204 bool unmapMemoryObjectsSuccess =
true;
205 unmapMemoryObjectsSuccess &=
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[1], outputDx, 0, NULL, NULL));
206 unmapMemoryObjectsSuccess &=
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[2], outputDy, 0, NULL, NULL));
207 if (!unmapMemoryObjectsSuccess)
209 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
210 cerr <<
"Unmapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
215 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
218 unsigned char* rgbOut =
new unsigned char[width * height * 3];
226 unsigned char* totalOutput =
new unsigned char[width * height];
227 for (
int index = 0; index < width * height; index++)
229 totalOutput[index] = sqrt(pow(absDX[index], 2) + pow(absDY[index], 2));
237 delete [] totalOutput;