18QQnxRasterWindow::QQnxRasterWindow(QWindow *window, screen_context_t context,
bool needRootWindow) :
19 QQnxWindow(window, context, needRootWindow),
20 m_currentBufferIndex(-1),
21 m_previousBufferIndex(-1)
25 const int val = SCREEN_USAGE_NATIVE | SCREEN_USAGE_READ | SCREEN_USAGE_WRITE;
26 const int result = screen_set_window_property_iv(nativeHandle(), SCREEN_PROPERTY_USAGE, &val);
27 if (Q_UNLIKELY(result != 0))
28 qFatal(
"QQnxRasterWindow: failed to set window alpha usage, errno=%d", errno);
56 if (m_currentBufferIndex != -1 && !dirty.isEmpty()) {
57 qCDebug(lcQpaWindow) << Q_FUNC_INFO <<
"window = " << window();
58 QQnxBuffer ¤tBuffer = m_buffers[m_currentBufferIndex];
60#if defined(QQNX_INCREMENTAL_RASTER_UPDATE)
63 QRegion preserve = m_previousDirty - dirty - m_scrolled;
64 blitPreviousToCurrent(preserve, 0, 0);
67 QRegion modified = preserve + dirty + m_scrolled;
68 QRect rect = modified.boundingRect();
69 int dirtyRect[4] = { rect.x(), rect.y(), rect.x() + rect.width(), rect.y() + rect.height() };
73 screen_post_window(nativeHandle(), currentBuffer.nativeBuffer(), 1, dirtyRect, 0),
74 "Failed to post window");
78 screen_post_window(nativeHandle(), currentBuffer.nativeBuffer(), 0, NULL, 0),
79 "Failed to post window");
83 m_previousBufferIndex = m_currentBufferIndex++;
85 m_currentBufferIndex = 0;
88 m_previousDirty = QRect(QPoint(0, 0), QHighDpi::toNativePixels(window()->size(), window()));
89 m_scrolled = QRegion();
104 qCDebug(lcQpaWindow) << Q_FUNC_INFO <<
"window = " << window();
107 if (m_currentBufferIndex == -1) {
108 auto platformScreen =
static_cast<QQnxScreen *>(screen());
111 const int result = screen_get_window_property_pv(nativeHandle(), SCREEN_PROPERTY_RENDER_BUFFERS,
117 m_buffers[i] = QQnxBuffer(buffers[i]);
120 int bg[] = { SCREEN_BLIT_COLOR, 0x00000000, SCREEN_BLIT_END };
122 "Failed to clear window buffer");
126 "Failed to flush blits");
129 m_currentBufferIndex = 0;
130 m_previousBufferIndex = -1;
133 return m_buffers[m_currentBufferIndex];
169 qCDebug(lcQpaWindow) << Q_FUNC_INFO <<
"window = " << window();
172 if (m_previousBufferIndex == -1 || region.isEmpty())
175 QQnxBuffer ¤tBuffer = m_buffers[m_currentBufferIndex];
176 QQnxBuffer &previousBuffer = m_buffers[m_previousBufferIndex];
179 for (
auto rit = region.rbegin(), rend = region.rend(); rit != rend; ++rit) {
181 const QRect rect = rit->intersected(currentBuffer.rect());
187 int attribs[] = { SCREEN_BLIT_SOURCE_X, rect.x(),
188 SCREEN_BLIT_SOURCE_Y, rect.y(),
189 SCREEN_BLIT_SOURCE_WIDTH, rect.width(),
190 SCREEN_BLIT_SOURCE_HEIGHT, rect.height(),
191 SCREEN_BLIT_DESTINATION_X, rect.x() + dx,
192 SCREEN_BLIT_DESTINATION_Y, rect.y() + dy,
193 SCREEN_BLIT_DESTINATION_WIDTH, rect.width(),
194 SCREEN_BLIT_DESTINATION_HEIGHT, rect.height(),
199 previousBuffer.nativeBuffer(), attribs),
200 "Failed to blit buffers");
207 "Failed to flush blits");