openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
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.

83 lines
2.5 KiB

#include <string.h>
#include <assert.h>
#include "clutil.h"
#include "loadyuv.h"
void loadyuv_init(LoadYUVState* s, cl_context ctx, cl_device_id device_id, int width, int height) {
int err = 0;
memset(s, 0, sizeof(*s));
s->width = width;
s->height = height;
char args[1024];
snprintf(args, sizeof(args),
"-cl-fast-relaxed-math -cl-denorms-are-zero "
"-DTRANSFORMED_WIDTH=%d -DTRANSFORMED_HEIGHT=%d",
width, height);
cl_program prg = CLU_LOAD_FROM_FILE(ctx, device_id, "transforms/loadyuv.cl", args);
s->loadys_krnl = clCreateKernel(prg, "loadys", &err);
assert(err == 0);
s->loaduv_krnl = clCreateKernel(prg, "loaduv", &err);
assert(err == 0);
// done with this
err = clReleaseProgram(prg);
assert(err == 0);
}
void loadyuv_destroy(LoadYUVState* s) {
int err = 0;
err = clReleaseKernel(s->loadys_krnl);
assert(err == 0);
err = clReleaseKernel(s->loaduv_krnl);
assert(err == 0);
}
void loadyuv_queue(LoadYUVState* s, cl_command_queue q,
cl_mem y_cl, cl_mem u_cl, cl_mem v_cl,
cl_mem out_cl) {
int err = 0;
err = clSetKernelArg(s->loadys_krnl, 0, sizeof(cl_mem), &y_cl);
assert(err == 0);
err = clSetKernelArg(s->loadys_krnl, 1, sizeof(cl_mem), &out_cl);
assert(err == 0);
const size_t loadys_work_size = (s->width*s->height)/8;
err = clEnqueueNDRangeKernel(q, s->loadys_krnl, 1, NULL,
&loadys_work_size, NULL, 0, 0, NULL);
assert(err == 0);
const size_t loaduv_work_size = ((s->width/2)*(s->height/2))/8;
cl_int loaduv_out_off = (s->width*s->height);
err = clSetKernelArg(s->loaduv_krnl, 0, sizeof(cl_mem), &u_cl);
assert(err == 0);
err = clSetKernelArg(s->loaduv_krnl, 1, sizeof(cl_mem), &out_cl);
assert(err == 0);
err = clSetKernelArg(s->loaduv_krnl, 2, sizeof(cl_int), &loaduv_out_off);
assert(err == 0);
err = clEnqueueNDRangeKernel(q, s->loaduv_krnl, 1, NULL,
&loaduv_work_size, NULL, 0, 0, NULL);
assert(err == 0);
loaduv_out_off += (s->width/2)*(s->height/2);
err = clSetKernelArg(s->loaduv_krnl, 0, sizeof(cl_mem), &v_cl);
assert(err == 0);
err = clSetKernelArg(s->loaduv_krnl, 1, sizeof(cl_mem), &out_cl);
assert(err == 0);
err = clSetKernelArg(s->loaduv_krnl, 2, sizeof(cl_int), &loaduv_out_off);
assert(err == 0);
err = clEnqueueNDRangeKernel(q, s->loaduv_krnl, 1, NULL,
&loaduv_work_size, NULL, 0, 0, NULL);
assert(err == 0);
}