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;
 | |
| };
 | |
| 
 |