33 string filename =
"assets/input.bmp";
35 cl_context context = 0;
36 cl_command_queue commandQueue = 0;
37 cl_program program = 0;
38 cl_device_id device = 0;
40 const unsigned int numberOfMemoryObjects = 2;
41 cl_mem memoryObjects[numberOfMemoryObjects] = {0, 0};
46 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
47 cerr <<
"Failed to create an OpenCL context. " << __FILE__ <<
":"<< __LINE__ << endl;
53 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
54 cerr <<
"Failed to create the OpenCL command queue. " << __FILE__ <<
":"<< __LINE__ << endl;
58 if (!
createProgram(context, device,
"assets/fir_float.cl", &program))
60 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
61 cerr <<
"Failed to create OpenCL program." << __FILE__ <<
":"<< __LINE__ << endl;
65 kernel = clCreateKernel(program,
"fir_float", &errorNumber);
68 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
69 cerr <<
"Failed to create OpenCL kernel. " << __FILE__ <<
":"<< __LINE__ << endl;
76 unsigned char* loadedRGBData = NULL;
79 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
80 cerr <<
"Failed loading bitmap. " << __FILE__ <<
":"<< __LINE__ << endl;
85 unsigned char* inputLuminance =
new unsigned char [width * height];
87 delete [] loadedRGBData;
90 size_t bufferSize = width * height *
sizeof(float);
93 bool createMemoryObjectsSuccess =
true;
94 memoryObjects[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, bufferSize, NULL, &errorNumber);
96 memoryObjects[1] = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, bufferSize, NULL, &errorNumber);
98 if (!createMemoryObjectsSuccess)
100 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
101 cerr <<
"Failed to create OpenCL buffers. " << __FILE__ <<
":"<< __LINE__ << endl;
106 cl_float* inputImageData = (cl_float*)clEnqueueMapBuffer(commandQueue, memoryObjects[0], CL_TRUE, CL_MAP_WRITE, 0, bufferSize, 0, NULL, NULL, &errorNumber);
109 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
110 cerr <<
"Mapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
115 for(
int i = 0; i < width * height; i++)
117 inputImageData[i] = (float)inputLuminance[i] / 255.0f;
120 delete [] inputLuminance;
123 if (!
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[0], inputImageData, 0, NULL, NULL)))
125 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
126 cerr <<
"Unmapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
131 bool setKernelArgumentsSuccess =
true;
132 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 0,
sizeof(cl_mem), &memoryObjects[0]));
133 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 1,
sizeof(cl_mem), &memoryObjects[1]));
134 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 2,
sizeof(cl_int), &width));
135 if (!setKernelArgumentsSuccess)
137 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
138 cerr <<
"Failed setting OpenCL kernel arguments. " << __FILE__ <<
":"<< __LINE__ << endl;
150 size_t globalWorksize[2] = {width / 4, height / 1};
154 if (!
checkSuccess(clEnqueueNDRangeKernel(commandQueue, kernel, 2, NULL, globalWorksize, NULL, 0, NULL, &event)))
156 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
157 cerr <<
"Failed enqueuing the kernel. " << __FILE__ <<
":"<< __LINE__ << endl;
164 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
165 cerr <<
"Failed waiting for kernel execution to finish. " << __FILE__ <<
":"<< __LINE__ << endl;
174 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
175 cerr <<
"Failed releasing the event object. " << __FILE__ <<
":"<< __LINE__ << endl;
180 cl_float* output = (cl_float*)clEnqueueMapBuffer(commandQueue, memoryObjects[1], CL_TRUE, CL_MAP_READ, 0, bufferSize, 0, NULL, NULL, &errorNumber);
183 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
184 cerr <<
"Mapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
189 unsigned char *outputData=
new unsigned char[width * height];
190 for(
int i = 0; i< width * height; i++)
192 outputData[i] = (
unsigned char)(output[i] * 255.0f);
196 if (!
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[1], output, 0, NULL, NULL)))
198 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
199 cerr <<
"Unmapping memory objects failed " << __FILE__ <<
":"<< __LINE__ << endl;
204 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numberOfMemoryObjects);
207 unsigned char *rgbOut =
new unsigned char[width * height * 3];
209 delete [] outputData;