summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2018-08-21 13:41:15 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2018-08-22 12:30:08 +0000
commitf84228106e5302d68b51736ca69a6ca9ed98a869 (patch)
tree314879cd2aa7b7e2c9901e42297fca5473322355
parent189e49c1197720c52a2ef454a84ad9fb5ed4e4e2 (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.cpp13
-rw-r--r--src/runtime/aping/q3dslayer3d_p.h3
-rw-r--r--src/runtime/aping/q3dsstudio3dengine.cpp19
-rw-r--r--src/runtime/aping/q3dsstudio3dengine_p.h1
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;
};