diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2019-09-28 17:21:03 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2019-10-03 14:52:31 +0200 |
commit | f500bd1609c685347a0435c9d3887bfcd65e41a6 (patch) | |
tree | b9d107f2fd4535b93e83085be640c6d6fd5a789c /src/quick | |
parent | 5bc1ae578ed79ef295e86901e4620d9c37687ed7 (diff) |
Drop QVector for srb and shader stage descriptions
Follow the QRhi changes that move away from QVector in
QRhiShaderResourceBindings and QRhiGraphicsPipeline.
This, together with QRhi's de-d-pointering of QRhiShaderResourceBinding,
is bringing significant performance improvements for scenes with
a lot (thousands) of unbatched items, since a large number of
allocations are now avoided due to not having to create a QVector of
d-pointered classes just to do a lookup in the srb cache.
Change-Id: I612ab2d9449a9e0ce79f7169b942b95d55af61ff
Reviewed-by: Christian Strømme <christian.stromme@qt.io>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 12 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h | 10 |
2 files changed, 12 insertions, 10 deletions
diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index 37deaa35dd..c30ed7cef4 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -400,14 +400,14 @@ void ShaderManager::clearCachedRendererData() } } -QRhiShaderResourceBindings *ShaderManager::srb(const QVector<QRhiShaderResourceBinding> &bindings) +QRhiShaderResourceBindings *ShaderManager::srb(const ShaderResourceBindingList &bindings) { auto it = srbCache.constFind(bindings); if (it != srbCache.constEnd()) return *it; QRhiShaderResourceBindings *srb = context->rhi()->newShaderResourceBindings(); - srb->setBindings(bindings); + srb->setBindings(bindings.cbegin(), bindings.cend()); if (srb->build()) { srbCache.insert(bindings, srb); } else { @@ -3253,7 +3253,7 @@ bool Renderer::ensurePipelineState(Element *e, const ShaderManager::Shader *sms) // Build a new one. This is potentially expensive. QRhiGraphicsPipeline *ps = m_rhi->newGraphicsPipeline(); - ps->setShaderStages(sms->programRhi.shaderStages); + ps->setShaderStages(sms->programRhi.shaderStages.cbegin(), sms->programRhi.shaderStages.cend()); ps->setVertexInputLayout(sms->programRhi.inputLayout); ps->setShaderResourceBindings(e->srb); ps->setRenderPassDescriptor(renderPassDescriptor()); @@ -3428,7 +3428,7 @@ static void materialToRendererGraphicsState(GraphicsState *dst, void Renderer::updateMaterialDynamicData(ShaderManager::Shader *sms, QSGMaterialRhiShader::RenderState &renderState, QSGMaterial *material, - QVector<QRhiShaderResourceBinding> *bindings, + ShaderManager::ShaderResourceBindingList *bindings, const Batch *batch, int ubufOffset, int ubufRegionSize) // RHI only, [prepare step] @@ -3630,7 +3630,7 @@ bool Renderer::prepareRenderMergedBatch(Batch *batch, PreparedRenderBatch *rende bool pendingGStatePop = false; updateMaterialStaticData(sms, renderState, material, batch, &pendingGStatePop); - QVector<QRhiShaderResourceBinding> bindings; + ShaderManager::ShaderResourceBindingList bindings; updateMaterialDynamicData(sms, renderState, material, &bindings, batch, 0, ubufSize); #ifndef QT_NO_DEBUG @@ -3824,7 +3824,7 @@ bool Renderer::prepareRenderUnmergedBatch(Batch *batch, PreparedRenderBatch *ren } QSGMaterialRhiShader::RenderState renderState = rhiState(QSGMaterialRhiShader::RenderState::DirtyStates(int(dirty))); - QVector<QRhiShaderResourceBinding> bindings; + ShaderManager::ShaderResourceBindingList bindings; updateMaterialDynamicData(sms, renderState, material, &bindings, batch, ubufOffset, ubufSize); diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h b/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h index 5390e14c77..297df2232a 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer_p.h @@ -642,7 +642,7 @@ public: struct { QSGMaterialRhiShader *program = nullptr; QRhiVertexInputLayout inputLayout; - QVector<QRhiGraphicsShaderStage> shaderStages; + QVarLengthArray<QRhiGraphicsShaderStage, 2> shaderStages; } programRhi; float lastOpacity; @@ -656,7 +656,9 @@ public: void clearCachedRendererData(); - QRhiShaderResourceBindings *srb(const QVector<QRhiShaderResourceBinding> &bindings); + using ShaderResourceBindingList = QVarLengthArray<QRhiShaderResourceBinding, 8>; + + QRhiShaderResourceBindings *srb(const ShaderResourceBindingList &bindings); public Q_SLOTS: void invalidated(); @@ -672,7 +674,7 @@ private: QOpenGLShaderProgram *blitProgram; QSGDefaultRenderContext *context; - QHash<QVector<QRhiShaderResourceBinding>, QRhiShaderResourceBindings *> srbCache; + QHash<ShaderResourceBindingList, QRhiShaderResourceBindings *> srbCache; }; struct GraphicsState @@ -797,7 +799,7 @@ private: bool ensurePipelineState(Element *e, const ShaderManager::Shader *sms); QRhiTexture *dummyTexture(); void updateMaterialDynamicData(ShaderManager::Shader *sms, QSGMaterialRhiShader::RenderState &renderState, - QSGMaterial *material, QVector<QRhiShaderResourceBinding> *bindings, + QSGMaterial *material, ShaderManager::ShaderResourceBindingList *bindings, const Batch *batch, int ubufOffset, int ubufRegionSize); void updateMaterialStaticData(ShaderManager::Shader *sms, QSGMaterialRhiShader::RenderState &renderState, QSGMaterial *material, Batch *batch, bool *gstateChanged); |