@@ -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
7575void 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
120170void 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
191245void 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 ;
0 commit comments