diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-08-17 09:32:57 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-08-17 13:09:38 +0200 |
commit | fabb3eb8e8bc1aeae8d0d6cad8c68c317c653b77 (patch) | |
tree | de399511b627813fca9ddc0459130273c454f321 /src/plugins/renderers/rhi | |
parent | d3214c87e2a8c82a70c38091bc59694fa80476e0 (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.h | 4 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/renderer.cpp | 44 | ||||
-rw-r--r-- | src/plugins/renderers/rhi/renderer/rhigraphicspipeline_p.h | 2 |
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; }; |