Рендеринг DRM GBM OpenGL с мерцанием R-PI 4

#c #raspberry-pi #raspberry-pi4 #egl

#c #raspberry-pi #raspberry-pi4 #egl

Вопрос:

Я использую GBM, DRM и EGL для рендеринга моей сцены на HDMI-дисплее на моем R-PI 4B. X-сервер не установлен, и R-PI загружается в текстовый режим перед запуском моего приложения.

Первая моя проблема: я замечаю много мерцания на протяжении всего моего рендеринга. Пока я не делаю много рендеринга, я рендерю множество текстовых элементов и текстуру, и я вижу, как они мерцают на моем фоне без каких-либо изменений текстуры или других отображаемых элементов.

Я прикрепил видео здесь:

https://streamable.com/0pq3d0

На видео это кажется не таким уж плохим, но невооруженным глазом мерцание ужасно (черные вспышки).

На данный момент я предполагаю, что это как-то связано с тем, как я выполняю свой 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, amp;fb);
        drmModeSetCrtc(_device, _crtc->crtc_id, fb, 0, 0, amp;_connector_id, 1, amp;_mode);

        if (_previous_bo) {
            drmModeRmFB(_device, _previous_fb);
            gbm_surface_release_buffer(_gbm_surface, _previous_bo);
        }

        _previous_bo = bo;
        _previous_fb = fb;
    }
 

Кажется, что для рендеринга используется только один буфер. Я действительно не понимаю методы DRM и GBM, поэтому я предполагаю, что я делаю что-то не так. Любые указатели будут оценены.

Комментарии:

1. к вашему сведению: я также пытался удалить весь блок из auto sync... until eglDestroySyncKHR , никакой разницы

Ответ №1:

На самом деле это, по-видимому, не было связано с моим кодом и проблемой R-PI / driver. Тем не менее, следующее изменение /boot/config.txt сделало свое дело:

 # dtoverlay=vc4-fkms-v3d
dtoverlay=vc4-kms-v3d-pi4
 

Прокомментированная строка (с fkms) была до, а другая строка была после. Я предполагаю, что для его работы вам также необходимо скомпилировать последние библиотеки Mesa, которые я все равно делал раньше. Теперь никакого мерцания!