Files
2026-08-27 20:17:33 -05:00

82 lines
2.7 KiB
C++

/*
Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
*/
#pragma once
#include <cassert>
#include <cfloat>
#include <cstdlib>
#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 "iqpilot/selfdrive/iqmodeld/transforms/warp_geometry.h"
#include "iqpilot/selfdrive/iqmodeld/transforms/yuv.h"
class FrameCropperBase {
public:
FrameCropperBase(cl_device_id device_id, cl_context context);
virtual ~FrameCropperBase();
virtual cl_mem *project_to_cl(cl_mem yuv_cl, int frame_width, int frame_height, int frame_stride, int frame_uv_offset, const mat3 &projection) = 0;
uint8_t *copy_to_host(cl_mem *source_frames, int buffer_size) {
CL_CHECK(clEnqueueReadBuffer(work_queue_, *source_frames, CL_TRUE, 0, buffer_size, staging_bytes_.get(), 0, nullptr, nullptr));
clFinish(work_queue_);
return &staging_bytes_[0];
}
int buf_size;
protected:
cl_command_queue work_queue_;
std::unique_ptr<uint8_t[]> staging_bytes_;
cl_mem y_plane_tile_cl_;
cl_mem u_plane_tile_cl_;
cl_mem v_plane_tile_cl_;
WarpSamplerState sampler_state_;
void configure_planar_tiles(cl_device_id device_id, cl_context context, int output_width, int output_height);
void release_planar_tiles();
void project_frame(cl_mem yuv_cl, int output_width, int output_height,
int frame_width, int frame_height, int frame_stride, int frame_uv_offset,
const mat3 &projection);
};
class RoadHistoryAssembler : public FrameCropperBase {
public:
RoadHistoryAssembler(cl_device_id device_id, cl_context context, uint8_t history_slots);
~RoadHistoryAssembler() override;
cl_mem *project_to_cl(cl_mem yuv_cl, int frame_width, int frame_height, int frame_stride, int frame_uv_offset, const mat3 &projection) override;
static constexpr int kOutputWidth = 512;
static constexpr int kOutputHeight = 256;
static constexpr int kFrameBytes = kOutputWidth * kOutputHeight * 3 / 2;
static constexpr int kExportBytes = kFrameBytes * 2;
private:
PackedFrameKernels packer_;
cl_mem timeline_cl_;
cl_mem latest_slot_cl_;
cl_mem publish_pair_cl_;
cl_buffer_region latest_region_;
size_t frame_bytes_;
uint8_t history_slots_;
};
class CabinFrameSampler : public FrameCropperBase {
public:
CabinFrameSampler(cl_device_id device_id, cl_context context);
~CabinFrameSampler() override;
cl_mem *project_to_cl(cl_mem yuv_cl, int frame_width, int frame_height, int frame_stride, int frame_uv_offset, const mat3 &projection) override;
static constexpr int kOutputWidth = 1440;
static constexpr int kOutputHeight = 960;
static constexpr int kExportBytes = kOutputWidth * kOutputHeight;
};