aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@nokia.com>2011-11-16 15:39:45 +0100
committerQt by Nokia <qt-info@nokia.com>2011-11-18 15:44:20 +0100
commit62a31676830aca745df23a5dc18b59c4211eea56 (patch)
tree4e04a80a8ff537e06efe9dfaeddf4a7ee5d56058 /src
parentb37c6b05a363ce7a7074e1e6645e168f563c66d8 (diff)
Copy QSGEngine functions to QQuickCanvas.
Long term we intend to remove the QSGEngine class all together so this is the first step. It duplicates some of the logic but doesn't break anything. Also including an example on how to use it in examples/declarative/openglunderqml Change-Id: I69ed93ec5fa1b5c4c746169306d38f8d6ce80477 Reviewed-by: Gunnar Sletta <gunnar.sletta@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/declarative/items/qquickcanvas.cpp182
-rw-r--r--src/declarative/items/qquickcanvas.h23
-rw-r--r--src/declarative/items/qquickcanvas_p.h3
-rw-r--r--src/declarative/scenegraph/qsgcontext.cpp21
-rw-r--r--src/declarative/scenegraph/qsgcontext_p.h1
-rw-r--r--src/declarative/scenegraph/util/qsgengine.cpp174
-rw-r--r--src/declarative/scenegraph/util/qsgengine.h6
7 files changed, 230 insertions, 180 deletions
diff --git a/src/declarative/items/qquickcanvas.cpp b/src/declarative/items/qquickcanvas.cpp
index 383b5526a4..765f9eca8d 100644
--- a/src/declarative/items/qquickcanvas.cpp
+++ b/src/declarative/items/qquickcanvas.cpp
@@ -46,7 +46,9 @@
#include "qquickitem_p.h"
#include <private/qsgrenderer_p.h>
+#include <private/qsgtexture_p.h>
#include <private/qsgflashnode_p.h>
+#include <qsgengine.h>
#include <private/qguiapplication_p.h>
#include <QtGui/QInputPanel>
@@ -412,6 +414,9 @@ void QQuickCanvasPrivate::initializeSceneGraph()
context->rootNode()->appendChildNode(QQuickItemPrivate::get(rootItem)->itemNode());
}
+ engine = new QSGEngine();
+ engine->setCanvas(q);
+
emit q_func()->sceneGraphInitialized();
}
@@ -431,16 +436,26 @@ void QQuickCanvasPrivate::polishItems()
void QQuickCanvasPrivate::syncSceneGraph()
{
updateDirtyNodes();
+
+ // Copy the current state of clearing from canvas into renderer.
+ context->renderer()->setClearColor(clearColor);
+ QSGRenderer::ClearMode mode = QSGRenderer::ClearStencilBuffer | QSGRenderer::ClearDepthBuffer;
+ if (clearBeforeRendering)
+ mode |= QSGRenderer::ClearColorBuffer;
+ context->renderer()->setClearMode(mode);
}
void QQuickCanvasPrivate::renderSceneGraph(const QSize &size)
{
+ Q_Q(QQuickCanvas);
context->renderer()->setDeviceRect(QRect(QPoint(0, 0), size));
context->renderer()->setViewportRect(QRect(QPoint(0, 0), renderTarget ? renderTarget->size() : size));
context->renderer()->setProjectionMatrixToDeviceRect();
+ emit q->beforeRendering();
context->renderNextFrame(renderTarget);
+ emit q->afterRendering();
#ifdef FRAME_TIMING
sceneGraphRenderTime = frameTimer.elapsed();
@@ -467,7 +482,9 @@ QQuickCanvasPrivate::QQuickCanvasPrivate()
, mouseGrabberItem(0)
, dirtyItemList(0)
, context(0)
+ , clearColor(Qt::white)
, vsyncAnimations(false)
+ , clearBeforeRendering(true)
, thread(0)
, animationDriver(0)
, renderTarget(0)
@@ -1937,13 +1954,16 @@ void QQuickCanvas::maybeUpdate()
The engine will only be available once the scene graph has been
initialized. Register for the sceneGraphEngine() signal to get
notification about this.
+
+ \deprecated
*/
QSGEngine *QQuickCanvas::sceneGraphEngine() const
{
Q_D(const QQuickCanvas);
+ qWarning("QQuickCanvas::sceneGraphEngine() is deprecated, use members of QQuickCanvas instead");
if (d->context && d->context->isReady())
- return d->context->engine();
+ return d->engine;
return 0;
}
@@ -2019,6 +2039,166 @@ QDeclarativeIncubationController *QQuickCanvas::incubationController() const
}
+
+/*!
+ \enum QQuickCanvas::CreateTextureOption
+
+ The CreateTextureOption enums are used to customize a texture is wrapped.
+
+ \value TextureHasAlphaChannel The texture has an alpha channel and should
+ be drawn using blending.
+
+ \value TextureHasMipmaps The texture has mipmaps and can be drawn with
+ mipmapping enabled.
+
+ \value TextureOwnsGLTexture The texture object owns the texture id and
+ will delete the GL texture when the texture object is deleted.
+ */
+
+/*!
+ \fn void QQuickCanvas::beforeRendering()
+
+ This signal is emitted before the scene starts rendering.
+
+ Combined with the modes for clearing the background, this option
+ can be used to paint using raw GL under QML content.
+
+ The GL context used for rendering the scene graph will be bound
+ at this point.
+
+ Since this signal is emitted from the scene graph rendering thread, the receiver should
+ be on the scene graph thread or the connection should be Qt::DirectConnection.
+
+*/
+
+/*!
+ \fn void QQuickCanvas::afterRendering()
+
+ This signal is emitted after the scene has completed rendering, before swapbuffers is called.
+
+ This signal can be used to paint using raw GL on top of QML content,
+ or to do screen scraping of the current frame buffer.
+
+ The GL context used for rendering the scene graph will be bound at this point.
+
+ Since this signal is emitted from the scene graph rendering thread, the receiver should
+ be on the scene graph thread or the connection should be Qt::DirectConnection.
+ */
+
+
+
+/*!
+ Sets weither the scene graph rendering of QML should clear the color buffer
+ before it starts rendering to \a enbled.
+
+ By disabling clearing of the color buffer, it is possible to do GL painting
+ under the scene graph.
+
+ The color buffer is cleared by default.
+
+ \sa beforeRendering()
+ */
+
+void QQuickCanvas::setClearBeforeRendering(bool enabled)
+{
+ Q_D(QQuickCanvas);
+ d->clearBeforeRendering = enabled;
+}
+
+
+
+/*!
+ Returns weither clearing of the color buffer is done before rendering or not.
+ */
+
+bool QQuickCanvas::clearBeforeRendering() const
+{
+ Q_D(const QQuickCanvas);
+ return d->clearBeforeRendering;
+}
+
+
+
+/*!
+ Creates a new QSGTexture from the supplied \a image. If the image has an
+ alpha channel, the corresponding texture will have an alpha channel.
+
+ The caller of the function is responsible for deleting the returned texture.
+ The actual GL texture will be deleted when the texture object is deleted.
+
+ \warning This function will return 0 if the scene graph has not yet been
+ initialized.
+
+ This function can be called both from the GUI thread and the rendering thread.
+
+ \sa sceneGraphInitialized()
+ */
+
+QSGTexture *QQuickCanvas::createTextureFromImage(const QImage &image) const
+{
+ Q_D(const QQuickCanvas);
+ if (d->context)
+ return d->context->createTexture(image);
+ else
+ return 0;
+}
+
+
+
+/*!
+ Creates a new QSGTexture object from an existing GL texture \a id.
+
+ The caller of the function is responsible for deleting the returned texture.
+
+ Use \a options to customize the texture attributes.
+
+ \warning This function will return 0 if the scenegraph has not yet been
+ initialized.
+
+ \sa sceneGraphInitialized()
+ */
+QSGTexture *QQuickCanvas::createTextureFromId(uint id, const QSize &size, CreateTextureOptions options) const
+{
+ Q_D(const QQuickCanvas);
+ if (d->context) {
+ QSGPlainTexture *texture = new QSGPlainTexture();
+ texture->setTextureId(id);
+ texture->setHasAlphaChannel(options & TextureHasAlphaChannel);
+ texture->setHasMipmaps(options & TextureHasMipmaps);
+ texture->setOwnsTexture(options & TextureOwnsGLTexture);
+ texture->setTextureSize(size);
+ return texture;
+ }
+ return 0;
+}
+
+
+/*!
+ Sets the color used to clear the opengl context to \a color.
+
+ Setting the clear color has no effect when clearing is disabled.
+
+ \sa setClearBeforeRendering()
+ */
+
+void QQuickCanvas::setClearColor(const QColor &color)
+{
+ d_func()->clearColor = color;
+}
+
+
+
+/*!
+ Returns the color used to clear the opengl context.
+ */
+
+QColor QQuickCanvas::clearColor() const
+{
+ return d_func()->clearColor;
+}
+
+
+
void QQuickCanvasRenderLoop::createGLContext()
{
gl = new QOpenGLContext();
diff --git a/src/declarative/items/qquickcanvas.h b/src/declarative/items/qquickcanvas.h
index e9b1b60613..847a6fb059 100644
--- a/src/declarative/items/qquickcanvas.h
+++ b/src/declarative/items/qquickcanvas.h
@@ -54,6 +54,7 @@ QT_MODULE(Declarative)
class QQuickItem;
class QSGEngine;
+class QSGTexture;
class QQuickCanvasPrivate;
class QOpenGLFramebufferObject;
class QDeclarativeIncubationController;
@@ -63,6 +64,14 @@ class Q_DECLARATIVE_EXPORT QQuickCanvas : public QWindow
Q_OBJECT
Q_DECLARE_PRIVATE(QQuickCanvas)
public:
+ enum CreateTextureOption {
+ TextureHasAlphaChannel = 0x0001,
+ TextureHasMipmaps = 0x0002,
+ TextureOwnsGLTexture = 0x0004
+ };
+
+ Q_DECLARE_FLAGS(CreateTextureOptions, CreateTextureOption)
+
QQuickCanvas(QWindow *parent = 0);
virtual ~QQuickCanvas();
@@ -88,9 +97,23 @@ public:
QDeclarativeIncubationController *incubationController() const;
+ // Scene graph specific functions
+ QSGTexture *createTextureFromImage(const QImage &image) const;
+ QSGTexture *createTextureFromId(uint id, const QSize &size, CreateTextureOptions options = CreateTextureOption(0)) const;
+
+ void setClearBeforeRendering(bool enabled);
+ bool clearBeforeRendering() const;
+
+ void setClearColor(const QColor &color);
+ QColor clearColor() const;
+
+ QOpenGLContext *openglContext() const;
+
Q_SIGNALS:
void frameSwapped();
void sceneGraphInitialized();
+ void beforeRendering();
+ void afterRendering();
protected:
QQuickCanvas(QQuickCanvasPrivate &dd, QWindow *parent = 0);
diff --git a/src/declarative/items/qquickcanvas_p.h b/src/declarative/items/qquickcanvas_p.h
index 702234d9e8..fdfe0911f5 100644
--- a/src/declarative/items/qquickcanvas_p.h
+++ b/src/declarative/items/qquickcanvas_p.h
@@ -157,9 +157,12 @@ public:
void updateEffectiveOpacityRoot(QQuickItem *, qreal);
void updateDirtyNode(QQuickItem *);
+ QSGEngine *engine;
QSGContext *context;
+ QColor clearColor;
uint vsyncAnimations : 1;
+ uint clearBeforeRendering : 1;
QQuickCanvasRenderLoop *thread;
QSize widgetSize;
diff --git a/src/declarative/scenegraph/qsgcontext.cpp b/src/declarative/scenegraph/qsgcontext.cpp
index 87beb72b5b..50af0dadfa 100644
--- a/src/declarative/scenegraph/qsgcontext.cpp
+++ b/src/declarative/scenegraph/qsgcontext.cpp
@@ -53,8 +53,6 @@
#include <private/qsgdistancefieldglyphnode_p.h>
#include <private/qsgtexture_p.h>
-#include <qsgengine.h>
-
#include <QGuiApplication>
#include <QOpenGLContext>
@@ -108,8 +106,6 @@ public:
QOpenGLContext *gl;
- QSGEngine engine;
-
QHash<QSGMaterialType *, QSGMaterialShader *> materials;
QSGDistanceFieldGlyphCacheManager *distanceFieldCacheManager;
@@ -138,7 +134,6 @@ QSGContext::QSGContext(QObject *parent) :
QObject(*(new QSGContextPrivate), parent)
{
Q_D(QSGContext);
- d->engine.setContext(this);
}
@@ -153,18 +148,6 @@ QSGContext::~QSGContext()
}
/*!
- Returns the scene graph engine for this context.
-
- The main purpose of the QSGEngine is to serve as a public API
- to the QSGContext.
-
- */
-QSGEngine *QSGContext::engine() const
-{
- return const_cast<QSGEngine *>(&d_func()->engine);
-}
-
-/*!
Schedules the texture to be cleaned up on the rendering thread
at a later time.
@@ -258,8 +241,6 @@ void QSGContext::renderNextFrame(QOpenGLFramebufferObject *fbo)
{
Q_D(QSGContext);
- emit d->engine.beforeRendering();
-
cleanupTextures();
if (fbo) {
@@ -269,8 +250,6 @@ void QSGContext::renderNextFrame(QOpenGLFramebufferObject *fbo)
d->renderer->renderScene();
}
- emit d->engine.afterRendering();
-
}
/*!
diff --git a/src/declarative/scenegraph/qsgcontext_p.h b/src/declarative/scenegraph/qsgcontext_p.h
index 328b85eb2b..41a9a4a89b 100644
--- a/src/declarative/scenegraph/qsgcontext_p.h
+++ b/src/declarative/scenegraph/qsgcontext_p.h
@@ -89,7 +89,6 @@ public:
void setRootNode(QSGRootNode *node);
QSGRootNode *rootNode() const;
- QSGEngine *engine() const;
QOpenGLContext *glContext() const;
bool isReady() const;
diff --git a/src/declarative/scenegraph/util/qsgengine.cpp b/src/declarative/scenegraph/util/qsgengine.cpp
index 2b7e5bed73..88eeebc472 100644
--- a/src/declarative/scenegraph/util/qsgengine.cpp
+++ b/src/declarative/scenegraph/util/qsgengine.cpp
@@ -41,8 +41,10 @@
#include "qsgengine.h"
-#include <private/qsgtexture_p.h>
-#include <private/qsgrenderer_p.h>
+#include <qquickcanvas.h>
+
+#include <private/qobject_p.h>
+#include <QtGui/QColor>
QT_BEGIN_NAMESPACE
@@ -50,33 +52,18 @@ class QSGEnginePrivate : public QObjectPrivate
{
public:
QSGEnginePrivate()
- : context(0)
- , clearBeforeRender(true)
+ : canvas(0)
{
}
- QSGContext *context;
-
- bool clearBeforeRender;
+ QQuickCanvas *canvas;
};
-
/*!
\class QSGEngine
- \brief The QSGEngine class serves as a generic entry point into scene graph specific APIs.
-
- The QSGEngine class provides factory functions for creating textures. Though the user
- can implement any type of texture using the abstract QSGTexture class, the QSGEngine
- class provides some convenience for the default usecases. This also allows the scene
- graph to apply hardware specific optimzations.
-
+ \deprecated
*/
-
-
-/*!
- Constructs a new QSGengine
- */
QSGEngine::QSGEngine(QObject *parent) :
QObject(*(new QSGEnginePrivate), parent)
{
@@ -87,165 +74,42 @@ QSGEngine::~QSGEngine()
{
}
-/*!
- \enum TextureOption
-
- The TextureOption enums are used to customize a texture is wrapped.
-
- \value TextureHasAlphaChannel The texture has an alpha channel and should
- be drawn using blending.
-
- \value TextureHasMipmaps The texture has mipmaps and can be drawn with
- mipmapping enabled.
-
- \value TextureOwnsGLTexture The texture object owns the texture id and
- will delete the GL texture when the texture object is deleted.
-
- */
-
-/*!
- \fn void QSGEngine::beforeRendering()
-
- This signal is emitted before the scene starts rendering.
-
- Combined with the modes for clearing the background, this option
- can be used to paint using raw GL under QML content.
- The GL context used for rendering the scene graph will be bound
- at this point.
-
- Since this signal is emitted from the scene graph rendering thread, the receiver should
- be on the scene graph thread or the connection should be Qt::DirectConnection.
-
-*/
-
-/*!
- \fn void QSGEngine::afterRendering()
-
- This signal is emitted after the scene has completed rendering, before swapbuffers is called.
-
- This signal can be used to paint using raw GL on top of QML content,
- or to do screen scraping of the current frame buffer.
-
- The GL context used for rendering the scene graph will be bound at this point.
-
- Since this signal is emitted from the scene graph rendering thread, the receiver should
- be on the scene graph thread or the connection should be Qt::DirectConnection.
- */
-
-
-
-/*!
- Sets weither the scene graph rendering of QML should clear the color buffer
- before it starts rendering to \a enbled.
-
- By disabling clearing of the color buffer, it is possible to do GL painting
- under the scene graph.
-
- The color buffer is cleared by default.
- */
+void QSGEngine::setCanvas(QQuickCanvas *canvas)
+{
+ d_func()->canvas = canvas;
+ connect(canvas, SIGNAL(afterRendering()), this, SIGNAL(afterRendering()));
+ connect(canvas, SIGNAL(beforeRendering()), this, SIGNAL(beforeRendering()));
+}
void QSGEngine::setClearBeforeRendering(bool enabled)
{
- Q_D(QSGEngine);
- d->clearBeforeRender = enabled;
- if (d->clearBeforeRender) {
- d->context->renderer()->setClearMode(QSGRenderer::ClearDepthBuffer
- | QSGRenderer::ClearColorBuffer);
- } else {
- d->context->renderer()->setClearMode(QSGRenderer::ClearDepthBuffer);
- }
+ d_func()->canvas->setClearBeforeRendering(enabled);
}
-
-
-/*!
- Returns weither clearing of the color buffer is done before rendering or not.
- */
-
bool QSGEngine::clearBeforeRendering() const
{
- Q_D(const QSGEngine);
- return d->clearBeforeRender;
+ return d_func()->canvas->clearBeforeRendering();
}
-
-
-/*!
- Creates a new QSGTexture from the supplied \a image. If the image has an
- alpha channel, the corresponding texture will have an alpha channel.
-
- The caller of the function is responsible for deleting the returned texture.
-
- The actual GL texture will be deleted when the texture object is deleted.
- */
-
QSGTexture *QSGEngine::createTextureFromImage(const QImage &image) const
{
- Q_D(const QSGEngine);
- return d->context->createTexture(image);
+ return d_func()->canvas->createTextureFromImage(image);
}
-
-
-/*!
- Creates a new QSGTexture object from an existing GL texture \a id.
-
- The caller of the function is responsible for deleting the returned texture.
-
- Use \a options to customize the texture attributes.
- */
QSGTexture *QSGEngine::createTextureFromId(uint id, const QSize &size, TextureOptions options) const
{
- QSGPlainTexture *texture = new QSGPlainTexture();
- texture->setTextureId(id);
- texture->setHasAlphaChannel(options & TextureHasAlphaChannel);
- texture->setHasMipmaps(options & TextureHasMipmaps);
- texture->setOwnsTexture(options & TextureOwnsGLTexture);
- texture->setTextureSize(size);
- return texture;
+ return d_func()->canvas->createTextureFromId(id, size, QQuickCanvas::CreateTextureOptions((int) options));
}
-
-
-/*!
- \internal
-
- Sets the scene graph context of this engine to context.
-
- The context will be set by the QSGcontext::initialize() function,
- as part of constructing the engine object.
- */
-
-void QSGEngine::setContext(QSGContext *context)
-{
- Q_D(QSGEngine);
- d->context = context;
-}
-
-
-
-/*!
- Sets the background color of the scene graph to \a color.
-
- Changing the clear color has no effect when clearing before rendering is
- disabled.
- */
-
void QSGEngine::setClearColor(const QColor &color)
{
- d_func()->context->renderer()->setClearColor(color);
+ d_func()->canvas->setClearColor(color);
}
-
-
-/*!
- Returns the background color of the scene graph
- */
-
QColor QSGEngine::clearColor() const
{
- return d_func()->context->renderer()->clearColor();
+ return d_func()->canvas->clearColor();
}
QT_END_NAMESPACE
diff --git a/src/declarative/scenegraph/util/qsgengine.h b/src/declarative/scenegraph/util/qsgengine.h
index f9a0ea1da6..0cbbcddfec 100644
--- a/src/declarative/scenegraph/util/qsgengine.h
+++ b/src/declarative/scenegraph/util/qsgengine.h
@@ -54,7 +54,8 @@ QT_MODULE(Declarative)
class QSGEnginePrivate;
-class QSGContext;
+class QQuickCanvas;
+
class Q_DECLARATIVE_EXPORT QSGEngine : public QObject
{
Q_OBJECT
@@ -89,7 +90,8 @@ private:
friend class QSGContext;
friend class QSGContextPrivate;
- void setContext(QSGContext *context);
+ friend class QQuickCanvasPrivate;
+ void setCanvas(QQuickCanvas *canvas);
};