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.
97 lines
3.3 KiB
97 lines
3.3 KiB
#pragma once
|
|
|
|
#include <cfloat>
|
|
#include <cstdlib>
|
|
#include <cassert>
|
|
|
|
#include <memory>
|
|
|
|
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS
|
|
#ifdef __APPLE__
|
|
#include <OpenCL/cl.h>
|
|
#else
|
|
#include <CL/cl.h>
|
|
#endif
|
|
|
|
#include "common/mat.h"
|
|
#include "selfdrive/modeld/transforms/loadyuv.h"
|
|
#include "selfdrive/modeld/transforms/transform.h"
|
|
|
|
class ModelFrame {
|
|
public:
|
|
ModelFrame(cl_device_id device_id, cl_context context) {
|
|
q = CL_CHECK_ERR(clCreateCommandQueue(context, device_id, 0, &err));
|
|
}
|
|
virtual ~ModelFrame() {}
|
|
virtual cl_mem* prepare(cl_mem yuv_cl, int frame_width, int frame_height, int frame_stride, int frame_uv_offset, const mat3& projection) { return NULL; }
|
|
uint8_t* buffer_from_cl(cl_mem *in_frames, int buffer_size) {
|
|
CL_CHECK(clEnqueueReadBuffer(q, *in_frames, CL_TRUE, 0, buffer_size, input_frames.get(), 0, nullptr, nullptr));
|
|
clFinish(q);
|
|
return &input_frames[0];
|
|
}
|
|
|
|
int MODEL_WIDTH;
|
|
int MODEL_HEIGHT;
|
|
int MODEL_FRAME_SIZE;
|
|
int buf_size;
|
|
|
|
protected:
|
|
cl_mem y_cl, u_cl, v_cl;
|
|
Transform transform;
|
|
cl_command_queue q;
|
|
std::unique_ptr<uint8_t[]> input_frames;
|
|
|
|
void init_transform(cl_device_id device_id, cl_context context, int model_width, int model_height) {
|
|
y_cl = CL_CHECK_ERR(clCreateBuffer(context, CL_MEM_READ_WRITE, model_width * model_height, NULL, &err));
|
|
u_cl = CL_CHECK_ERR(clCreateBuffer(context, CL_MEM_READ_WRITE, (model_width / 2) * (model_height / 2), NULL, &err));
|
|
v_cl = CL_CHECK_ERR(clCreateBuffer(context, CL_MEM_READ_WRITE, (model_width / 2) * (model_height / 2), NULL, &err));
|
|
transform_init(&transform, context, device_id);
|
|
}
|
|
|
|
void deinit_transform() {
|
|
transform_destroy(&transform);
|
|
CL_CHECK(clReleaseMemObject(v_cl));
|
|
CL_CHECK(clReleaseMemObject(u_cl));
|
|
CL_CHECK(clReleaseMemObject(y_cl));
|
|
}
|
|
|
|
void run_transform(cl_mem yuv_cl, int model_width, int model_height, int frame_width, int frame_height, int frame_stride, int frame_uv_offset, const mat3& projection) {
|
|
transform_queue(&transform, q,
|
|
yuv_cl, frame_width, frame_height, frame_stride, frame_uv_offset,
|
|
y_cl, u_cl, v_cl, model_width, model_height, projection);
|
|
}
|
|
};
|
|
|
|
class DrivingModelFrame : public ModelFrame {
|
|
public:
|
|
DrivingModelFrame(cl_device_id device_id, cl_context context, int _temporal_skip);
|
|
~DrivingModelFrame();
|
|
cl_mem* prepare(cl_mem yuv_cl, int frame_width, int frame_height, int frame_stride, int frame_uv_offset, const mat3& projection);
|
|
|
|
const int MODEL_WIDTH = 512;
|
|
const int MODEL_HEIGHT = 256;
|
|
const int MODEL_FRAME_SIZE = MODEL_WIDTH * MODEL_HEIGHT * 3 / 2;
|
|
const int buf_size = MODEL_FRAME_SIZE * 2; // 2 frames are temporal_skip frames apart
|
|
const size_t frame_size_bytes = MODEL_FRAME_SIZE * sizeof(uint8_t);
|
|
|
|
private:
|
|
LoadYUVState loadyuv;
|
|
cl_mem img_buffer_20hz_cl, last_img_cl, input_frames_cl;
|
|
cl_buffer_region region;
|
|
int temporal_skip;
|
|
};
|
|
|
|
class MonitoringModelFrame : public ModelFrame {
|
|
public:
|
|
MonitoringModelFrame(cl_device_id device_id, cl_context context);
|
|
~MonitoringModelFrame();
|
|
cl_mem* prepare(cl_mem yuv_cl, int frame_width, int frame_height, int frame_stride, int frame_uv_offset, const mat3& projection);
|
|
|
|
const int MODEL_WIDTH = 1440;
|
|
const int MODEL_HEIGHT = 960;
|
|
const int MODEL_FRAME_SIZE = MODEL_WIDTH * MODEL_HEIGHT;
|
|
const int buf_size = MODEL_FRAME_SIZE;
|
|
|
|
private:
|
|
cl_mem input_frame_cl;
|
|
};
|
|
|