mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-02-25 00:53:58 +08:00
CameraView: sync pbo with glFence instead of calling glFinish (#23293)
* Sync pbo with fence
* use std::unique_ptr
old-commit-hash: 5dbdad3276
This commit is contained in:
@@ -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,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();
|
||||
{
|
||||
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);
|
||||
// use glFinish to ensure that the texture has been uploaded.
|
||||
glFinish();
|
||||
// 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");
|
||||
|
||||
|
||||
@@ -36,11 +36,20 @@ protected:
|
||||
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");
|
||||
|
||||
@@ -50,7 +59,6 @@ protected:
|
||||
std::atomic<VisionStreamType> stream_type;
|
||||
QThread *vipc_thread = nullptr;
|
||||
|
||||
|
||||
protected slots:
|
||||
void vipcConnected(VisionIpcClient *vipc_client);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user