From fa69a7088a945d8535316cba1642645f1dcc069a Mon Sep 17 00:00:00 2001
From: Andy Nichols <andy.nichols@qt.io>
Date: Tue, 11 Jun 2019 15:39:00 +0200
Subject: [PATCH] RenderModes: Get the RenderNode path working, though still
 buggy

---
 src/quick3d/qdemonscenerenderer.cpp | 33 +++++++++++++++++------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/src/quick3d/qdemonscenerenderer.cpp b/src/quick3d/qdemonscenerenderer.cpp
index 68ec4213..7010582b 100644
--- a/src/quick3d/qdemonscenerenderer.cpp
+++ b/src/quick3d/qdemonscenerenderer.cpp
@@ -326,14 +326,32 @@ QSGRenderNode::StateFlags QDemonSGRenderNode::changedStates() const
     return BlendState | StencilState | DepthState | ScissorState | ColorState | CullState | ViewportState | RenderTargetState;
 }
 
+namespace {
+QRect convertQtRectToGLViewport(const QRectF &rect, const QSize surfaceSize) {
+    //
+    const int x = int(rect.x());
+    const int y = surfaceSize.height() - (int(rect.y()) + int(rect.height()));
+    const int width = int(rect.width());
+    const int height = int(rect.height());
+    return QRect(x, y, width, height);
+}
+}
+
 void QDemonSGRenderNode::render(const QSGRenderNode::RenderState *state)
 {
     // calculate viewport
-    QRect viewport = matrix()->mapRect(QRect(QPoint(0, 0), renderer->surfaceSize()));
+    const double dpr = renderer->m_window->devicePixelRatio();
+    const QSizeF itemSize = renderer->surfaceSize() / dpr;
+
+    QRectF viewport = matrix()->mapRect(QRectF(QPoint(0, 0), itemSize));
+    viewport = QRectF(viewport.topLeft() * dpr, viewport.size() * dpr);
 
     // render
-    renderer->render(viewport);
+    renderer->render(convertQtRectToGLViewport(viewport, window->size() * dpr));
     markDirty(QSGNode::DirtyMaterial);
+
+    // reset some state
+    window->resetOpenGLState();
 }
 
 void QDemonSGRenderNode::releaseResources()
@@ -371,17 +389,6 @@ void QDemonSGDirectRenderer::requestRender()
     m_window->update();
 }
 
-namespace {
-QRect convertQtRectToGLViewport(const QRectF &rect, const QSize surfaceSize) {
-    //
-    const int x = int(rect.x());
-    const int y = surfaceSize.height() - (int(rect.y()) + int(rect.height()));
-    const int width = int(rect.width());
-    const int height = int(rect.height());
-    return QRect(x, y, width, height);
-}
-}
-
 void QDemonSGDirectRenderer::render()
 {
     const QRect glViewport = convertQtRectToGLViewport(m_viewport, m_window->size() * m_window->devicePixelRatio());
-- 
GitLab