![Dean Lee](/assets/img/avatar_default.png)
* cleanup include path * continue * format includes * fix testraw.cc * remove include path from SConstruct * regroup * rebase master * almost done * apply review * rename FileReader.xx to filereader.xx * rename Unlogger.x->unlogger.x * rename FrameReader.xx -> framereader.xx * apply reviews * ui.h * continue * fix framebuffer.cc build error:mv util.h up * full path to msm_media_info * fix qcom2 camerad Co-authored-by: Comma Device <device@comma.ai>
112 lines
3.7 KiB
C
112 lines
3.7 KiB
C
#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);
|
|
}
|
|
|