1From 87e926e7e26f96e04f0e28b588db7b50ebaa5c48 Mon Sep 17 00:00:00 2001 2From: Jeffy Chen <jeffy.chen@rock-chips.com> 3Date: Fri, 14 Aug 2020 14:28:31 +0800 4Subject: [PATCH 21/28] linuxfbdrm: Delay setMode to swapBuffers() 5 6To avoid blank screen during setup. 7 8Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 9--- 10 .../platforms/linuxfb/qlinuxfbdrmscreen.cpp | 29 ++++++++++--------- 11 1 file changed, 16 insertions(+), 13 deletions(-) 12 13diff --git a/src/plugins/platforms/linuxfb/qlinuxfbdrmscreen.cpp b/src/plugins/platforms/linuxfb/qlinuxfbdrmscreen.cpp 14index 5745ef06..b6e3960d 100644 15--- a/src/plugins/platforms/linuxfb/qlinuxfbdrmscreen.cpp 16+++ b/src/plugins/platforms/linuxfb/qlinuxfbdrmscreen.cpp 17@@ -102,8 +102,8 @@ public: 18 19 void createFramebuffers(); 20 void destroyFramebuffers(); 21- void setMode(); 22 23+ void setMode(Output *output); 24 void swapBuffers(Output *output); 25 void waitForFlip(Output *output); 26 27@@ -339,19 +339,21 @@ void QLinuxFbDevice::destroyFramebuffers() 28 } 29 } 30 31-void QLinuxFbDevice::setMode() 32+void QLinuxFbDevice::setMode(Output *output) 33 { 34- for (Output &output : m_outputs) { 35- drmModeModeInfo &modeInfo(output.kmsOutput.modes[output.kmsOutput.mode]); 36- if (drmModeSetCrtc(fd(), output.kmsOutput.crtc_id, output.fb[0].fb, 0, 0, 37- &output.kmsOutput.connector_id, 1, &modeInfo) == -1) { 38- qErrnoWarning(errno, "Failed to set mode"); 39- return; 40- } 41+ drmModeModeInfo &modeInfo(output->kmsOutput.modes[output->kmsOutput.mode]); 42+ 43+ if (output->kmsOutput.mode_set) 44+ return; 45 46- output.kmsOutput.mode_set = true; // have cleanup() to restore the mode 47- output.kmsOutput.setPowerState(this, QPlatformScreen::PowerStateOn); 48+ if (drmModeSetCrtc(fd(), output->kmsOutput.crtc_id, output->fb[0].fb, 0, 0, 49+ &output->kmsOutput.connector_id, 1, &modeInfo) == -1) { 50+ qErrnoWarning(errno, "Failed to set mode"); 51+ return; 52 } 53+ 54+ output->kmsOutput.mode_set = true; // have cleanup() to restore the mode 55+ output->kmsOutput.setPowerState(this, QPlatformScreen::PowerStateOn); 56 } 57 58 void QLinuxFbDevice::pageFlipHandler(int fd, unsigned int sequence, 59@@ -394,7 +396,10 @@ void QLinuxFbDevice::swapBuffers(Output *output) 60 waitForFlip(output); 61 #endif 62 63+ setMode(output); 64+ 65 Framebuffer &fb(output->fb[output->backFb]); 66+ 67 if (drmModePageFlip(fd(), output->kmsOutput.crtc_id, fb.fb, DRM_MODE_PAGE_FLIP_EVENT, output) == -1) { 68 qErrnoWarning(errno, "Page flip failed"); 69 return; 70@@ -443,8 +448,6 @@ bool QLinuxFbDrmScreen::initialize() 71 m_device->createScreens(); 72 // Now off to dumb buffer specifics. 73 m_device->createFramebuffers(); 74- // Do the modesetting. 75- m_device->setMode(); 76 77 QLinuxFbDevice::Output *output(m_device->output(0)); 78 79-- 802.20.1 81 82