From 364a6c091bcc12c5e08f0616d6fc29b5650e964c Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen <allan.jensen@qt.io> Date: Thu, 22 Mar 2018 13:34:10 +0100 Subject: [PATCH] Do not reuse render passes when we have dynamic 3D layers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit They can be clipped and culled based on visibility which is a property we do want to support changing. Task-number: QTBUG-67232 Change-Id: I6b670fd84d1e5c18283ea8f4ee1d8e81b94dcd57 Reviewed-by: Michael Brüning <michael.bruning@qt.io> --- src/core/delegated_frame_node.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp index 2ce1616af..83a39ba22 100644 --- a/src/core/delegated_frame_node.cpp +++ b/src/core/delegated_frame_node.cpp @@ -219,6 +219,7 @@ public: void setupRenderPassNode(QSGTexture *layer, const QRect &rect, QSGNode *) override { Q_ASSERT(layer); + Q_ASSERT(m_nodeIterator != m_sceneGraphNodes->end()); QSGInternalImageNode *imageNode = static_cast<QSGInternalImageNode*>(*m_nodeIterator++); imageNode->setTargetRect(rect); imageNode->setInnerTargetRect(rect); @@ -231,6 +232,7 @@ public: QSGTextureNode::TextureCoordinatesTransformMode texCoordTransForm, QSGNode *) override { + Q_ASSERT(m_nodeIterator != m_sceneGraphNodes->end()); QSGTextureNode *textureNode = static_cast<QSGTextureNode*>(*m_nodeIterator++); if (textureNode->texture() != texture) { textureNode->setTexture(texture); @@ -249,6 +251,7 @@ public: void setupTiledContentNode(QSGTexture *texture, const QRect &rect, const QRectF &sourceRect, QSGTexture::Filtering filtering, QSGNode *) override { + Q_ASSERT(m_nodeIterator != m_sceneGraphNodes->end()); QSGTextureNode *textureNode = static_cast<QSGTextureNode*>(*m_nodeIterator++); if (textureNode->texture() != texture) { textureNode->setTexture(texture); @@ -264,6 +267,7 @@ public: } void setupSolidColorNode(const QRect &rect, const QColor &color, QSGNode *) override { + Q_ASSERT(m_nodeIterator != m_sceneGraphNodes->end()); QSGRectangleNode *rectangleNode = static_cast<QSGRectangleNode*>(*m_nodeIterator++); if (rectangleNode->rect() != rect) @@ -275,6 +279,7 @@ public: void setupDebugBorderNode(QSGGeometry *geometry, QSGFlatColorMaterial *material, QSGNode *) override { + Q_ASSERT(m_nodeIterator != m_sceneGraphNodes->end()); QSGGeometryNode *geometryNode = static_cast<QSGGeometryNode*>(*m_nodeIterator++); geometryNode->setGeometry(geometry); @@ -754,6 +759,8 @@ void DelegatedFrameNode::preprocess() static bool areSharedQuadStatesEqual(const viz::SharedQuadState *layerState, const viz::SharedQuadState *prevLayerState) { + if (layerState->sorting_context_id != 0 || prevLayerState->sorting_context_id != 0) + return false; if (layerState->is_clipped != prevLayerState->is_clipped || layerState->clip_rect != prevLayerState->clip_rect) return false; @@ -791,8 +798,6 @@ static bool areRenderPassStructuresEqual(viz::CompositorFrame *frameData, for (; it != end && prevIt != prevEnd; ++it, ++prevIt) { const viz::DrawQuad *quad = *it; const viz::DrawQuad *prevQuad = *prevIt; - if (!areSharedQuadStatesEqual(quad->shared_quad_state, prevQuad->shared_quad_state)) - return false; if (quad->material != prevQuad->material) return false; #ifndef QT_NO_OPENGL @@ -803,7 +808,8 @@ static bool areRenderPassStructuresEqual(viz::CompositorFrame *frameData, return false; #endif // GL_OES_EGL_image_external #endif // QT_NO_OPENGL - + if (!areSharedQuadStatesEqual(quad->shared_quad_state, prevQuad->shared_quad_state)) + return false; } } return true; -- GitLab