Remove the callback facility from context node.
authorJustin McPherson <justin.mcpherson@nokia.com>
Fri, 17 Feb 2012 03:52:09 +0000 (13:52 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 21 Feb 2012 00:21:41 +0000 (01:21 +0100)
- It's not really necessary.
- It's probably a mis-use of QSGNode::preprocess()
  - Because it triggers a race between object deletion in the main thread
  and preprocess() in the render thread.

Change-Id: I51433f508db306aab53398f8c3d1d8c9d9e986fd
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>

src/quick/items/context2d/qquickcanvasitem.cpp
src/quick/items/context2d/qquickcanvasitemnode.cpp
src/quick/items/context2d/qquickcanvasitemnode_p.h

index 783fedf..7031294 100644 (file)
@@ -96,16 +96,6 @@ QQuickCanvasItemPrivate::~QQuickCanvasItemPrivate()
     qDeleteAll(images);
 }
 
-class QQuickCanvasItemCallback : public QQuickCanvasItemNode::Callback
-{
-public:
-    QQuickCanvasItemCallback(QQuickCanvasItemPrivate *d):item(d) {}
-    void process() const {
-        // on SG render thread
-        item->context->sync();
-    }
-    QQuickCanvasItemPrivate *item;
-};
 
 /*!
     \qmlclass Canvas QQuickCanvasItem
@@ -573,10 +563,11 @@ QSGNode *QQuickCanvasItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData
     QQuickCanvasItemNode *node = static_cast<QQuickCanvasItemNode*>(oldNode);
     if (!node) {
         node = new QQuickCanvasItemNode;
-        if (d->renderStrategy == QQuickCanvasItem::Cooperative)
-            node->setCallback(new QQuickCanvasItemCallback(d));
     }
 
+    if (d->renderStrategy == QQuickCanvasItem::Cooperative)
+        d->context->sync();
+
     node->setTexture(d->context->texture());
     node->setSize(d->canvasWindow.size());
     node->update();
index 307d571..b9347dd 100644 (file)
@@ -65,13 +65,6 @@ QQuickCanvasItemNode::~QQuickCanvasItemNode()
     delete m_texture;
 }
 
-// Must be called before this node is added to SG
-void QQuickCanvasItemNode::setCallback(QQuickCanvasItemNode::Callback *cb)
-{
-    m_cb = cb;
-    setFlag(UsePreprocess, true);
-}
-
 void QQuickCanvasItemNode::setSize(const QSizeF& size)
 {
     if (m_size != size) {
@@ -80,12 +73,6 @@ void QQuickCanvasItemNode::setSize(const QSizeF& size)
     }
 }
 
-void QQuickCanvasItemNode::preprocess()
-{
-    if (m_cb)
-        m_cb->process();
-}
-
 void QQuickCanvasItemNode::setTexture(QSGDynamicTexture* texture)
 {
     if (texture != m_texture) {
index bee2215..77181c6 100644 (file)
@@ -59,18 +59,11 @@ class QSGDynamicTexture;
 class QQuickCanvasItemNode : public QSGGeometryNode
 {
 public:
-    class Callback {
-    public:
-        virtual void process() const = 0;
-    };
-
     QQuickCanvasItemNode();
     ~QQuickCanvasItemNode();
 
-    void setCallback(Callback *cb);
     void setTexture(QSGDynamicTexture *texture);
     void update();
-    void preprocess();
     void setSize(const QSizeF& size);
 
 private:
@@ -85,7 +78,6 @@ private:
 
     bool m_dirtyGeometry;
     bool m_dirtyTexture;
-    Callback *m_cb;
 };
 
 QT_END_HEADER