QNX: Query dynamic buffer count at runtime
authorRafael Roquetto <rafael.roquetto.qnx@kdab.com>
Wed, 24 Oct 2012 18:27:24 +0000 (16:27 -0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 26 Oct 2012 10:24:56 +0000 (12:24 +0200)
While unlikely, there are cases in which QQnxWindow::renderBuffer() is
called before the window buffers have been created. Without this check, the
program will abort on QQnxBuffer constructor, since the value that will be
passed to it will be of an invalid buffer.

Change-Id: I9ad5926dca856570032dcf10b6975e8f3364c284
Reviewed-by: Thomas McGuire <thomas.mcguire@kdab.com>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
src/plugins/platforms/qnx/qqnxrasterbackingstore.cpp
src/plugins/platforms/qnx/qqnxwindow.cpp

index b8ec91d..11babe3 100644 (file)
@@ -71,7 +71,10 @@ QQnxRasterBackingStore::~QQnxRasterBackingStore()
 
 QPaintDevice *QQnxRasterBackingStore::paintDevice()
 {
-    return m_platformWindow->renderBuffer().image();
+    if (m_platformWindow->hasBuffers())
+        return m_platformWindow->renderBuffer().image();
+
+    return 0;
 }
 
 void QQnxRasterBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
index 097b578..c668a88 100644 (file)
@@ -374,10 +374,22 @@ QQnxBuffer &QQnxWindow::renderBuffer()
 
     // Check if render buffer is invalid
     if (m_currentBufferIndex == -1) {
+        // check if there are any buffers available
+        int bufferCount = 0;
+        int result = screen_get_window_property_iv(m_window, SCREEN_PROPERTY_RENDER_BUFFER_COUNT, &bufferCount);
+
+        if (result != 0) {
+            qFatal("QQnxWindow: failed to query window buffer count, errno=%d", errno);
+        }
+
+        if (bufferCount != MAX_BUFFER_COUNT) {
+            qFatal("QQnxWindow: invalid buffer count. Expected = %d, got = %d", MAX_BUFFER_COUNT, bufferCount);
+        }
+
         // Get all buffers available for rendering
         errno = 0;
         screen_buffer_t buffers[MAX_BUFFER_COUNT];
-        int result = screen_get_window_property_pv(m_window, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)buffers);
+        result = screen_get_window_property_pv(m_window, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)buffers);
         if (result != 0) {
             qFatal("QQnxWindow: failed to query window buffers, errno=%d", errno);
         }