aboutsummaryrefslogtreecommitdiffstats
path: root/examples/quick/scenegraph/rendernode/d3d12renderer.cpp
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2016-05-26 14:34:00 +0200
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2016-05-31 12:42:16 +0000
commite1682b84bb09ce3b45237b964c820eb4b92857a2 (patch)
tree5cc2e28037a0443d71e6d0f8e7609f670d9f6ae0 /examples/quick/scenegraph/rendernode/d3d12renderer.cpp
parent519032e9e0faa52162ec67d1f35b8f66cd4576d3 (diff)
Refactor the rendernode example
By removing the Renderer abstraction it becomes easier to follow and understand. Change-Id: Iddacb461d51a75864983850660c5480985b3524f Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'examples/quick/scenegraph/rendernode/d3d12renderer.cpp')
-rw-r--r--examples/quick/scenegraph/rendernode/d3d12renderer.cpp45
1 files changed, 30 insertions, 15 deletions
diff --git a/examples/quick/scenegraph/rendernode/d3d12renderer.cpp b/examples/quick/scenegraph/rendernode/d3d12renderer.cpp
index a48719e5dd..3694c6ae75 100644
--- a/examples/quick/scenegraph/rendernode/d3d12renderer.cpp
+++ b/examples/quick/scenegraph/rendernode/d3d12renderer.cpp
@@ -39,6 +39,7 @@
****************************************************************************/
#include "d3d12renderer.h"
+#include <QQuickItem>
#include <QQuickWindow>
#include <QSGRendererInterface>
@@ -47,15 +48,34 @@
#include "vs_shader.hlslh"
#include "ps_shader.hlslh"
-D3D12Renderer::D3D12Renderer(QQuickItem *item, QSGRenderNode *node)
- : m_item(item),
- m_node(node),
- vbPtr(nullptr),
- cbPtr(nullptr)
+D3D12RenderNode::D3D12RenderNode(QQuickItem *item)
+ : m_item(item)
{
}
-void D3D12Renderer::init()
+D3D12RenderNode::~D3D12RenderNode()
+{
+ releaseResources();
+}
+
+void D3D12RenderNode::releaseResources()
+{
+ if (vbPtr) {
+ vertexBuffer->Unmap(0, nullptr);
+ vbPtr = nullptr;
+ }
+ if (cbPtr) {
+ constantBuffer->Unmap(0, nullptr);
+ cbPtr = nullptr;
+ }
+ constantBuffer = nullptr;
+ vertexBuffer = nullptr;
+ rootSignature = nullptr;
+ pipelineState = nullptr;
+ m_device = nullptr;
+}
+
+void D3D12RenderNode::init()
{
QSGRendererInterface *rif = m_item->window()->rendererInterface();
m_device = static_cast<ID3D12Device *>(rif->getResource(QSGRendererInterface::Device));
@@ -180,22 +200,17 @@ void D3D12Renderer::init()
}
}
-D3D12Renderer::~D3D12Renderer()
+void D3D12RenderNode::render(const RenderState *state)
{
- if (vbPtr)
- vertexBuffer->Unmap(0, nullptr);
- if (cbPtr)
- constantBuffer->Unmap(0, nullptr);
-}
+ if (!m_device)
+ init();
-void D3D12Renderer::render(const QSGRenderNode::RenderState *state)
-{
QSGRendererInterface *rif = m_item->window()->rendererInterface();
ID3D12GraphicsCommandList *commandList = static_cast<ID3D12GraphicsCommandList *>(rif->getResource(QSGRendererInterface::CommandList));
Q_ASSERT(commandList);
const int msize = 16 * sizeof(float);
- memcpy(cbPtr, m_node->matrix()->constData(), msize);
+ memcpy(cbPtr, matrix()->constData(), msize);
memcpy(cbPtr + msize, state->projectionMatrix()->constData(), msize);
const QPointF p0(m_item->width() - 1, m_item->height() - 1);