17QQnxRasterWindow::QQnxRasterWindow(QWindow *window, screen_context_t context,
bool needRootWindow) :
18 QQnxWindow(window, context, needRootWindow),
19 m_currentBufferIndex(-1),
20 m_previousBufferIndex(-1)
24 const int val = SCREEN_USAGE_NATIVE | SCREEN_USAGE_READ | SCREEN_USAGE_WRITE;
25 const int result = screen_set_window_property_iv(nativeHandle(), SCREEN_PROPERTY_USAGE, &val);
26 if (Q_UNLIKELY(result != 0))
27 qFatal(
"QQnxRasterWindow: failed to set window alpha usage, errno=%d", errno);
55 if (m_currentBufferIndex != -1 && !dirty.isEmpty()) {
56 qCDebug(lcQpaWindow) << Q_FUNC_INFO <<
"window = " << window();
57 QQnxBuffer ¤tBuffer = m_buffers[m_currentBufferIndex];
59#if defined(QQNX_INCREMENTAL_RASTER_UPDATE)
62 QRegion preserve = m_previousDirty - dirty - m_scrolled;
63 blitPreviousToCurrent(preserve, 0, 0);
66 QRegion modified = preserve + dirty + m_scrolled;
67 QRect rect = modified.boundingRect();
68 int dirtyRect[4] = { rect.x(), rect.y(), rect.x() + rect.width(), rect.y() + rect.height() };
72 screen_post_window(nativeHandle(), currentBuffer.nativeBuffer(), 1, dirtyRect, 0),
73 "Failed to post window");
77 screen_post_window(nativeHandle(), currentBuffer.nativeBuffer(), 0, NULL, 0),
78 "Failed to post window");
82 m_previousBufferIndex = m_currentBufferIndex++;
84 m_currentBufferIndex = 0;
87 m_previousDirty = QRect(QPoint(0, 0), QHighDpi::toNativePixels(window()->size(), window()));
88 m_scrolled = QRegion();
103 qCDebug(lcQpaWindow) << Q_FUNC_INFO <<
"window = " << window();
106 if (m_currentBufferIndex == -1) {
107 auto platformScreen =
static_cast<QQnxScreen *>(screen());
110 const int result = screen_get_window_property_pv(nativeHandle(), SCREEN_PROPERTY_RENDER_BUFFERS,
116 m_buffers[i] = QQnxBuffer(buffers[i]);
119 int bg[] = { SCREEN_BLIT_COLOR, 0x00000000, SCREEN_BLIT_END };
121 "Failed to clear window buffer");
125 "Failed to flush blits");
128 m_currentBufferIndex = 0;
129 m_previousBufferIndex = -1;
132 return m_buffers[m_currentBufferIndex];
165 qCDebug(lcQpaWindow) << Q_FUNC_INFO <<
"window = " << window();
168 if (m_previousBufferIndex == -1 || region.isEmpty())
171 QQnxBuffer ¤tBuffer = m_buffers[m_currentBufferIndex];
172 QQnxBuffer &previousBuffer = m_buffers[m_previousBufferIndex];
175 for (
auto rit = region.rbegin(), rend = region.rend(); rit != rend; ++rit) {
177 const QRect rect = rit->intersected(currentBuffer.rect());
183 int attribs[] = { SCREEN_BLIT_SOURCE_X, rect.x(),
184 SCREEN_BLIT_SOURCE_Y, rect.y(),
185 SCREEN_BLIT_SOURCE_WIDTH, rect.width(),
186 SCREEN_BLIT_SOURCE_HEIGHT, rect.height(),
187 SCREEN_BLIT_DESTINATION_X, rect.x() + dx,
188 SCREEN_BLIT_DESTINATION_Y, rect.y() + dy,
189 SCREEN_BLIT_DESTINATION_WIDTH, rect.width(),
190 SCREEN_BLIT_DESTINATION_HEIGHT, rect.height(),
195 previousBuffer.nativeBuffer(), attribs),
196 "Failed to blit buffers");
203 "Failed to flush blits");
206 currentBuffer.invalidateInCache();