diff --git a/src/imports/qtcanvas3d/canvas3d.cpp b/src/imports/qtcanvas3d/canvas3d.cpp index f696c64de9f27e4b4c4eae352a2961d53f2437a0..0dd3d74b1a33e42f326bb3793aaba20c0504030d 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 63497b26d24b687fa253bce178a4e0c7ec667a78..00828699b6a3ab98d842a9eced52d3917575ffb9 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;