summaryrefslogtreecommitdiffstats
path: root/src/plugins/renderers/rhi
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-08-17 09:32:57 +0200
committerPaul Lemire <paul.lemire@kdab.com>2020-08-17 13:09:38 +0200
commitfabb3eb8e8bc1aeae8d0d6cad8c68c317c653b77 (patch)
treede399511b627813fca9ddc0459130273c454f321 /src/plugins/renderers/rhi
parentd3214c87e2a8c82a70c38091bc59694fa80476e0 (diff)
rhi: set primitive type on graphics pipeline
Otherwise we are ignoring the primitive type specified by the user and drawing everything with triangles. Note: rhi doesn't handle all primitive types (lineloop, patches and adjancency primitives are currently not supported). Change-Id: Ic025917c37413b7e062b8c0b17d506822270d924 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/plugins/renderers/rhi')
-rw-r--r--src/plugins/renderers/rhi/managers/rhiresourcemanagers_p.h4
-rw-r--r--src/plugins/renderers/rhi/renderer/renderer.cpp44
-rw-r--r--src/plugins/renderers/rhi/renderer/rhigraphicspipeline_p.h2
3 files changed, 48 insertions, 2 deletions
diff --git a/src/plugins/renderers/rhi/managers/rhiresourcemanagers_p.h b/src/plugins/renderers/rhi/managers/rhiresourcemanagers_p.h
index 7269bae8f..b5dc67aee 100644
--- a/src/plugins/renderers/rhi/managers/rhiresourcemanagers_p.h
+++ b/src/plugins/renderers/rhi/managers/rhiresourcemanagers_p.h
@@ -157,6 +157,7 @@ inline uint qHash(const GraphicsPipelineIdentifier &key, uint seed = 0)
seed = qHash(p, seed);
seed = qHash(key.renderTarget, seed);
seed = qHash(key.renderViewIndex, seed);
+ seed = qHash(key.primitiveType, seed);
return seed;
}
@@ -165,7 +166,8 @@ inline bool operator==(const GraphicsPipelineIdentifier &a, const GraphicsPipeli
return a.geometryLayoutKey == b.geometryLayoutKey &&
a.shader == b.shader &&
a.renderTarget == b.renderTarget &&
- a.renderViewIndex == b.renderViewIndex;
+ a.renderViewIndex == b.renderViewIndex &&
+ a.primitiveType == b.primitiveType;
}
inline uint qHash(const ComputePipelineIdentifier &key, uint seed = 0)
diff --git a/src/plugins/renderers/rhi/renderer/renderer.cpp b/src/plugins/renderers/rhi/renderer/renderer.cpp
index d09cf07bb..aea3e7e4c 100644
--- a/src/plugins/renderers/rhi/renderer/renderer.cpp
+++ b/src/plugins/renderers/rhi/renderer/renderer.cpp
@@ -868,7 +868,7 @@ void Renderer::updateGraphicsPipeline(RenderCommand &cmd, RenderView *rv,
// as it is likely many geometrys will have the same layout
RHIGraphicsPipelineManager *pipelineManager = m_RHIResourceManagers->rhiGraphicsPipelineManager();
const int geometryLayoutId = pipelineManager->getIdForAttributeVec(cmd.m_attributeInfo);
- const GraphicsPipelineIdentifier pipelineKey { geometryLayoutId, cmd.m_shaderId, rv->renderTargetId(), renderViewIndex };
+ const GraphicsPipelineIdentifier pipelineKey { geometryLayoutId, cmd.m_shaderId, rv->renderTargetId(), cmd.m_primitiveType, renderViewIndex };
RHIGraphicsPipeline *graphicsPipeline = pipelineManager->lookupResource(pipelineKey);
if (graphicsPipeline == nullptr) {
// Init UBOSet the first time we allocate a new pipeline
@@ -980,6 +980,48 @@ void Renderer::buildGraphicsPipelines(RHIGraphicsPipeline *graphicsPipeline,
pipeline->setShaderResourceBindings(shaderResourceBindings);
+ auto rhiTopologyFromQt3DTopology = [] (const Qt3DRender::QGeometryRenderer::PrimitiveType t) {
+ switch (t) {
+ case Qt3DRender::QGeometryRenderer::Points:
+ return QRhiGraphicsPipeline::Points;
+
+ case Qt3DRender::QGeometryRenderer::Lines:
+ return QRhiGraphicsPipeline::Lines;
+
+ case Qt3DRender::QGeometryRenderer::LineStrip:
+ return QRhiGraphicsPipeline::LineStrip;
+
+ case Qt3DRender::QGeometryRenderer::Triangles:
+ return QRhiGraphicsPipeline::Triangles;
+
+ case Qt3DRender::QGeometryRenderer::TriangleStrip:
+ return QRhiGraphicsPipeline::TriangleStrip;
+
+ case Qt3DRender::QGeometryRenderer::TriangleFan:
+ return QRhiGraphicsPipeline::TriangleFan;
+
+ case Qt3DRender::QGeometryRenderer::LineLoop: {
+ qWarning(Backend) << "LineLoop primitive type is not handled by RHI";
+ return QRhiGraphicsPipeline::Lines;
+ }
+
+ case Qt3DRender::QGeometryRenderer::Patches: {
+ qWarning(Backend) << "Patches primitive type is not handled by RHI";
+ return QRhiGraphicsPipeline::Points;
+ }
+
+ case Qt3DRender::QGeometryRenderer::LinesAdjacency:
+ case Qt3DRender::QGeometryRenderer::TrianglesAdjacency:
+ case Qt3DRender::QGeometryRenderer::LineStripAdjacency:
+ case Qt3DRender::QGeometryRenderer::TriangleStripAdjacency: {
+ qWarning(Backend) << "Adjancency primitive types are not handled by RHI";
+ return QRhiGraphicsPipeline::Points;
+ }
+ }
+ };
+
+ pipeline->setTopology(rhiTopologyFromQt3DTopology(cmd.m_primitiveType));
+
QRhiVertexInputLayout inputLayout;
inputLayout.setBindings(inputBindings.begin(), inputBindings.end());
inputLayout.setAttributes(rhiAttributes.begin(), rhiAttributes.end());
diff --git a/src/plugins/renderers/rhi/renderer/rhigraphicspipeline_p.h b/src/plugins/renderers/rhi/renderer/rhigraphicspipeline_p.h
index bbd311ac1..52803deb0 100644
--- a/src/plugins/renderers/rhi/renderer/rhigraphicspipeline_p.h
+++ b/src/plugins/renderers/rhi/renderer/rhigraphicspipeline_p.h
@@ -56,6 +56,7 @@
#include <pipelineuboset_p.h>
#include <Qt3DCore/qnodeid.h>
#include <Qt3DRender/private/handle_types_p.h>
+#include <Qt3DRender/qgeometryrenderer.h>
QT_BEGIN_NAMESPACE
@@ -73,6 +74,7 @@ struct GraphicsPipelineIdentifier
int geometryLayoutKey;
Qt3DCore::QNodeId shader;
Qt3DCore::QNodeId renderTarget;
+ Qt3DRender::QGeometryRenderer::PrimitiveType primitiveType;
int renderViewIndex = 0;
};