Skip to content

Commit 2618d85

Browse files
committed
cabana: replace Qt shader program wrapper
1 parent b87d107 commit 2618d85

3 files changed

Lines changed: 77 additions & 23 deletions

File tree

openpilot/tools/cabana/cameraview.cc

Lines changed: 73 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -67,21 +67,71 @@ CameraWidget::~CameraWidget() {
6767
glDeleteBuffers(1, &frame_vbo);
6868
glDeleteBuffers(1, &frame_ibo);
6969
glDeleteTextures(2, textures);
70-
shader_program_.reset();
70+
glDeleteProgram(shader_program);
7171
}
7272
doneCurrent();
7373
}
7474

7575
void CameraWidget::initializeGL() {
7676
initializeOpenGLFunctions();
77+
glDeleteProgram(shader_program);
78+
shader_program = 0;
79+
transform_uniform = -1;
80+
81+
auto compile_shader = [this](GLenum type, const char *source) {
82+
GLuint shader = glCreateShader(type);
83+
glShaderSource(shader, 1, &source, nullptr);
84+
glCompileShader(shader);
85+
86+
GLint success = GL_FALSE;
87+
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
88+
if (success != GL_TRUE) {
89+
char log[1024] = {};
90+
glGetShaderInfoLog(shader, sizeof(log), nullptr, log);
91+
fprintf(stderr, "failed to compile camera shader: %s\n", log);
92+
glDeleteShader(shader);
93+
return GLuint{0};
94+
}
95+
return shader;
96+
};
97+
98+
const GLuint vertex_shader = compile_shader(GL_VERTEX_SHADER, frame_vertex_shader);
99+
const GLuint fragment_shader = compile_shader(GL_FRAGMENT_SHADER, frame_fragment_shader);
100+
if (vertex_shader == 0 || fragment_shader == 0) {
101+
glDeleteShader(vertex_shader);
102+
glDeleteShader(fragment_shader);
103+
return;
104+
}
77105

78-
shader_program_ = std::make_unique<QOpenGLShaderProgram>(context());
79-
shader_program_->addShaderFromSourceCode(QOpenGLShader::Vertex, frame_vertex_shader);
80-
shader_program_->addShaderFromSourceCode(QOpenGLShader::Fragment, frame_fragment_shader);
81-
shader_program_->link();
106+
shader_program = glCreateProgram();
107+
glAttachShader(shader_program, vertex_shader);
108+
glAttachShader(shader_program, fragment_shader);
109+
glLinkProgram(shader_program);
110+
glDeleteShader(vertex_shader);
111+
glDeleteShader(fragment_shader);
112+
113+
GLint success = GL_FALSE;
114+
glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
115+
if (success != GL_TRUE) {
116+
char log[1024] = {};
117+
glGetProgramInfoLog(shader_program, sizeof(log), nullptr, log);
118+
fprintf(stderr, "failed to link camera shader program: %s\n", log);
119+
glDeleteProgram(shader_program);
120+
shader_program = 0;
121+
return;
122+
}
82123

83-
GLint frame_pos_loc = shader_program_->attributeLocation("aPosition");
84-
GLint frame_texcoord_loc = shader_program_->attributeLocation("aTexCoord");
124+
const GLint frame_pos_loc = glGetAttribLocation(shader_program, "aPosition");
125+
const GLint frame_texcoord_loc = glGetAttribLocation(shader_program, "aTexCoord");
126+
transform_uniform = glGetUniformLocation(shader_program, "uTransform");
127+
const GLint texture_y_uniform = glGetUniformLocation(shader_program, "uTextureY");
128+
const GLint texture_uv_uniform = glGetUniformLocation(shader_program, "uTextureUV");
129+
if (frame_pos_loc < 0 || frame_texcoord_loc < 0 || transform_uniform < 0 || texture_y_uniform < 0 || texture_uv_uniform < 0) {
130+
fprintf(stderr, "failed to find camera shader attributes or uniforms\n");
131+
glDeleteProgram(shader_program);
132+
shader_program = 0;
133+
return;
134+
}
85135

86136
auto [x1, x2, y1, y2] = requested_stream_type == VISION_STREAM_DRIVER ? std::tuple(0.f, 1.f, 1.f, 0.f) : std::tuple(1.f, 0.f, 1.f, 0.f);
87137
const uint8_t frame_indicies[] = {0, 1, 2, 0, 2, 3};
@@ -111,10 +161,10 @@ void CameraWidget::initializeGL() {
111161

112162
glGenTextures(2, textures);
113163

114-
shader_program_->bind();
115-
shader_program_->setUniformValue("uTextureY", 0);
116-
shader_program_->setUniformValue("uTextureUV", 1);
117-
shader_program_->release();
164+
glUseProgram(shader_program);
165+
glUniform1i(texture_y_uniform, 0);
166+
glUniform1i(texture_uv_uniform, 1);
167+
glUseProgram(0);
118168
}
119169

120170
void CameraWidget::showEvent(QShowEvent *event) {
@@ -146,7 +196,7 @@ void CameraWidget::paintGL() {
146196
glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
147197

148198
std::lock_guard lk(frame_lock);
149-
if (!current_frame_) return;
199+
if (!current_frame_ || shader_program == 0) return;
150200

151201
// Scale for aspect ratio
152202
float widget_ratio = (float)width() / height();
@@ -156,10 +206,14 @@ void CameraWidget::paintGL() {
156206

157207
glViewport(0, 0, width() * devicePixelRatio(), height() * devicePixelRatio());
158208

159-
shader_program_->bind();
160-
QMatrix4x4 transform;
161-
transform.scale(scale_x, scale_y, 1.0f);
162-
shader_program_->setUniformValue("uTransform", transform);
209+
glUseProgram(shader_program);
210+
const GLfloat transform[] = {
211+
scale_x, 0.0f, 0.0f, 0.0f,
212+
0.0f, scale_y, 0.0f, 0.0f,
213+
0.0f, 0.0f, 1.0f, 0.0f,
214+
0.0f, 0.0f, 0.0f, 1.0f,
215+
};
216+
glUniformMatrix4fv(transform_uniform, 1, GL_FALSE, transform);
163217

164218
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
165219

@@ -185,11 +239,13 @@ void CameraWidget::paintGL() {
185239
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
186240
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
187241

188-
shader_program_->release();
242+
glUseProgram(0);
189243
}
190244

191245
void CameraWidget::vipcConnected(VisionIpcClient *vipc_client) {
192246
makeCurrent();
247+
if (shader_program == 0) return;
248+
193249
stream_width = vipc_client->buffers[0].width;
194250
stream_height = vipc_client->buffers[0].height;
195251
stream_stride = vipc_client->buffers[0].stride;

openpilot/tools/cabana/cameraview.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
#pragma once
22

3-
#include <memory>
43
#include <mutex>
54
#include <set>
65
#include <string>
76
#include <utility>
87

98
#include <QOpenGLFunctions>
10-
#include <QOpenGLShaderProgram>
119
#include <QOpenGLWidget>
1210
#include <QThread>
1311

@@ -38,9 +36,10 @@ class CameraWidget : public QOpenGLWidget, protected QOpenGLFunctions {
3836
void vipcThread();
3937
void clearFrames();
4038

41-
GLuint frame_vao, frame_vbo, frame_ibo;
42-
GLuint textures[2];
43-
std::unique_ptr<QOpenGLShaderProgram> shader_program_;
39+
GLuint frame_vao = 0, frame_vbo = 0, frame_ibo = 0;
40+
GLuint textures[2] = {};
41+
GLuint shader_program = 0;
42+
GLint transform_uniform = -1;
4443
QColor bg = Qt::black;
4544

4645
std::string stream_name;

openpilot/tools/cabana/deqt.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,5 @@ some rules
6464
- `QLegend`, `QLegendMarker`
6565
- `QGraphicsPixmapItem`, `QGraphicsProxyWidget`
6666
- `QOpenGLWidget`, `QOpenGLFunctions`
67-
- `QOpenGLShader`, `QOpenGLShaderProgram`
6867
- `QMatrix4x4`, `QSurfaceFormat`
6968
- `QUndoCommand`, `QUndoStack`, `QUndoView`

0 commit comments

Comments
 (0)