15QQnxRasterWindow::QQnxRasterWindow(QWindow *window, screen_context_t context,
bool needRootWindow) :
16 QQnxWindow(window, context, needRootWindow),
17 m_currentBufferIndex(-1),
18 m_previousBufferIndex(-1)
22 const int val = SCREEN_USAGE_NATIVE | SCREEN_USAGE_READ | SCREEN_USAGE_WRITE;
23 const int result = screen_set_window_property_iv(nativeHandle(), SCREEN_PROPERTY_USAGE, &val);
24 if (Q_UNLIKELY(result != 0))
25 qFatal(
"QQnxRasterWindow: failed to set window alpha usage, errno=%d", errno);
53 if (m_currentBufferIndex != -1 && !dirty.isEmpty()) {
54 qCDebug(lcQpaWindow) << Q_FUNC_INFO <<
"window = " << window();
55 QQnxBuffer ¤tBuffer = m_buffers[m_currentBufferIndex];
57#if defined(QQNX_INCREMENTAL_RASTER_UPDATE)
60 QRegion preserve = m_previousDirty - dirty - m_scrolled;
61 blitPreviousToCurrent(preserve, 0, 0);
64 QRegion modified = preserve + dirty + m_scrolled;
65 QRect rect = modified.boundingRect();
66 int dirtyRect[4] = { rect.x(), rect.y(), rect.x() + rect.width(), rect.y() + rect.height() };
70 screen_post_window(nativeHandle(), currentBuffer.nativeBuffer(), 1, dirtyRect, 0),
71 "Failed to post window");
75 screen_post_window(nativeHandle(), currentBuffer.nativeBuffer(), 0, NULL, 0),
76 "Failed to post window");
80 m_previousBufferIndex = m_currentBufferIndex++;
82 m_currentBufferIndex = 0;
85 m_previousDirty = QRect(QPoint(0, 0), window()->size());
86 m_scrolled = QRegion();
101 qCDebug(lcQpaWindow) << Q_FUNC_INFO <<
"window = " << window();
104 if (m_currentBufferIndex == -1) {
105 auto platformScreen =
static_cast<QQnxScreen *>(screen());
108 const int result = screen_get_window_property_pv(nativeHandle(), SCREEN_PROPERTY_RENDER_BUFFERS,
114 m_buffers[i] = QQnxBuffer(buffers[i]);
117 int bg[] = { SCREEN_BLIT_COLOR, 0x00000000, SCREEN_BLIT_END };
119 "Failed to clear window buffer");
123 "Failed to flush blits");
126 m_currentBufferIndex = 0;
127 m_previousBufferIndex = -1;
130 return m_buffers[m_currentBufferIndex];
163 qCDebug(lcQpaWindow) << Q_FUNC_INFO <<
"window = " << window();
166 if (m_previousBufferIndex == -1 || region.isEmpty())
169 QQnxBuffer ¤tBuffer = m_buffers[m_currentBufferIndex];
170 QQnxBuffer &previousBuffer = m_buffers[m_previousBufferIndex];
173 for (
auto rit = region.rbegin(), rend = region.rend(); rit != rend; ++rit) {
175 const QRect rect = rit->intersected(currentBuffer.rect());
181 int attribs[] = { SCREEN_BLIT_SOURCE_X, rect.x(),
182 SCREEN_BLIT_SOURCE_Y, rect.y(),
183 SCREEN_BLIT_SOURCE_WIDTH, rect.width(),
184 SCREEN_BLIT_SOURCE_HEIGHT, rect.height(),
185 SCREEN_BLIT_DESTINATION_X, rect.x() + dx,
186 SCREEN_BLIT_DESTINATION_Y, rect.y() + dy,
187 SCREEN_BLIT_DESTINATION_WIDTH, rect.width(),
188 SCREEN_BLIT_DESTINATION_HEIGHT, rect.height(),
193 previousBuffer.nativeBuffer(), attribs),
194 "Failed to blit buffers");
201 "Failed to flush blits");
204 currentBuffer.invalidateInCache();