You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.8 KiB
54 lines
1.8 KiB
#include <string.h>
|
|
#include <assert.h>
|
|
|
|
#include "clutil.h"
|
|
|
|
#include "rgb_to_yuv.h"
|
|
|
|
void rgb_to_yuv_init(RGBToYUVState* s, cl_context ctx, cl_device_id device_id, int width, int height, int rgb_stride) {
|
|
int err = 0;
|
|
memset(s, 0, sizeof(*s));
|
|
printf("width %d, height %d, rgb_stride %d\n", width, height, rgb_stride);
|
|
assert(width % 2 == 0);
|
|
assert(height % 2 == 0);
|
|
s->width = width;
|
|
s->height = height;
|
|
char args[1024];
|
|
snprintf(args, sizeof(args),
|
|
"-cl-fast-relaxed-math -cl-denorms-are-zero "
|
|
#ifdef CL_DEBUG
|
|
"-DCL_DEBUG "
|
|
#endif
|
|
"-DWIDTH=%d -DHEIGHT=%d -DUV_WIDTH=%d -DUV_HEIGHT=%d -DRGB_STRIDE=%d -DRGB_SIZE=%d",
|
|
width, height, width/ 2, height / 2, rgb_stride, width * height);
|
|
cl_program prg = CLU_LOAD_FROM_FILE(ctx, device_id, "transforms/rgb_to_yuv.cl", args);
|
|
|
|
s->rgb_to_yuv_krnl = clCreateKernel(prg, "rgb_to_yuv", &err);
|
|
assert(err == 0);
|
|
// done with this
|
|
err = clReleaseProgram(prg);
|
|
assert(err == 0);
|
|
}
|
|
|
|
void rgb_to_yuv_destroy(RGBToYUVState* s) {
|
|
int err = 0;
|
|
err = clReleaseKernel(s->rgb_to_yuv_krnl);
|
|
assert(err == 0);
|
|
}
|
|
|
|
void rgb_to_yuv_queue(RGBToYUVState* s, cl_command_queue q, cl_mem rgb_cl, cl_mem yuv_cl) {
|
|
int err = 0;
|
|
err = clSetKernelArg(s->rgb_to_yuv_krnl, 0, sizeof(cl_mem), &rgb_cl);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->rgb_to_yuv_krnl, 1, sizeof(cl_mem), &yuv_cl);
|
|
assert(err == 0);
|
|
const size_t work_size[2] = {
|
|
(size_t)(s->width + (s->width % 4 == 0 ? 0 : (4 - s->width % 4))) / 4,
|
|
(size_t)(s->height + (s->height % 4 == 0 ? 0 : (4 - s->height % 4))) / 4
|
|
};
|
|
cl_event event;
|
|
err = clEnqueueNDRangeKernel(q, s->rgb_to_yuv_krnl, 2, NULL, &work_size[0], NULL, 0, 0, &event);
|
|
assert(err == 0);
|
|
clWaitForEvents(1, &event);
|
|
clReleaseEvent(event);
|
|
}
|
|
|