summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Hoosier <matt.hoosier@garmin.com>2013-11-20 09:38:01 -0600
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-16 19:29:52 +0100
commite40cefff941444ecea0757c409a3c14e9af96982 (patch)
tree04b3d9893f867b6b1812387a18560d35fbed921c
parentec07cdc91e945cae56932049744799e9a6034843 (diff)
QNX: avoid composition when possible
Window buffers are currently always created with an alpha channel when the underlying display supports them. This is the correct thing to to in order to support translucency. However, the cost is that the composition manager unconditionally performs blending even when the use-case in the GUI doesn't make use of it. That is rather expensive, particularly on hardware which doesn't have extremely efficient dedicated 2D blitting hardware. This patch adds inspection of the user's requested window format and--if no blending is desired--sets an additional Screen window property which permits Screen to skip blending on the window surface. Change-Id: I83c100a351a00ef0e8bea1b1d1fec10b7218d1de Reviewed-by: Kevin Krammer <kevin.krammer@kdab.com> Reviewed-by: Bernd Weimer <bweimer@blackberry.com> Reviewed-by: Andreas Holzammer <andreas.holzammer@kdab.com> Reviewed-by: Frank Osterfeld <frank.osterfeld@kdab.com> Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
-rw-r--r--src/plugins/platforms/qnx/qqnxwindow.cpp31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/plugins/platforms/qnx/qqnxwindow.cpp b/src/plugins/platforms/qnx/qqnxwindow.cpp
index b25c0b5b29..99071cf4f2 100644
--- a/src/plugins/platforms/qnx/qqnxwindow.cpp
+++ b/src/plugins/platforms/qnx/qqnxwindow.cpp
@@ -323,6 +323,26 @@ void QQnxWindow::setBufferSize(const QSize &size)
}
}
+ // Set the transparency. According to QNX technical support, setting the window
+ // transparency property should always be done *after* creating the window
+ // buffers in order to guarantee the property is paid attention to.
+ if (window()->requestedFormat().alphaBufferSize() == 0) {
+ // To avoid overhead in the composition manager, disable blending
+ // when the underlying window buffer doesn't have an alpha channel.
+ val[0] = SCREEN_TRANSPARENCY_NONE;
+ } else {
+ // Normal alpha blending. This doesn't commit us to translucency; the
+ // normal backfill during the painting will contain a fully opaque
+ // alpha channel unless the user explicitly intervenes to make something
+ // transparent.
+ val[0] = SCREEN_TRANSPARENCY_SOURCE_OVER;
+ }
+
+ errno = 0;
+ result = screen_set_window_property_iv(m_window, SCREEN_PROPERTY_TRANSPARENCY, val);
+ if (result != 0)
+ qFatal("QQnxWindow: failed to set window transparency, errno=%d", errno);
+
// Cache new buffer size
m_bufferSize = nonEmptySize;
resetBuffers();
@@ -564,17 +584,6 @@ void QQnxWindow::initWindow()
if (result != 0)
qFatal("QQnxWindow: failed to set window alpha mode, errno=%d", errno);
- // Blend the window with Source Over Porter-Duff behavior onto whatever's
- // behind it.
- //
- // If the desired use-case is opaque, the Widget painting framework will
- // already fill in the alpha channel with full opacity.
- errno = 0;
- val = SCREEN_TRANSPARENCY_SOURCE_OVER;
- result = screen_set_window_property_iv(m_window, SCREEN_PROPERTY_TRANSPARENCY, &val);
- if (result != 0)
- qFatal("QQnxWindow: failed to set window transparency, errno=%d", errno);
-
// Set the window swap interval
errno = 0;
val = 1;