Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdint.h>
- #include <stddef.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <stdint.h>
- #define CL_TARGET_OPENCL_VERSION 200
- #include <CL/cl.h>
- const char* resizeKernel =
- "__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;\n"
- "__kernel void resize_nn(read_only image2d_t source, write_only image2d_t dest, uint src_img_width, uint src_img_height, uint dst_img_width, uint dst_img_height, float ratioX, float ratioY)\n"
- "{\n"
- " const int gx = get_global_id(0);\n"
- " const int gy = get_global_id(1);\n"
- " const int2 pos = { gx, gy };\n"
- "\n"
- " if (pos.x >= dst_img_width || pos.y >= dst_img_height)\n"
- " return;\n"
- "\n"
- " float2 srcpos = {(pos.x + 0.4995f) / ratioX, (pos.y + 0.4995f) / ratioY};\n"
- " int2 SrcSize = (int2)(src_img_width, src_img_height);\n"
- "\n"
- " float4 value;\n"
- "\n"
- " int2 ipos = convert_int2(srcpos);\n"
- " if (ipos.x < 0 || ipos.x >= SrcSize.x || ipos.y < 0 || ipos.y >= SrcSize.y)\n"
- " value = 0;\n"
- " else\n"
- " value = read_imagef(source, sampler, ipos);\n"
- "\n"
- " write_imagef(dest, pos, value);\n"
- "}";
- cl_device_id deviceID;
- cl_context deviceCtx;
- cl_command_queue queue;
- cl_program program;
- int init() {
- cl_int ret;
- cl_uint len;
- ret = clGetPlatformIDs(0, NULL, &len);
- if (ret != 0) {
- return ret;
- }
- cl_platform_id* platformIDs = malloc(len*sizeof(cl_platform_id));
- ret = clGetPlatformIDs(len, platformIDs, NULL);
- if (ret != 0) {
- return ret;
- }
- for (int i=0;i<len;i++) {
- ret = clGetDeviceIDs(platformIDs[i], CL_DEVICE_TYPE_GPU, 1, &deviceID, NULL);
- if (ret == 0) {
- break;
- }
- deviceID = NULL;
- }
- if (deviceID == NULL) {
- return -100;
- }
- deviceCtx = clCreateContext(NULL, 1, &deviceID, NULL, NULL, &ret);
- if (ret != 0) {
- return ret;
- }
- queue = clCreateCommandQueueWithProperties(deviceCtx, deviceID, NULL, &ret);
- if (ret != 0) {
- return ret;
- }
- program = clCreateProgramWithSource(deviceCtx, 1, &resizeKernel, NULL, &ret);
- if (ret != 0) {
- return ret;
- }
- ret = clBuildProgram(program, 1, &deviceID, NULL, NULL, NULL);
- if (ret != 0) {
- return ret;
- }
- return 0;
- }
- size_t max(int a, int b) {
- if (a > b) {
- return a;
- }
- return b;
- }
- void* createImage(
- int width,
- int height,
- int row_pitch,
- unsigned int image_channel_order,
- unsigned int image_channel_data_type,
- void* data,
- cl_int* ret
- ){
- cl_image_format format;
- format.image_channel_order = image_channel_order;
- format.image_channel_data_type = image_channel_data_type;
- cl_mem_flags inFlags = CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR; //(1 << 2) | (1 << 5);
- cl_image_desc inDesc;
- inDesc.image_type = CL_MEM_OBJECT_IMAGE2D; //0x10F1;
- inDesc.image_width = width;
- inDesc.image_height = height;
- inDesc.image_depth= 0;// not usedfor 2d
- inDesc.image_array_size = 0;// not used for 2d
- inDesc.image_row_pitch = 0;//(size_t)(row_pitch);
- inDesc.image_slice_pitch = 0;
- inDesc.num_mip_levels = 0;
- inDesc.num_samples = 0;
- inDesc.buffer = NULL;
- cl_mem in = clCreateImage(deviceCtx, inFlags, &format, &inDesc, data, ret);
- return (void*)(in);
- }
- int releaseImage(void* img) {
- return clReleaseMemObject((cl_mem)(img));
- }
- int resize(
- void *in,
- int inWidth,
- int inHeight,
- int outWidth,
- int outHeight,
- int rowPitch,
- unsigned int image_channel_order,
- unsigned int image_channel_data_type,
- void* outData
- ) {
- cl_int ret;
- cl_image_format format;
- format.image_channel_order = image_channel_order;
- format.image_channel_data_type = image_channel_data_type;
- //output image
- cl_mem_flags outFlags = CL_MEM_WRITE_ONLY;
- cl_image_desc outDesc;
- outDesc.image_type = CL_MEM_OBJECT_IMAGE2D; //0x10F1;
- outDesc.image_width = outWidth;
- outDesc.image_height = outHeight;
- outDesc.image_row_pitch = 0;//rowPitch;
- outDesc.image_slice_pitch = 0;
- outDesc.num_mip_levels = 0;
- outDesc.num_samples = 0;
- outDesc.buffer = NULL;
- cl_mem out = clCreateImage(deviceCtx, outFlags, &format, &outDesc, NULL, &ret);
- if (ret != 0) {
- return ret;
- }
- //kernel
- cl_kernel kernel = clCreateKernel(program, "resize_nn", &ret);
- if (ret != 0) {
- return ret;
- }
- ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), &in);
- if (ret != 0) {
- return ret;
- }
- ret = clSetKernelArg(kernel, 1, sizeof(cl_mem), &out);
- if (ret != 0) {
- return ret;
- }
- ret = clSetKernelArg(kernel, 2, sizeof(int), &inWidth);
- if (ret != 0) {
- return ret;
- }
- ret = clSetKernelArg(kernel, 3, sizeof(int), &inHeight);
- if (ret != 0) {
- return ret;
- }
- ret = clSetKernelArg(kernel, 4, sizeof(int), &outWidth);
- if (ret != 0) {
- return ret;
- }
- ret = clSetKernelArg(kernel, 5, sizeof(int), &outHeight);
- if (ret != 0) {
- return ret;
- }
- float ratioX = (float)(outWidth) / (float)(inWidth);
- ret = clSetKernelArg(kernel, 6, sizeof(float), &ratioX);
- if (ret != 0) {
- return ret;
- }
- float ratioY = (float)(outHeight) / (float)(inHeight);
- ret = clSetKernelArg(kernel, 7, sizeof(float), &ratioY);
- if (ret != 0) {
- return ret;
- }
- //run kernel
- cl_event kernelEvent;
- size_t globalSize[] = {max(inWidth, outWidth), max(inHeight, outHeight)};
- ret = clEnqueueNDRangeKernel(
- queue,
- kernel,
- 2, //work_dim
- 0, //global_work_offset
- globalSize, //global_work_size
- 0, //local_work_size
- 0, //num_events_in_wait_list
- NULL, //event_wait_list
- &kernelEvent //event
- );
- if (ret != 0) {
- return ret;
- }
- ret = clWaitForEvents(1, &kernelEvent);
- if (ret != 0) {
- return ret;
- }
- ret = clReleaseEvent(kernelEvent);
- if (ret != 0) {
- return ret;
- }
- //get image
- cl_event readImageEvent;
- size_t origin[] = {0,0,0};
- size_t region[] = {outWidth,outHeight,1};
- ret = clEnqueueReadImage(
- queue,
- out,
- CL_TRUE,
- origin,
- region,
- 0,
- 0,
- outData,
- 0,
- NULL,
- &readImageEvent
- );
- if (ret != 0) {
- return ret;
- }
- ret = clWaitForEvents(1, &readImageEvent);
- if (ret != 0) {
- return ret;
- }
- ret = clReleaseEvent(readImageEvent);
- if (ret != 0) {
- return ret;
- }
- ret = clReleaseMemObject(out);
- if (ret != 0) {
- return ret;
- }
- ret = clReleaseKernel(kernel);
- if (ret != 0) {
- return ret;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement