Skip to content

Commit

Permalink
CameraView: sync pbo with glFence instead of calling glFinish (commaa…
Browse files Browse the repository at this point in the history
…i#23293)

* Sync pbo with fence

* use std::unique_ptr
  • Loading branch information
deanlee authored Jan 4, 2022
1 parent cd9813a commit 5dbdad3
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 15 deletions.
35 changes: 22 additions & 13 deletions selfdrive/ui/qt/widgets/cameraview.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -289,20 +295,23 @@ void CameraViewWidget::vipcThread() {
}

if (VisionBuf *buf = vipc_client->recv(nullptr, 1000)) {
if (!Hardware::EON()) {
void *texture_buffer = gl_buffer->map(QOpenGLBuffer::WriteOnly);
memcpy(texture_buffer, buf->addr, buf->len);
gl_buffer->unmap();

// copy pixels from PBO to texture object
glBindTexture(GL_TEXTURE_2D, texture[buf->idx]->frame_tex);
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();
{
std::lock_guard lk(lock);
if (!Hardware::EON()) {
void *texture_buffer = gl_buffer->map(QOpenGLBuffer::WriteOnly);
memcpy(texture_buffer, buf->addr, buf->len);
gl_buffer->unmap();

// copy pixels from PBO to texture object
glBindTexture(GL_TEXTURE_2D, texture[buf->idx]->frame_tex);
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);

wait_fence.reset(new WaitFence());
}
latest_texture_id = buf->idx;
}
latest_texture_id = buf->idx;
// Schedule update. update() will be invoked on the gui thread.
QMetaObject::invokeMethod(this, "update");

Expand Down
12 changes: 10 additions & 2 deletions selfdrive/ui/qt/widgets/cameraview.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,20 @@ class CameraViewWidget : public QOpenGLWidget, protected QOpenGLFunctions {
virtual void updateFrameMat(int w, int h);
void vipcThread();

struct WaitFence {
WaitFence() { sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); }
~WaitFence() { glDeleteSync(sync); }
void wait() { glWaitSync(sync, 0, GL_TIMEOUT_IGNORED); }
GLsync sync = 0;
};

bool zoomed_view;
std::atomic<int> latest_texture_id = -1;
std::mutex lock;
int latest_texture_id = -1;
GLuint frame_vao, frame_vbo, frame_ibo;
mat4 frame_mat;
std::unique_ptr<EGLImageTexture> texture[UI_BUF_COUNT];
std::unique_ptr<WaitFence> wait_fence;
std::unique_ptr<QOpenGLShaderProgram> program;
QColor bg = QColor("#000000");

Expand All @@ -50,7 +59,6 @@ class CameraViewWidget : public QOpenGLWidget, protected QOpenGLFunctions {
std::atomic<VisionStreamType> stream_type;
QThread *vipc_thread = nullptr;


protected slots:
void vipcConnected(VisionIpcClient *vipc_client);
};

0 comments on commit 5dbdad3

Please sign in to comment.