DRM + GBM OpenGL 渲染闪烁 R-PI 4
DRM + GBM OpenGL rendering flickering R-PI 4
我正在使用 GBM、DRM 和 EGL 将我的场景渲染到我的 R-PI 4B 上的 HDMI 显示器。没有安装 X 服务器,R-PI 在启动我的应用程序之前启动到文本模式。
首先是我的问题:我注意到整个渲染过程中有很多闪烁。到目前为止,我渲染的不多,我渲染了一堆文本元素和纹理,我可以看到它在我的背景中闪烁,而没有对纹理或渲染的其他元素进行任何更改。
我在这里附上了一段视频:
视频里好像没那么糟糕,但肉眼闪烁就很恐怖了(黑闪)。
目前我认为这与我如何进行 end_frame
渲染有关:
void graphics_device_drm::end_frame() {
auto sync = eglCreateSyncKHR(_display, EGL_SYNC_FENCE_KHR, nullptr);
glFlush();
eglClientWaitSyncKHR(_display, sync, 0, EGL_FOREVER_KHR);
eglDestroySyncKHR(_display, sync);
eglSwapBuffers(_display, _surface);
auto bo = gbm_surface_lock_front_buffer(_gbm_surface);
const auto handle = gbm_bo_get_handle(bo).u32;
const auto pitch = gbm_bo_get_stride(bo);
uint32_t fb;
drmModeAddFB(_device, _width, _height, 24, 32, pitch, handle, &fb);
drmModeSetCrtc(_device, _crtc->crtc_id, fb, 0, 0, &_connector_id, 1, &_mode);
if (_previous_bo) {
drmModeRmFB(_device, _previous_fb);
gbm_surface_release_buffer(_gbm_surface, _previous_bo);
}
_previous_bo = bo;
_previous_fb = fb;
}
它似乎只使用一个缓冲区进行渲染。我不太了解 DRM 和 GBM 方法,所以我认为我在那里做错了什么。任何指针将不胜感激。
事实上,它显然与我的代码和 R-PI/driver 问题无关。然而,/boot/config.txt
中的以下更改起到了作用:
# dtoverlay=vc4-fkms-v3d
dtoverlay=vc4-kms-v3d-pi4
注释行(带有 fkms)在之前,另一行在之后。我假设要让它工作,你还需要编译最新的 Mesa 库,我以前做过。现在没有任何闪烁!
我正在使用 GBM、DRM 和 EGL 将我的场景渲染到我的 R-PI 4B 上的 HDMI 显示器。没有安装 X 服务器,R-PI 在启动我的应用程序之前启动到文本模式。
首先是我的问题:我注意到整个渲染过程中有很多闪烁。到目前为止,我渲染的不多,我渲染了一堆文本元素和纹理,我可以看到它在我的背景中闪烁,而没有对纹理或渲染的其他元素进行任何更改。
我在这里附上了一段视频:
视频里好像没那么糟糕,但肉眼闪烁就很恐怖了(黑闪)。
目前我认为这与我如何进行 end_frame
渲染有关:
void graphics_device_drm::end_frame() {
auto sync = eglCreateSyncKHR(_display, EGL_SYNC_FENCE_KHR, nullptr);
glFlush();
eglClientWaitSyncKHR(_display, sync, 0, EGL_FOREVER_KHR);
eglDestroySyncKHR(_display, sync);
eglSwapBuffers(_display, _surface);
auto bo = gbm_surface_lock_front_buffer(_gbm_surface);
const auto handle = gbm_bo_get_handle(bo).u32;
const auto pitch = gbm_bo_get_stride(bo);
uint32_t fb;
drmModeAddFB(_device, _width, _height, 24, 32, pitch, handle, &fb);
drmModeSetCrtc(_device, _crtc->crtc_id, fb, 0, 0, &_connector_id, 1, &_mode);
if (_previous_bo) {
drmModeRmFB(_device, _previous_fb);
gbm_surface_release_buffer(_gbm_surface, _previous_bo);
}
_previous_bo = bo;
_previous_fb = fb;
}
它似乎只使用一个缓冲区进行渲染。我不太了解 DRM 和 GBM 方法,所以我认为我在那里做错了什么。任何指针将不胜感激。
事实上,它显然与我的代码和 R-PI/driver 问题无关。然而,/boot/config.txt
中的以下更改起到了作用:
# dtoverlay=vc4-fkms-v3d
dtoverlay=vc4-kms-v3d-pi4
注释行(带有 fkms)在之前,另一行在之后。我假设要让它工作,你还需要编译最新的 Mesa 库,我以前做过。现在没有任何闪烁!