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>
This commit is contained in:
Matt Hoosier 2013-11-20 09:38:01 -06:00 committed by The Qt Project
parent ec07cdc91e
commit e40cefff94

View File

@ -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 // Cache new buffer size
m_bufferSize = nonEmptySize; m_bufferSize = nonEmptySize;
resetBuffers(); resetBuffers();
@ -564,17 +584,6 @@ void QQnxWindow::initWindow()
if (result != 0) if (result != 0)
qFatal("QQnxWindow: failed to set window alpha mode, errno=%d", errno); 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 // Set the window swap interval
errno = 0; errno = 0;
val = 1; val = 1;