@ -202,9 +202,15 @@ void CameraViewWidget::paintGL() {
glClearColor ( bg . redF ( ) , bg . greenF ( ) , bg . blueF ( ) , bg . alphaF ( ) ) ;
glClear ( GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT ) ;
std : : lock_guard lk ( lock ) ;
if ( latest_texture_id = = - 1 ) return ;
glViewport ( 0 , 0 , width ( ) , height ( ) ) ;
// sync with the PBO
if ( wait_fence ) {
wait_fence - > wait ( ) ;
}
glBindVertexArray ( frame_vao ) ;
glActiveTexture ( GL_TEXTURE0 ) ;
@ -289,6 +295,8 @@ void CameraViewWidget::vipcThread() {
}
if ( VisionBuf * buf = vipc_client - > recv ( nullptr , 1000 ) ) {
{
std : : lock_guard lk ( lock ) ;
if ( ! Hardware : : EON ( ) ) {
void * texture_buffer = gl_buffer - > map ( QOpenGLBuffer : : WriteOnly ) ;
@ -305,10 +313,15 @@ void CameraViewWidget::vipcThread() {
glTexSubImage2D ( GL_TEXTURE_2D , 0 , 0 , 0 , buf - > width , buf - > height , GL_RGB , GL_UNSIGNED_BYTE , 0 ) ;
glBindTexture ( GL_TEXTURE_2D , 0 ) ;
assert ( glGetError ( ) = = GL_NO_ERROR ) ;
// use glFinish to ensure that the texture has been uploaded.
glFinish ( ) ;
wait_fence . reset ( new WaitFence ( ) ) ;
// Ensure the fence is in the GPU command queue, or waiting on it might block
// https://www.khronos.org/opengl/wiki/Sync_Object#Flushing_and_contexts
glFlush ( ) ;
}
latest_texture_id = buf - > idx ;
}
// Schedule update. update() will be invoked on the gui thread.
QMetaObject : : invokeMethod ( this , " update " ) ;