26 cl_context context = 0;
27 cl_command_queue commandQueue = 0;
28 cl_program program = 0;
29 cl_device_id device = 0;
31 const int numMemoryObjects = 2;
32 cl_mem memoryObjects[numMemoryObjects] = {0, 0};
38 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
39 cerr <<
"Failed to create an OpenCL context. " << __FILE__ <<
":"<< __LINE__ << endl;
45 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
46 cerr <<
"Failed to create the OpenCL command queue. " << __FILE__ <<
":"<< __LINE__ << endl;
50 if (!
createProgram(context, device,
"assets/image_scaling.cl", &program))
52 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
53 cerr <<
"Failed to create OpenCL program." << __FILE__ <<
":"<< __LINE__ << endl;
57 kernel = clCreateKernel(program,
"image_scaling", &errorNumber);
60 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
61 cerr <<
"Failed to create OpenCL kernel. " << __FILE__ <<
":"<< __LINE__ << endl;
71 const int scaleFactor = 8;
74 unsigned char* inputImage = NULL;
82 int newWidth = width * scaleFactor;
83 int newHeight = height * scaleFactor;
91 cl_image_format format;
92 format.image_channel_data_type = CL_UNORM_INT8;
93 format.image_channel_order = CL_RGBA;
96 bool createMemoryObjectsSuccess =
true;
98 memoryObjects[0] = clCreateImage2D(context, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, &format, width, height, 0, NULL, &errorNumber);
101 memoryObjects[1] = clCreateImage2D(context, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, &format, newWidth, newHeight, 0, NULL, &errorNumber);
102 createMemoryObjectsSuccess &=
checkSuccess(errorNumber);
104 if (!createMemoryObjectsSuccess)
106 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
107 cerr <<
"Failed creating the image. " << __FILE__ <<
":"<< __LINE__ << endl;
117 size_t origin[3] = {0, 0, 0};
118 size_t region[3] = {width, height, 1};
129 unsigned char* inputImageRGBA = (
unsigned char*)clEnqueueMapImage(commandQueue, memoryObjects[0], CL_TRUE, CL_MAP_WRITE, origin, region, &rowPitch, NULL, 0, NULL, NULL, &errorNumber);
132 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
133 cerr <<
"Failed mapping the input image. " << __FILE__ <<
":"<< __LINE__ << endl;
139 RGBToRGBA(inputImage, inputImageRGBA, width, height);
143 if (!
checkSuccess(clEnqueueUnmapMemObject(commandQueue, memoryObjects[0], inputImageRGBA, 0, NULL, NULL)))
145 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
146 cerr <<
"Failed unmapping the input image. " << __FILE__ <<
":"<< __LINE__ << endl;
154 cl_float widthNormalizationFactor = 1.0f / newWidth;
155 cl_float heightNormalizationFactor = 1.0f / newHeight;
158 bool setKernelArgumentsSuccess =
true;
159 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 0,
sizeof(cl_mem), &memoryObjects[0]));
160 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 1,
sizeof(cl_mem), &memoryObjects[1]));
161 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 2,
sizeof(cl_float), &widthNormalizationFactor));
162 setKernelArgumentsSuccess &=
checkSuccess(clSetKernelArg(kernel, 3,
sizeof(cl_float), &heightNormalizationFactor));
163 if (!setKernelArgumentsSuccess)
165 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, 3);
166 cerr <<
"Failed setting OpenCL kernel arguments. " << __FILE__ <<
":"<< __LINE__ << endl;
176 const int workDimensions = 2;
177 size_t globalWorkSize[workDimensions] = {newWidth, newHeight};
183 if (!
checkSuccess(clEnqueueNDRangeKernel(commandQueue, kernel, workDimensions, NULL, globalWorkSize, NULL, 0, NULL, &event)))
185 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
186 cerr <<
"Failed enqueuing the kernel. " << __FILE__ <<
":"<< __LINE__ << endl;
193 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
194 cerr <<
"Failed waiting for kernel execution to finish. " << __FILE__ <<
":"<< __LINE__ << endl;
203 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
204 cerr <<
"Failed releasing the event object. " << __FILE__ <<
":"<< __LINE__ << endl;
208 size_t newRegion[3] = {newWidth, newHeight, 1};
210 unsigned char* outputImage = (
unsigned char*)clEnqueueMapImage(commandQueue, memoryObjects[1], CL_TRUE, CL_MAP_READ, origin, newRegion, &rowPitch, NULL, 0, NULL, NULL, &errorNumber);
213 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);
214 cerr <<
"Failed mapping the input image. " << __FILE__ <<
":"<< __LINE__ << endl;
218 unsigned char* outputImageRGB =
new unsigned char[newWidth * newHeight * 3];
219 RGBAToRGB(outputImage, outputImageRGB, newWidth, newHeight);
221 saveToBitmap(
"output.bmp", newWidth, newHeight, outputImageRGB);
223 delete[] outputImageRGB;
225 cleanUpOpenCL(context, commandQueue, program, kernel, memoryObjects, numMemoryObjects);