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.
 
 
 
 
 
 

111 lines
3.7 KiB

#include <assert.h>
#include <stdio.h>
#include <string.h>
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
#ifdef __APPLE__
#include <OpenCL/cl.h>
#else
#include <CL/cl.h>
#endif
#include "selfdrive/common/clutil.h"
#include "selfdrive/modeld/transforms/transform.h"
typedef struct {
int disable_model;
Transform transform;
int in_width;
int in_height;
int out_width;
int out_height;
cl_context context;
cl_command_queue command_queue;
cl_device_id device_id;
size_t in_yuv_size;
cl_mem in_yuv_cl;
cl_mem out_y_cl, out_u_cl, out_v_cl;
} VisionTest;
void initialize_opencl(VisionTest* visiontest) {
// init cl
cl_device_id device_id = cl_get_device_id(CL_DEVICE_TYPE_CPU);
visiontest->context = CL_CHECK_ERR(clCreateContext(NULL, 1, &device_id, NULL, NULL, &err));
visiontest->device_id = device_id;
}
VisionTest* visiontest_create(int temporal_model, int disable_model,
int input_width, int input_height,
int model_input_width, int model_input_height) {
VisionTest* const vt = calloc(1, sizeof(*vt));
assert(vt);
vt->disable_model = disable_model;
vt->in_width = input_width;
vt->in_height = input_height;
vt->out_width = model_input_width;
vt->out_height = model_input_height;
initialize_opencl(vt);
transform_init(&vt->transform, vt->context, vt->device_id);
assert((vt->in_width%2) == 0 && (vt->in_height%2) == 0);
vt->in_yuv_size = vt->in_width*vt->in_height*3/2;
vt->in_yuv_cl = CL_CHECK_ERR(clCreateBuffer(vt->context, CL_MEM_READ_WRITE,
vt->in_yuv_size, NULL, &err));
vt->out_y_cl = CL_CHECK_ERR(clCreateBuffer(vt->context, CL_MEM_READ_WRITE,
vt->out_width*vt->out_width, NULL, &err));
vt->out_u_cl = CL_CHECK_ERR(clCreateBuffer(vt->context, CL_MEM_READ_WRITE,
vt->out_width*vt->out_width/4, NULL, &err));
vt->out_v_cl = CL_CHECK_ERR(clCreateBuffer(vt->context, CL_MEM_READ_WRITE,
vt->out_width*vt->out_width/4, NULL, &err));
vt->command_queue = CL_CHECK_ERR(clCreateCommandQueue(vt->context, vt->device_id, 0, &err));
return vt;
}
void visiontest_destroy(VisionTest* vt) {
transform_destroy(&vt->transform);
CL_CHECK(clReleaseMemObject(vt->in_yuv_cl));
CL_CHECK(clReleaseMemObject(vt->out_y_cl));
CL_CHECK(clReleaseMemObject(vt->out_u_cl));
CL_CHECK(clReleaseMemObject(vt->out_v_cl));
CL_CHECK(clReleaseCommandQueue(vt->command_queue));
CL_CHECK(clReleaseContext(vt->context));
free(vt);
}
void visiontest_transform(VisionTest* vt, const uint8_t* yuv_data,
uint8_t* out_y, uint8_t* out_u, uint8_t* out_v,
const float* transform) {
CL_CHECK(clEnqueueWriteBuffer(vt->command_queue, vt->in_yuv_cl, CL_FALSE,
0, vt->in_yuv_size, yuv_data, 0, NULL, NULL));
mat3 transform_m = *(const mat3*)transform;
transform_queue(&vt->transform, vt->command_queue,
vt->in_yuv_cl, vt->in_width, vt->in_height,
vt->out_y_cl, vt->out_u_cl, vt->out_v_cl,
vt->out_width, vt->out_height,
transform_m);
CL_CHECK(clEnqueueReadBuffer(vt->command_queue, vt->out_y_cl, CL_FALSE,
0, vt->out_width*vt->out_height, out_y,
0, NULL, NULL));
CL_CHECK(clEnqueueReadBuffer(vt->command_queue, vt->out_u_cl, CL_FALSE,
0, vt->out_width*vt->out_height/4, out_u,
0, NULL, NULL));
CL_CHECK(clEnqueueReadBuffer(vt->command_queue, vt->out_v_cl, CL_FALSE,
0, vt->out_width*vt->out_height/4, out_v,
0, NULL, NULL));
clFinish(vt->command_queue);
}