summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2016-06-23 16:41:14 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2016-06-28 09:32:13 +0000
commita6e6b2c7726e6d039a35858fa5706a2d69c434a0 (patch)
tree24eb7e10c0137263767327ab00cd6a4ddc6f0531
parent65885a1f1f3416a426fc78a8514839470d83bced (diff)
Set dummy surface for renderer
This works around the crash reporeted in QTBUG-54318. Using a dummy surface instead of the proper one appears to have no negative side effects, probably because we draw to offscreen FBO anyway. Change-Id: I54e8c467cac8a6cf403a7aab1da17ba2141f83b8 Reviewed-by: Titta Heikkala <titta.heikkala@qt.io>
-rw-r--r--editorlib/src/editorviewportitem.cpp28
-rw-r--r--editorlib/src/editorviewportitem.h4
2 files changed, 29 insertions, 3 deletions
diff --git a/editorlib/src/editorviewportitem.cpp b/editorlib/src/editorviewportitem.cpp
index ae1c025..b6582af 100644
--- a/editorlib/src/editorviewportitem.cpp
+++ b/editorlib/src/editorviewportitem.cpp
@@ -79,15 +79,19 @@ public:
Qt3DCore::QAspectEngine *aspectEngine,
Qt3DRender::QRenderAspect *renderAspect,
Qt3DInput::QInputAspect *inputAspect,
- Qt3DLogic::QLogicAspect *logicAspect)
+ Qt3DLogic::QLogicAspect *logicAspect,
+ QOffscreenSurface *surface)
: m_item(item)
, m_aspectEngine(aspectEngine)
, m_renderAspect(renderAspect)
, m_inputAspect(inputAspect)
, m_logicAspect(logicAspect)
+ , m_surface(surface)
{
ContextSaver saver;
- m_item->scene()->renderer()->setSurface(reinterpret_cast<QObject *>(saver.surface()));
+ // HACK: Use dummy surface for renderer to work around crash when running in creator
+ // TODO: Remove hack when QTBUG-54318 is fixed
+ m_item->scene()->renderer()->setSurface(reinterpret_cast<QObject *>(m_surface));
static_cast<Qt3DRender::QRenderAspectPrivate *>(
Qt3DRender::QRenderAspectPrivate::get(m_renderAspect))
->renderInitialize(saver.context());
@@ -134,6 +138,7 @@ public:
Qt3DRender::QRenderAspect *m_renderAspect;
Qt3DInput::QInputAspect *m_inputAspect;
Qt3DLogic::QLogicAspect *m_logicAspect;
+ QOffscreenSurface *m_surface;
};
EditorViewportItem::EditorViewportItem(QQuickItem *parent)
@@ -145,6 +150,7 @@ EditorViewportItem::EditorViewportItem(QQuickItem *parent)
, m_logicAspect(new Qt3DLogic::QLogicAspect)
, m_cameraController(nullptr)
, m_inputEnabled(true)
+ , m_surface(nullptr)
{
setFlag(ItemHasContents, true);
m_aspectEngine->registerAspect(m_renderAspect);
@@ -153,6 +159,8 @@ EditorViewportItem::EditorViewportItem(QQuickItem *parent)
setAcceptHoverEvents(true);
setAcceptedMouseButtons(Qt::AllButtons);
+
+ connect(this, &QQuickItem::windowChanged, this, &EditorViewportItem::handleWindowChanged);
}
EditorViewportItem::~EditorViewportItem()
@@ -161,6 +169,9 @@ EditorViewportItem::~EditorViewportItem()
static_cast<Qt3DRender::QRenderAspectPrivate *>
(Qt3DRender::QRenderAspectPrivate::get(m_renderAspect))->renderShutdown();
}
+
+ if (m_surface)
+ m_surface->deleteLater();
}
EditorScene *EditorViewportItem::scene() const
@@ -182,6 +193,17 @@ void EditorViewportItem::setInputEnabled(bool enable)
}
}
+void EditorViewportItem::handleWindowChanged(QQuickWindow *win)
+{
+ if (!m_surface && win) {
+ m_surface = new QOffscreenSurface;
+ QSurfaceFormat format = win->format();
+ format.setSamples(4);
+ m_surface->setFormat(format);
+ m_surface->create();
+ }
+}
+
void EditorViewportItem::setScene(EditorScene *scene)
{
if (m_scene == scene)
@@ -224,7 +246,7 @@ QQuickFramebufferObject::Renderer *EditorViewportItem::createRenderer() const
{
EditorViewportItem *self = const_cast<EditorViewportItem*>(this);
return new FrameBufferObjectRenderer(self, m_aspectEngine, m_renderAspect,
- m_inputAspect, m_logicAspect);
+ m_inputAspect, m_logicAspect, m_surface);
}
QSGNode *EditorViewportItem::updatePaintNode(QSGNode *node,
diff --git a/editorlib/src/editorviewportitem.h b/editorlib/src/editorviewportitem.h
index 43c7c88..7c31f93 100644
--- a/editorlib/src/editorviewportitem.h
+++ b/editorlib/src/editorviewportitem.h
@@ -33,6 +33,8 @@
class EditorScene;
class EditorCameraController;
+class QOffscreenSurface;
+
namespace Qt3DCore
{
class QAspectEngine;
@@ -66,6 +68,7 @@ public:
bool inputEnabled() const;
void setInputEnabled(bool enable);
+ void handleWindowChanged(QQuickWindow *win);
public slots:
void setScene(EditorScene* scene);
@@ -97,6 +100,7 @@ private:
EditorCameraController *m_cameraController;
bool m_inputEnabled;
+ QOffscreenSurface *m_surface;
};
#endif // EDITORVIEWPORTITEM_H