mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-02-23 17:33:55 +08:00
* refactor draw model
* rebase master
* correct valid_len
* rename function
* rename variables
* white space
* rebase to master
* e16c13ac-927d-455e-ae0a-81b482a2c787
* start rewriting
* save proress
* compiles!
* oops
* many fixes
* seems to work
* fix desires
* finally cleaned
* wrong std for ll
* dont pulse none
* compiles!
* ready to test
* WIP does not compile
* compiles
* various fixes
* does something!
* full 3d
* not needed
* draw up to 100m
* fix segfault
* wrong sign
* fix flicker
* add road edges
* finish v2 packet
* Added pytorch supercombo
* fix rebase
* no more keras
* Hacky solution to the NCHW/NHWC incompatibility between SNPE and our frame data
* dont break dmonitoringd, final model 229e3ce1-7259-412b-85e6-cc646d70f1d8/430
* fix hack
* Revert "fix hack"
This reverts commit 5550fc01a7881d065a5eddbbb42dac55ef7ec36c.
* Removed axis permutation hack
* Folded padding layers into conv layers
* Removed the last pad layer from the dlc
* Revert "Removed the last pad layer from the dlc"
This reverts commit b85f24b9e1d04abf64e85901a7ff49e00d82020a.
* Revert "Folded padding layers into conv layers"
This reverts commit b8d1773e4e76dea481acebbfad6a6235fbb58463.
* vision model: 5034ac8b-5703-4a49-948b-11c064d10880/780 temporal model: 229e3ce1-7259-412b-85e6-cc646d70f1d8/430 with permute + pool opt
* fix ui drawing with clips
* ./compile_torch.py 5034ac8b-5703-4a49-948b-11c064d10880/780 dfcd2375-81d8-49df-95bf-1d2d6ad86010/450 with variable history length
* std::clamp
* not sure how this compiled before
* 2895ace6-a296-47ac-86e6-17ea800a74e5/550
* db090195-8810-42de-ab38-bb835d775d87/601
* 5m is very little
* onnx runner
* add onnxruntime to pipfile
* run in real time without using the whole CPU
* bump cereal;
* add stds
* set road edge opacity based on stddev
* don't access the model packet in paint
* convert mat.h to a c++ header file (#2499)
* update tests
* safety first
Co-authored-by: deanlee <deanlee3@gmail.com>
Co-authored-by: mitchell <mitchell@comma.ai>
Co-authored-by: Comma Device <device@comma.ai>
Co-authored-by: George Hotz <george@comma.ai>
Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
old-commit-hash: 08846b5c0e
150 lines
4.7 KiB
C++
150 lines
4.7 KiB
C++
#include <string.h>
|
|
#include <assert.h>
|
|
|
|
#include "clutil.h"
|
|
|
|
#include "transform.h"
|
|
|
|
void transform_init(Transform* s, cl_context ctx, cl_device_id device_id) {
|
|
int err = 0;
|
|
memset(s, 0, sizeof(*s));
|
|
|
|
cl_program prg = CLU_LOAD_FROM_FILE(ctx, device_id, "transforms/transform.cl", "");
|
|
|
|
s->krnl = clCreateKernel(prg, "warpPerspective", &err);
|
|
assert(err == 0);
|
|
|
|
// done with this
|
|
err = clReleaseProgram(prg);
|
|
assert(err == 0);
|
|
|
|
s->m_y_cl = clCreateBuffer(ctx, CL_MEM_READ_WRITE, 3*3*sizeof(float), NULL, &err);
|
|
assert(err == 0);
|
|
|
|
s->m_uv_cl = clCreateBuffer(ctx, CL_MEM_READ_WRITE, 3*3*sizeof(float), NULL, &err);
|
|
assert(err == 0);
|
|
}
|
|
|
|
void transform_destroy(Transform* s) {
|
|
int err = 0;
|
|
|
|
err = clReleaseMemObject(s->m_y_cl);
|
|
assert(err == 0);
|
|
err = clReleaseMemObject(s->m_uv_cl);
|
|
assert(err == 0);
|
|
|
|
err = clReleaseKernel(s->krnl);
|
|
assert(err == 0);
|
|
}
|
|
|
|
void transform_queue(Transform* s,
|
|
cl_command_queue q,
|
|
cl_mem in_yuv, int in_width, int in_height,
|
|
cl_mem out_y, cl_mem out_u, cl_mem out_v,
|
|
int out_width, int out_height,
|
|
mat3 projection) {
|
|
int err = 0;
|
|
const int zero = 0;
|
|
|
|
// sampled using pixel center origin
|
|
// (because thats how fastcv and opencv does it)
|
|
|
|
mat3 projection_y = projection;
|
|
|
|
// in and out uv is half the size of y.
|
|
mat3 projection_uv = transform_scale_buffer(projection, 0.5);
|
|
|
|
err = clEnqueueWriteBuffer(q, s->m_y_cl, CL_TRUE, 0, 3*3*sizeof(float), (void*)projection_y.v, 0, NULL, NULL);
|
|
assert(err == 0);
|
|
err = clEnqueueWriteBuffer(q, s->m_uv_cl, CL_TRUE, 0, 3*3*sizeof(float), (void*)projection_uv.v, 0, NULL, NULL);
|
|
assert(err == 0);
|
|
|
|
const int in_y_width = in_width;
|
|
const int in_y_height = in_height;
|
|
const int in_uv_width = in_width/2;
|
|
const int in_uv_height = in_height/2;
|
|
const int in_y_offset = 0;
|
|
const int in_u_offset = in_y_offset + in_y_width*in_y_height;
|
|
const int in_v_offset = in_u_offset + in_uv_width*in_uv_height;
|
|
|
|
const int out_y_width = out_width;
|
|
const int out_y_height = out_height;
|
|
const int out_uv_width = out_width/2;
|
|
const int out_uv_height = out_height/2;
|
|
|
|
err = clSetKernelArg(s->krnl, 0, sizeof(cl_mem), &in_yuv);
|
|
assert(err == 0);
|
|
|
|
err = clSetKernelArg(s->krnl, 1, sizeof(cl_int), &in_y_width);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 2, sizeof(cl_int), &in_y_offset);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 3, sizeof(cl_int), &in_y_height);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 4, sizeof(cl_int), &in_y_width);
|
|
assert(err == 0);
|
|
|
|
err = clSetKernelArg(s->krnl, 5, sizeof(cl_mem), &out_y);
|
|
assert(err == 0);
|
|
|
|
err = clSetKernelArg(s->krnl, 6, sizeof(cl_int), &out_y_width);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 7, sizeof(cl_int), &zero);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 8, sizeof(cl_int), &out_y_height);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 9, sizeof(cl_int), &out_y_width);
|
|
assert(err == 0);
|
|
|
|
err = clSetKernelArg(s->krnl, 10, sizeof(cl_mem), &s->m_y_cl);
|
|
assert(err == 0);
|
|
|
|
const size_t work_size_y[2] = {(size_t)out_y_width, (size_t)out_y_height};
|
|
|
|
err = clEnqueueNDRangeKernel(q, s->krnl, 2, NULL,
|
|
(const size_t*)&work_size_y, NULL, 0, 0, NULL);
|
|
assert(err == 0);
|
|
|
|
|
|
const size_t work_size_uv[2] = {(size_t)out_uv_width, (size_t)out_uv_height};
|
|
|
|
err = clSetKernelArg(s->krnl, 1, sizeof(cl_int), &in_uv_width);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 2, sizeof(cl_int), &in_u_offset);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 3, sizeof(cl_int), &in_uv_height);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 4, sizeof(cl_int), &in_uv_width);
|
|
assert(err == 0);
|
|
|
|
err = clSetKernelArg(s->krnl, 5, sizeof(cl_mem), &out_u);
|
|
assert(err == 0);
|
|
|
|
err = clSetKernelArg(s->krnl, 6, sizeof(cl_int), &out_uv_width);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 7, sizeof(cl_int), &zero);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 8, sizeof(cl_int), &out_uv_height);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 9, sizeof(cl_int), &out_uv_width);
|
|
assert(err == 0);
|
|
|
|
err = clSetKernelArg(s->krnl, 10, sizeof(cl_mem), &s->m_uv_cl);
|
|
assert(err == 0);
|
|
|
|
err = clEnqueueNDRangeKernel(q, s->krnl, 2, NULL,
|
|
(const size_t*)&work_size_uv, NULL, 0, 0, NULL);
|
|
assert(err == 0);
|
|
|
|
|
|
err = clSetKernelArg(s->krnl, 2, sizeof(cl_int), &in_v_offset);
|
|
assert(err == 0);
|
|
err = clSetKernelArg(s->krnl, 5, sizeof(cl_mem), &out_v);
|
|
assert(err == 0);
|
|
|
|
|
|
err = clEnqueueNDRangeKernel(q, s->krnl, 2, NULL,
|
|
(const size_t*)&work_size_uv, NULL, 0, 0, NULL);
|
|
assert(err == 0);
|
|
}
|