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