From 54015bb56d52dc3da8adafa501479fa8156c66c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pasi=20Ker=C3=A4nen?= <pasi.keranen@digia.com> Date: Mon, 27 Apr 2015 08:37:44 +0300 Subject: [PATCH] Fixed signaling of pixel size change. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pixel size change was not signalled upon start causing HiDPI displays to show incorrect rendering. Also fixed the signalling to occur when correct OpenGL context has been made current. Change-Id: I69b5e64d3641c81c98880fbe047d71930cc5a16c Task-number: QTBUG-45692 Reviewed-by: Tomi Korpipää <tomi.korpipaa@theqtcompany.com> Reviewed-by: Pasi Keränen <pasi.keranen@digia.com> --- src/imports/qtcanvas3d/canvas3d.cpp | 34 ++++++++++++++--------------- src/imports/qtcanvas3d/canvas3d_p.h | 3 ++- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/imports/qtcanvas3d/canvas3d.cpp b/src/imports/qtcanvas3d/canvas3d.cpp index f696c64..0dd3d74 100644 --- a/src/imports/qtcanvas3d/canvas3d.cpp +++ b/src/imports/qtcanvas3d/canvas3d.cpp @@ -99,6 +99,7 @@ Canvas::Canvas(QQuickItem *parent): m_isOpenGLES2(false), m_isSoftwareRendered(false), m_isContextAttribsSet(false), + m_resizeGLQueued(false), m_antialiasFbo(0), m_renderFbo(0), m_displayFbo(0), @@ -107,8 +108,8 @@ Canvas::Canvas(QQuickItem *parent): { connect(this, &QQuickItem::windowChanged, this, &Canvas::handleWindowChanged); connect(this, &Canvas::needRender, this, &Canvas::renderNext, Qt::QueuedConnection); - connect(this, &QQuickItem::widthChanged, this, &Canvas::emitResizeGL, Qt::DirectConnection); - connect(this, &QQuickItem::heightChanged, this, &Canvas::emitResizeGL, Qt::DirectConnection); + connect(this, &QQuickItem::widthChanged, this, &Canvas::queueResizeGL, Qt::DirectConnection); + connect(this, &QQuickItem::heightChanged, this, &Canvas::queueResizeGL, Qt::DirectConnection); setAntialiasing(false); // Set contents to false in case we are in qml designer to make component look nice @@ -490,7 +491,9 @@ void Canvas::setPixelSize(QSize pixelSize) m_fboSize = pixelSize; createFBOs(); - emit pixelSizeChanged(pixelSize); + + // Queue the pixel size signal to next repaint cycle and queue repaint + queueResizeGL(); emitNeedRender(); } @@ -648,7 +651,7 @@ void Canvas::updateWindowParameters() if (pixelRatio != m_devicePixelRatio) { m_devicePixelRatio = pixelRatio; emit devicePixelRatioChanged(pixelRatio); - emitResizeGL(); + queueResizeGL(); win->update(); } } @@ -862,6 +865,14 @@ void Canvas::renderNext() // Bind the correct render target FBO bindCurrentRenderTarget(); + // Signal changes in pixel size + if (m_resizeGLQueued) { + qCDebug(canvas3drendering).nospace() << "Canvas3D::" << __FUNCTION__ + << " Emit resizeGL() signal"; + emit resizeGL(int(width()), int(height()), m_devicePixelRatio); + m_resizeGLQueued = false; + } + // Ensure we have correct clip rect set in the context QRect viewport = m_context3D->glViewportRect(); glViewport(viewport.x(), viewport.y(), viewport.width(), viewport.height()); @@ -948,22 +959,11 @@ void Canvas::renderNext() /*! * \internal */ -void Canvas::emitResizeGL() +void Canvas::queueResizeGL() { qCDebug(canvas3drendering).nospace() << "Canvas3D::" << __FUNCTION__ << "()"; - // Wait until render node has been created - if (!m_renderNodeReady) { - qCDebug(canvas3drendering).nospace() << "Canvas3D::" << __FUNCTION__ - << " Render node not ready, returning"; - return; - } - - if (m_glContext) { - qCDebug(canvas3drendering).nospace() << "Canvas3D::" << __FUNCTION__ - << " Emit resizeGL() signal"; - emit resizeGL(int(width()), int(height()), m_devicePixelRatio); - } + m_resizeGLQueued = true; } /*! diff --git a/src/imports/qtcanvas3d/canvas3d_p.h b/src/imports/qtcanvas3d/canvas3d_p.h index 63497b2..0082869 100644 --- a/src/imports/qtcanvas3d/canvas3d_p.h +++ b/src/imports/qtcanvas3d/canvas3d_p.h @@ -111,7 +111,7 @@ public slots: void ready(); void shutDown(); void renderNext(); - void emitResizeGL(); + void queueResizeGL(); void emitNeedRender(); signals: @@ -161,6 +161,7 @@ private: bool m_runningInDesigner; CanvasContextAttributes m_contextAttribs; bool m_isContextAttribsSet; + bool m_resizeGLQueued; QOpenGLFramebufferObject *m_antialiasFbo; QOpenGLFramebufferObject *m_renderFbo; -- GitLab