summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-07-07 18:21:52 +0200
committerJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-08-06 19:07:45 +0200
commitfffb6233a366a92336aeed690cae0b704358511d (patch)
treed7ee82c5dfc696151aba1e2f134c1b350f15de1c /src
parent83a6c1b92f38b4b0bdb3f90d67be7bb1e4caef7a (diff)
Use QSGEngine instead of the private QSGRenderContext
QSGEngine was added in Qt 5.4 to allow using the scene graph without QQuickWindow. Use it for our FBO as well as for the QOpenGLWidget rendering. Change-Id: If4665d4f33c9dad69d2d4269309163bb5ffbd8e3 Reviewed-by: Andras Becsi <andras.becsi@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/core/delegated_frame_node.cpp42
-rw-r--r--src/core/delegated_frame_node.h7
-rw-r--r--src/core/render_widget_host_view_qt.cpp4
-rw-r--r--src/core/render_widget_host_view_qt.h2
-rw-r--r--src/core/render_widget_host_view_qt_delegate.h3
-rw-r--r--src/webengine/render_widget_host_view_qt_delegate_quick.cpp3
-rw-r--r--src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp42
-rw-r--r--src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h12
8 files changed, 45 insertions, 70 deletions
diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp
index 546f7395e..434530e17 100644
--- a/src/core/delegated_frame_node.cpp
+++ b/src/core/delegated_frame_node.cpp
@@ -66,13 +66,13 @@
#include "cc/quads/texture_draw_quad.h"
#include "cc/quads/tile_draw_quad.h"
#include "cc/quads/yuv_video_draw_quad.h"
+#include <QOpenGLContext>
#include <QOpenGLFramebufferObject>
+#include <QSGAbstractRenderer>
+#include <QSGEngine>
#include <QSGSimpleRectNode>
#include <QSGSimpleTextureNode>
#include <QSGTexture>
-#include <QtQuick/private/qsgcontext_p.h>
-#include <QtQuick/private/qsgrenderer_p.h>
-#include <QtQuick/private/qsgtexture_p.h>
#if !defined(QT_NO_EGL)
#include <EGL/egl.h>
@@ -82,7 +82,7 @@
class RenderPassTexture : public QSGTexture
{
public:
- RenderPassTexture(const cc::RenderPass::Id &id, QSGRenderContext *context);
+ RenderPassTexture(const cc::RenderPass::Id &id);
const cc::RenderPass::Id &id() const { return m_id; }
void bind();
@@ -94,7 +94,6 @@ public:
void setRect(const QRect &rect) { m_rect = rect; }
void setFormat(GLenum format) { m_format = format; }
- void setDevicePixelRatio(qreal ratio) { m_device_pixel_ratio = ratio; }
QSGNode *rootNode() { return m_rootNode.data(); }
void grab();
@@ -102,14 +101,12 @@ public:
private:
cc::RenderPass::Id m_id;
QRect m_rect;
- qreal m_device_pixel_ratio;
GLenum m_format;
+ QScopedPointer<QSGEngine> m_sgEngine;
QScopedPointer<QSGRootNode> m_rootNode;
- QScopedPointer<QSGRenderer> m_renderer;
+ QScopedPointer<QSGAbstractRenderer> m_renderer;
QScopedPointer<QOpenGLFramebufferObject> m_fbo;
-
- QSGRenderContext *m_context;
};
class MailboxTexture : public QSGTexture {
@@ -263,13 +260,12 @@ static void waitAndDeleteChromiumSync(FenceSync *sync)
Q_ASSERT(!*sync);
}
-RenderPassTexture::RenderPassTexture(const cc::RenderPass::Id &id, QSGRenderContext *context)
+RenderPassTexture::RenderPassTexture(const cc::RenderPass::Id &id)
: QSGTexture()
, m_id(id)
- , m_device_pixel_ratio(1)
, m_format(GL_RGBA)
+ , m_sgEngine(new QSGEngine)
, m_rootNode(new QSGRootNode)
- , m_context(context)
{
}
@@ -281,16 +277,11 @@ void RenderPassTexture::bind()
void RenderPassTexture::grab()
{
- if (!m_rootNode->firstChild()) {
- m_renderer.reset();
- m_fbo.reset();
- return;
- }
if (!m_renderer) {
- m_renderer.reset(m_context->createRenderer());
+ m_sgEngine->initialize(QOpenGLContext::currentContext());
+ m_renderer.reset(m_sgEngine->createRenderer());
m_renderer->setRootNode(m_rootNode.data());
}
- m_renderer->setDevicePixelRatio(m_device_pixel_ratio);
if (!m_fbo || m_fbo->size() != m_rect.size() || m_fbo->format().internalTextureFormat() != m_format)
{
@@ -303,16 +294,13 @@ void RenderPassTexture::grab()
updateBindOptions(true);
}
- m_rootNode->markDirty(QSGNode::DirtyForceUpdate); // Force matrix, clip and opacity update.
- m_renderer->nodeChanged(m_rootNode.data(), QSGNode::DirtyForceUpdate); // Force render list update.
-
m_renderer->setDeviceRect(m_rect.size());
m_renderer->setViewportRect(m_rect.size());
QRectF mirrored(m_rect.left(), m_rect.bottom(), m_rect.width(), -m_rect.height());
m_renderer->setProjectionMatrixToRect(mirrored);
m_renderer->setClearColor(Qt::transparent);
- m_context->renderNextFrame(m_renderer.data(), m_fbo->handle());
+ m_renderer->renderScene(m_fbo->handle());
}
MailboxTexture::MailboxTexture(const cc::TransferableResource &resource)
@@ -389,9 +377,8 @@ RectClipNode::RectClipNode(const QRectF &rect)
setIsRectangular(true);
}
-DelegatedFrameNode::DelegatedFrameNode(QSGRenderContext *sgRenderContext)
- : m_sgRenderContext(sgRenderContext)
- , m_numPendingSyncPoints(0)
+DelegatedFrameNode::DelegatedFrameNode()
+ : m_numPendingSyncPoints(0)
{
setFlag(UsePreprocess);
}
@@ -481,9 +468,8 @@ void DelegatedFrameNode::commit(DelegatedFrameNodeData* data, cc::ReturnedResour
if (pass != rootRenderPass) {
QSharedPointer<RenderPassTexture> rpTexture = findRenderPassTexture(pass->id, oldRenderPassTextures);
if (!rpTexture)
- rpTexture = QSharedPointer<RenderPassTexture>(new RenderPassTexture(pass->id, m_sgRenderContext));
+ rpTexture = QSharedPointer<RenderPassTexture>(new RenderPassTexture(pass->id));
m_renderPassTextures.append(rpTexture);
- rpTexture->setDevicePixelRatio(m_data->frameDevicePixelRatio);
rpTexture->setRect(toQt(pass->output_rect));
rpTexture->setFormat(pass->has_transparent_background ? GL_RGBA : GL_RGB);
renderPassParent = rpTexture->rootNode();
diff --git a/src/core/delegated_frame_node.h b/src/core/delegated_frame_node.h
index a42e293a5..617e16f6b 100644
--- a/src/core/delegated_frame_node.h
+++ b/src/core/delegated_frame_node.h
@@ -52,10 +52,6 @@
#include "chromium_gpu_helper.h"
-QT_BEGIN_NAMESPACE
-class QSGRenderContext;
-QT_END_NAMESPACE
-
namespace cc {
class DelegatedFrameData;
}
@@ -75,14 +71,13 @@ public:
class DelegatedFrameNode : public QSGTransformNode {
public:
- DelegatedFrameNode(QSGRenderContext *sgRenderContext);
+ DelegatedFrameNode();
~DelegatedFrameNode();
void preprocess();
void commit(DelegatedFrameNodeData* data, cc::ReturnedResourceArray *resourcesToRelease);
private:
QExplicitlySharedDataPointer<DelegatedFrameNodeData> m_data;
- QSGRenderContext *m_sgRenderContext;
QList<QSharedPointer<RenderPassTexture> > m_renderPassTextures;
int m_numPendingSyncPoints;
FenceSync m_mailboxesGLFence;
diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp
index 8e2b0db88..7228c51e7 100644
--- a/src/core/render_widget_host_view_qt.cpp
+++ b/src/core/render_widget_host_view_qt.cpp
@@ -687,11 +687,11 @@ void RenderWidgetHostViewQt::DispatchCancelTouchEvent(ui::TouchEvent *event)
m_host->ForwardTouchEventWithLatencyInfo(cancelEvent, *event->latency());
}
-QSGNode *RenderWidgetHostViewQt::updatePaintNode(QSGNode *oldNode, QSGRenderContext *sgRenderContext)
+QSGNode *RenderWidgetHostViewQt::updatePaintNode(QSGNode *oldNode)
{
DelegatedFrameNode *frameNode = static_cast<DelegatedFrameNode *>(oldNode);
if (!frameNode)
- frameNode = new DelegatedFrameNode(sgRenderContext);
+ frameNode = new DelegatedFrameNode;
frameNode->commit(m_frameNodeData.data(), &m_resourcesToRelease);
diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h
index b4a75ad89..85a48e2a7 100644
--- a/src/core/render_widget_host_view_qt.h
+++ b/src/core/render_widget_host_view_qt.h
@@ -167,7 +167,7 @@ public:
virtual void DispatchCancelTouchEvent(ui::TouchEvent*) Q_DECL_OVERRIDE;
// Overridden from RenderWidgetHostViewQtDelegateClient.
- virtual QSGNode *updatePaintNode(QSGNode *, QSGRenderContext *) Q_DECL_OVERRIDE;
+ virtual QSGNode *updatePaintNode(QSGNode *) Q_DECL_OVERRIDE;
virtual void notifyResize() Q_DECL_OVERRIDE;
virtual bool forwardEvent(QEvent *) Q_DECL_OVERRIDE;
virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const Q_DECL_OVERRIDE;
diff --git a/src/core/render_widget_host_view_qt_delegate.h b/src/core/render_widget_host_view_qt_delegate.h
index 122b7c6eb..d83f14235 100644
--- a/src/core/render_widget_host_view_qt_delegate.h
+++ b/src/core/render_widget_host_view_qt_delegate.h
@@ -52,7 +52,6 @@ class QCursor;
class QEvent;
class QPainter;
class QSGNode;
-class QSGRenderContext;
class QVariant;
class QWindow;
class QInputMethodEvent;
@@ -63,7 +62,7 @@ class WebContentsAdapterClient;
class QWEBENGINE_EXPORT RenderWidgetHostViewQtDelegateClient {
public:
virtual ~RenderWidgetHostViewQtDelegateClient() { }
- virtual QSGNode *updatePaintNode(QSGNode *, QSGRenderContext *) = 0;
+ virtual QSGNode *updatePaintNode(QSGNode *) = 0;
virtual void notifyResize() = 0;
virtual bool forwardEvent(QEvent *) = 0;
virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const = 0;
diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
index e968f450b..daca44071 100644
--- a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
+++ b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
@@ -48,7 +48,6 @@
#include <QQuickWindow>
#include <QVariant>
#include <QWindow>
-#include <QtQuick/private/qquickwindow_p.h>
RenderWidgetHostViewQtDelegateQuick::RenderWidgetHostViewQtDelegateQuick(RenderWidgetHostViewQtDelegateClient *client, bool isPopup)
: m_client(client)
@@ -231,5 +230,5 @@ void RenderWidgetHostViewQtDelegateQuick::itemChange(ItemChange change, const It
QSGNode *RenderWidgetHostViewQtDelegateQuick::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
{
- return m_client->updatePaintNode(oldNode, QQuickWindowPrivate::get(QQuickItem::window())->context);
+ return m_client->updatePaintNode(oldNode);
}
diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
index 33ef3a3c0..2fb03f02e 100644
--- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
+++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
@@ -43,21 +43,22 @@
#include "qwebenginepage_p.h"
#include "qwebengineview.h"
+#include <QGuiApplication>
#include <QLayout>
+#include <QMouseEvent>
+#include <QOpenGLContext>
+#include <QResizeEvent>
+#include <QSGAbstractRenderer>
+#include <QSGEngine>
#include <QSGNode>
-#include <private/qsgadaptationlayer_p.h>
-#include <private/qsgcontext_p.h>
-#include <private/qsgrenderer_p.h>
-#include <private/qwidget_p.h>
static const int MaxTooltipLength = 1024;
RenderWidgetHostViewQtDelegateWidget::RenderWidgetHostViewQtDelegateWidget(RenderWidgetHostViewQtDelegateClient *client, QWidget *parent)
: QOpenGLWidget(parent)
, m_client(client)
- , rootNode(new QSGRootNode)
- , sgContext(QSGContext::createDefaultContext())
- , sgRenderContext(new QSGRenderContext(sgContext.data()))
+ , m_rootNode(new QSGRootNode)
+ , m_sgEngine(new QSGEngine)
, m_isPopup(false)
{
setFocusPolicy(Qt::StrongFocus);
@@ -222,9 +223,10 @@ bool RenderWidgetHostViewQtDelegateWidget::event(QEvent *event)
void RenderWidgetHostViewQtDelegateWidget::initializeGL()
{
- sgRenderContext->initialize(QOpenGLContext::currentContext());
- sgRenderer.reset(sgRenderContext->createRenderer());
- sgRenderer->setRootNode(rootNode.data());
+ m_sgEngine->initialize(QOpenGLContext::currentContext());
+ m_sgRenderer.reset(m_sgEngine->createRenderer());
+ m_sgRenderer->setRootNode(m_rootNode.data());
+ m_sgRenderer->setClearColor(Qt::white);
}
void RenderWidgetHostViewQtDelegateWidget::paintGL()
@@ -234,19 +236,15 @@ void RenderWidgetHostViewQtDelegateWidget::paintGL()
if (!QOpenGLContext::currentContext())
return;
#endif
- QSGNode *paintNode = m_client->updatePaintNode(rootNode->firstChild(), sgRenderContext.data());
- if (paintNode != rootNode->firstChild()) {
- delete rootNode->firstChild();
- rootNode->appendChildNode(paintNode);
+ QSGNode *paintNode = m_client->updatePaintNode(m_rootNode->firstChild());
+ if (paintNode != m_rootNode->firstChild()) {
+ delete m_rootNode->firstChild();
+ m_rootNode->appendChildNode(paintNode);
}
- rootNode->markDirty(QSGNode::DirtyForceUpdate); // Force matrix, clip and opacity update.
- sgRenderer->nodeChanged(rootNode.data(), QSGNode::DirtyForceUpdate); // Force render list update.
+ m_sgRenderer->setDeviceRect(size());
+ m_sgRenderer->setViewportRect(size());
+ m_sgRenderer->setProjectionMatrixToRect(QRectF(QPointF(), size()));
- sgRenderer->setDeviceRect(size());
- sgRenderer->setViewportRect(size());
- sgRenderer->setProjectionMatrixToRect(QRectF(QPointF(), size()));
- sgRenderer->setClearColor(Qt::white);
-
- sgRenderContext->renderNextFrame(sgRenderer.data(), defaultFramebufferObject());
+ m_sgRenderer->renderScene(defaultFramebufferObject());
}
diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
index 03827adfe..68553b8e8 100644
--- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
+++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
@@ -52,9 +52,8 @@
#endif
QT_BEGIN_NAMESPACE
-class QSGContext;
-class QSGRenderContext;
-class QSGRenderer;
+class QSGAbstractRenderer;
+class QSGEngine;
class QSGRootNode;
class QWindow;
QT_END_NAMESPACE
@@ -92,10 +91,9 @@ protected:
private:
RenderWidgetHostViewQtDelegateClient *m_client;
// Put the root node first to make sure it gets destroyed after the SG renderer.
- QScopedPointer<QSGRootNode> rootNode;
- QScopedPointer<QSGContext> sgContext;
- QScopedPointer<QSGRenderContext> sgRenderContext;
- QScopedPointer<QSGRenderer> sgRenderer;
+ QScopedPointer<QSGRootNode> m_rootNode;
+ QScopedPointer<QSGEngine> m_sgEngine;
+ QScopedPointer<QSGAbstractRenderer> m_sgRenderer;
bool m_isPopup;
};