Use RendererInfo in the rendernode example

Simplifies things a lot.

Change-Id: I57fbedeeb99884aa5b14532c7be33f6373551b5f
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
Laszlo Agocs 2016-05-02 21:49:43 +02:00
parent 84fb780d83
commit 0ea01a229b
3 changed files with 4 additions and 69 deletions

View File

@ -56,10 +56,8 @@ void CustomRenderNode::render(const RenderState *state)
if (!ri)
return;
m_api = ri->graphicsAPI();
if (!m_renderer) {
switch (m_api) {
switch (ri->graphicsAPI()) {
case QSGRendererInterface::OpenGL:
#ifndef QT_NO_OPENGL
m_renderer = new OpenGLRenderer(m_item, this);
@ -97,13 +95,6 @@ CustomRenderItem::CustomRenderItem(QQuickItem *parent)
{
// Our item shows something so set the flag.
setFlag(ItemHasContents);
// We want the graphics API type to be exposed to QML. The value is easy to
// get during rendering on the render thread in CustomRenderNode::render(),
// but is more tricky here since the item gets a window associated later,
// which in turn will get the underlying scenegraph started at some later
// point. So defer.
connect(this, &QQuickItem::windowChanged, this, &CustomRenderItem::onWindowChanged);
}
QSGNode *CustomRenderItem::updatePaintNode(QSGNode *node, UpdatePaintNodeData *)
@ -114,45 +105,3 @@ QSGNode *CustomRenderItem::updatePaintNode(QSGNode *node, UpdatePaintNodeData *)
return n;
}
void CustomRenderItem::onWindowChanged(QQuickWindow *w)
{
if (w) {
if (w->isSceneGraphInitialized())
updateGraphicsAPI();
else
connect(w, &QQuickWindow::sceneGraphInitialized, this, &CustomRenderItem::updateGraphicsAPI);
} else {
updateGraphicsAPI();
}
}
void CustomRenderItem::updateGraphicsAPI()
{
QString newAPI;
if (!window()) {
newAPI = QLatin1String("[no window]");
} else {
QSGRendererInterface *ri = window()->rendererInterface();
if (!ri) {
newAPI = QLatin1String("[no renderer interface]");
} else {
switch (ri->graphicsAPI()) {
case QSGRendererInterface::OpenGL:
newAPI = QLatin1String("OpenGL");
break;
case QSGRendererInterface::Direct3D12:
newAPI = QLatin1String("D3D12");
break;
default:
newAPI = QString(QLatin1String("[unsupported graphics API %1]")).arg(ri->graphicsAPI());
break;
}
}
}
if (newAPI != m_api) {
m_api = newAPI;
emit graphicsAPIChanged();
}
}

View File

@ -63,31 +63,16 @@ public:
private:
QQuickItem *m_item;
int m_api;
CustomRenderer *m_renderer = nullptr;
};
class CustomRenderItem : public QQuickItem
{
Q_OBJECT
Q_PROPERTY(QString graphicsAPI READ graphicsAPI NOTIFY graphicsAPIChanged)
public:
CustomRenderItem(QQuickItem *parent = nullptr);
QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *) override;
QString graphicsAPI() const { return m_api; }
private slots:
void onWindowChanged(QQuickWindow *w);
void updateGraphicsAPI();
signals:
void graphicsAPIChanged();
private:
QString m_api;
};
#endif

View File

@ -38,7 +38,7 @@
**
****************************************************************************/
import QtQuick 2.0
import QtQuick 2.8 // for RendererInfo
import SceneGraphRendering 2.0
Item {
@ -89,7 +89,8 @@ Item {
anchors.right: renderer.right
anchors.margins: 20
wrapMode: Text.WordWrap
text: "Custom rendering via the graphics API " + renderer.graphicsAPI
property int api: RendererInfo.api
text: "Custom rendering via the graphics API " + (api === RendererInfo.OpenGL ? "OpenGL" : (api === RendererInfo.Direct3D12 ? "Direct3D 12" : ""))
color: "yellow"
}
}