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