diff --git a/driver.cc b/driver.cc index 596ee1e..ab9f605 100644 --- a/driver.cc +++ b/driver.cc @@ -207,12 +207,11 @@ static void run_loop() } } + if (dc.cleanup) break; if (dc.next_bo) { gbm_surface_release_buffer(dc.gbm_surface, dc.bo); dc.bo = dc.next_bo; } - - if (dc.cleanup) break; } } @@ -451,15 +450,33 @@ static void cleanup() if (dc.vtfd > 0) close(dc.vtfd); + drmEventContext ev; + memset(&ev, 0, sizeof(ev)); + ev.version = DRM_EVENT_CONTEXT_VERSION; + ev.page_flip_handler = modeset_page_flip_event; + ev.vblank_handler = modeset_vblank_handler; + std::cerr << "wait for pending page-flip to complete..." << std::endl; + while (dc.pflip_pending) { + int ret = drmHandleEvent(dc.fd, &ev); + if (ret) + break; + } dc.action_mode->deinit(); eglDestroySurface(dc.display, dc.surface); eglDestroyContext(dc.display, dc.gl_context); eglTerminate(dc.display); + if (dc.bo) { + std::cerr << "destroy bo: " << (unsigned long)dc.bo << std::endl; + gbm_bo_destroy(dc.bo); + std::cerr << "destroy bo: " << (unsigned long)dc.next_bo << std::endl; + gbm_bo_destroy(dc.next_bo); + } gbm_surface_destroy(dc.gbm_surface); gbm_device_destroy(dc.gbm); + if (dc.pflip_pending) std::cerr << "still has pflip pending" << std::endl; if (dc.saved_crtc) { drmModeSetCrtc(dc.fd, dc.saved_crtc->crtc_id, dc.saved_crtc->buffer_id, dc.saved_crtc->x, dc.saved_crtc->y, &dc.conn, 1, &dc.saved_crtc->mode); diff --git a/initrd/prometheus.initrd_install b/initrd/prometheus.initrd_install index 62d4136..e300da5 100644 --- a/initrd/prometheus.initrd_install +++ b/initrd/prometheus.initrd_install @@ -1,23 +1,37 @@ #!/bin/bash +add_library_dir() { + local f= + add_dir "$1" + for f in "$1"/*; do + if [[ -L $f ]]; then + add_symlink "$f" "$(readlink -f "$f")" + elif [[ -e $f ]]; then + add_binary "$f" + fi + done +} + build() { add_file /usr/share/fonts/microsoft/msyh.ttf add_file /usr/lib/locale/locale-archive - add_binary /usr/lib/xorg/modules/dri/i915_dri.so - add_binary /usr/lib/xorg/modules/dri/i965_dri.so - add_binary /usr/lib/xorg/modules/dri/nouveau_dri.so - add_binary /usr/lib/xorg/modules/dri/nouveau_vieux_dri.so - add_binary /usr/lib/xorg/modules/dri/r200_dri.so - add_binary /usr/lib/xorg/modules/dri/r300_dri.so - add_binary /usr/lib/xorg/modules/dri/r600_dri.so - add_binary /usr/lib/xorg/modules/dri/radeon_dri.so - add_binary /usr/lib/xorg/modules/dri/radeonsi_dri.so - add_binary /usr/lib/xorg/modules/dri/swrast_dri.so - add_binary /usr/lib/xorg/modules/dri/vmwgfx_dri.so - - add_binary /usr/lib/egl/egl_gallium.so - add_binary /usr/lib/gbm/gbm_gallium_drm.so + add_library_dir /usr/lib/xorg/modules/dri + [ -e /usr/lib/egl ] && add_library_dir /usr/lib/egl + [ -e /usr/lib/gbm ] && add_library_dir /usr/lib/gbm + + # compatible with archlinux and iSoft Client OS + [ -e /usr/lib/mesa ] && add_library_dir /usr/lib/mesa + + if [ -L /usr/lib/libGLESv2.so.2.0.0 ]; then + add_symlink /usr/lib/libGLESv2.so.2.0.0 + add_symlink /usr/lib/libGLESv2.so.2 + fi + + if [ -L /usr/lib/libEGL.so.1.0.0 ]; then + add_symlink /usr/lib/libEGL.so.1.0.0 + add_symlink /usr/lib/libEGL.so.1 + fi add_binary /usr/sbin/prometheus add_binary /usr/sbin/prometheusd