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