diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2018-08-21 13:41:15 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2018-08-22 12:30:08 +0000 |
commit | f84228106e5302d68b51736ca69a6ca9ed98a869 (patch) | |
tree | 314879cd2aa7b7e2c9901e42297fca5473322355 | |
parent | 189e49c1197720c52a2ef454a84ad9fb5ed4e4e2 (diff) |
Enable MSAA and SSAA for Layer3D
Change-Id: I26b8e731af7869199d7225263ac05bef42380df8
Reviewed-by: Christian Stromme <christian.stromme@qt.io>
-rw-r--r-- | src/runtime/aping/q3dslayer3d.cpp | 13 | ||||
-rw-r--r-- | src/runtime/aping/q3dslayer3d_p.h | 3 | ||||
-rw-r--r-- | src/runtime/aping/q3dsstudio3dengine.cpp | 19 | ||||
-rw-r--r-- | src/runtime/aping/q3dsstudio3dengine_p.h | 1 |
4 files changed, 29 insertions, 7 deletions
diff --git a/src/runtime/aping/q3dslayer3d.cpp b/src/runtime/aping/q3dslayer3d.cpp index e9444e1..e783198 100644 --- a/src/runtime/aping/q3dslayer3d.cpp +++ b/src/runtime/aping/q3dslayer3d.cpp @@ -293,7 +293,7 @@ void Q3DSLayer3D::sync() bool Q3DSLayer3D::isTextureProvider() const { - return true; + return QQuickItem::isTextureProvider() || m_canProvideTexture; } QSGTextureProvider *Q3DSLayer3D::textureProvider() const @@ -303,6 +303,8 @@ QSGTextureProvider *Q3DSLayer3D::textureProvider() const if (QQuickItem::isTextureProvider()) return QQuickItem::textureProvider(); + Q_ASSERT(m_canProvideTexture); + if (!m_textureProvider) { m_textureProvider = new Q3DSLayerTextureProvider; m_textureProvider->setTexture(m_lastTexture); @@ -311,14 +313,21 @@ QSGTextureProvider *Q3DSLayer3D::textureProvider() const return m_textureProvider; } -void Q3DSLayer3D::notifyTextureChange(QSGTexture *t) +void Q3DSLayer3D::notifyTextureChange(QSGTexture *t, int msaaSampleCount) { // render thread + if (msaaSampleCount > 1) { + // the scenegraph itself has no support for multisample textures + m_canProvideTexture = false; + return; + } + if (m_textureProvider) m_textureProvider->setTexture(t); m_lastTexture = t; + m_canProvideTexture = true; } void Q3DSLayer3D::keyPressEvent(QKeyEvent *event) diff --git a/src/runtime/aping/q3dslayer3d_p.h b/src/runtime/aping/q3dslayer3d_p.h index b41bef8..571a83e 100644 --- a/src/runtime/aping/q3dslayer3d_p.h +++ b/src/runtime/aping/q3dslayer3d_p.h @@ -70,7 +70,7 @@ public: QSGTextureProvider *textureProvider() const override; Q3DSLayer3DSGNode *node() const { return m_node; } - void notifyTextureChange(QSGTexture *t); + void notifyTextureChange(QSGTexture *t, int msaaSampleCount); Q3DSUipPresentation *presentation() const { return m_presentation; } Q3DSSlide *slide() const; @@ -107,6 +107,7 @@ private: bool m_engineChanged = false; Q3DSUipPresentation *m_presentation = nullptr; mutable Q3DSLayerTextureProvider *m_textureProvider = nullptr; + bool m_canProvideTexture = true; QSGTexture *m_lastTexture = nullptr; Q3DSLayerNode *m_layer3DS = nullptr; QSGTexture *m_dummyTexture = nullptr; diff --git a/src/runtime/aping/q3dsstudio3dengine.cpp b/src/runtime/aping/q3dsstudio3dengine.cpp index f6cc16e..2234c5c 100644 --- a/src/runtime/aping/q3dsstudio3dengine.cpp +++ b/src/runtime/aping/q3dsstudio3dengine.cpp @@ -350,7 +350,9 @@ void Q3DSStudio3DEngine::updateViews() Renderer::Layer layer; layer.item = layerItem; layer.textureNodeId = nodeId; - layer.pixelSize = layer3DS->attached<Q3DSLayerAttached>()->layerSize; + Q3DSLayerAttached *layerData = layer3DS->attached<Q3DSLayerAttached>(); + layer.pixelSize = layerData->layerSize * layerData->ssaaScaleFactor; + layer.sampleCount = layerData->msaaSampleCount; layer.itemSizeWithoutDpr = layerItem->size().toSize(); layers.append(layer); } else { @@ -426,6 +428,11 @@ void Q3DSStudio3DEngine::Renderer::notifyEngineStart() m_engineStarted.store(1); } +static bool sampleCountEquals(int a, int b) +{ + return a == b || (a <= 1 && b <= 1); +} + void Q3DSStudio3DEngine::Renderer::render() { // m_engine may be destroyed already @@ -486,13 +493,17 @@ void Q3DSStudio3DEngine::Renderer::render() uint id = tex->textureId(); Q3DSLayer3DSGNode *viewNode = layer.item->node(); if (viewNode) { - if (uint(viewNode->texture()->textureId()) != id || viewNode->rect().size() != layer.itemSizeWithoutDpr) { + if (uint(viewNode->texture()->textureId()) != id + || viewNode->texture()->textureSize() != layer.pixelSize + || !sampleCountEquals(viewNode->sampleCount(), layer.sampleCount) + || viewNode->rect().size() != layer.itemSizeWithoutDpr) + { QSGTexture *t = w->createTextureFromId(id, layer.pixelSize, QQuickWindow::TextureHasAlphaChannel); Q_ASSERT(t); t->setFiltering(QSGTexture::Linear); - viewNode->setTexture(t); // owns, so previous texture is destroyed - layer.item->notifyTextureChange(t); + viewNode->setTexture(t, layer.sampleCount); // owns, so previous texture is destroyed + layer.item->notifyTextureChange(t, layer.sampleCount); viewNode->setRect(QRectF(QPointF(0, 0), layer.itemSizeWithoutDpr)); } diff --git a/src/runtime/aping/q3dsstudio3dengine_p.h b/src/runtime/aping/q3dsstudio3dengine_p.h index 45684f0..aaebc4b 100644 --- a/src/runtime/aping/q3dsstudio3dengine_p.h +++ b/src/runtime/aping/q3dsstudio3dengine_p.h @@ -109,6 +109,7 @@ private: Q3DSLayer3D *item = nullptr; Qt3DCore::QNodeId textureNodeId; QSize pixelSize; + int sampleCount; QSize itemSizeWithoutDpr; }; |