From 755f24f153087eeafa332b36b4233ee7515c2352 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Sat, 10 Oct 2020 10:48:43 +0200 Subject: rhi: d3d: Calculate dynamic offset usage upfront Also remove an unnecessary buffer type test. Change-Id: I6f8312f03d3fe1729fa9b2eb95f6bfbeeccd0d4f Reviewed-by: Andy Nichols --- src/gui/rhi/qrhid3d11.cpp | 25 ++++++++++++++++--------- src/gui/rhi/qrhid3d11_p_p.h | 1 + 2 files changed, 17 insertions(+), 9 deletions(-) (limited to 'src/gui/rhi') diff --git a/src/gui/rhi/qrhid3d11.cpp b/src/gui/rhi/qrhid3d11.cpp index dc4f6b1f01..09a1c28bc9 100644 --- a/src/gui/rhi/qrhid3d11.cpp +++ b/src/gui/rhi/qrhid3d11.cpp @@ -679,7 +679,6 @@ void QRhiD3D11::setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBind QD3D11ShaderResourceBindings *srbD = QRHI_RES(QD3D11ShaderResourceBindings, srb); - bool hasDynamicOffsetInSrb = false; bool srbUpdate = false; for (int i = 0, ie = srbD->sortedBindings.count(); i != ie; ++i) { const QRhiShaderResourceBinding::Data *b = srbD->sortedBindings.at(i).data(); @@ -688,17 +687,16 @@ void QRhiD3D11::setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBind case QRhiShaderResourceBinding::UniformBuffer: { QD3D11Buffer *bufD = QRHI_RES(QD3D11Buffer, b->u.ubuf.buf); - if (bufD->m_type == QRhiBuffer::Dynamic) - executeBufferHostWrites(bufD); + // NonDynamicUniformBuffers is not supported by this backend + Q_ASSERT(bufD->m_type == QRhiBuffer::Dynamic && bufD->m_usage.testFlag(QRhiBuffer::UniformBuffer)); + + executeBufferHostWrites(bufD); if (bufD->generation != bd.ubuf.generation || bufD->m_id != bd.ubuf.id) { srbUpdate = true; bd.ubuf.id = bufD->m_id; bd.ubuf.generation = bufD->generation; } - - if (b->u.ubuf.hasDynamicOffset) - hasDynamicOffsetInSrb = true; } break; case QRhiShaderResourceBinding::SampledTexture: @@ -770,7 +768,7 @@ void QRhiD3D11::setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBind const bool srbChanged = gfxPsD ? (cbD->currentGraphicsSrb != srb) : (cbD->currentComputeSrb != srb); const bool srbRebuilt = cbD->currentSrbGeneration != srbD->generation; - if (srbChanged || srbRebuilt || srbUpdate || hasDynamicOffsetInSrb) { + if (srbChanged || srbRebuilt || srbUpdate || srbD->hasDynamicOffset) { if (gfxPsD) { cbD->currentGraphicsSrb = srb; cbD->currentComputeSrb = nullptr; @@ -785,9 +783,9 @@ void QRhiD3D11::setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBind cmd.args.bindShaderResources.srb = srbD; // dynamic offsets have to be applied at the time of executing the bind // operations, not here - cmd.args.bindShaderResources.offsetOnlyChange = !srbChanged && !srbRebuilt && !srbUpdate && hasDynamicOffsetInSrb; + cmd.args.bindShaderResources.offsetOnlyChange = !srbChanged && !srbRebuilt && !srbUpdate && srbD->hasDynamicOffset; cmd.args.bindShaderResources.dynamicOffsetCount = 0; - if (hasDynamicOffsetInSrb) { + if (srbD->hasDynamicOffset) { if (dynamicOffsetCount < QD3D11CommandBuffer::Command::MAX_DYNAMIC_OFFSET_COUNT) { cmd.args.bindShaderResources.dynamicOffsetCount = dynamicOffsetCount; uint *p = cmd.args.bindShaderResources.dynamicOffsetPairs; @@ -3502,6 +3500,15 @@ bool QD3D11ShaderResourceBindings::create() for (BoundResourceData &bd : boundResourceData) memset(&bd, 0, sizeof(BoundResourceData)); + hasDynamicOffset = false; + for (const QRhiShaderResourceBinding &b : sortedBindings) { + const QRhiShaderResourceBinding::Data *bd = b.data(); + if (bd->type == QRhiShaderResourceBinding::UniformBuffer && bd->u.ubuf.hasDynamicOffset) { + hasDynamicOffset = true; + break; + } + } + generation += 1; return true; } diff --git a/src/gui/rhi/qrhid3d11_p_p.h b/src/gui/rhi/qrhid3d11_p_p.h index b2ff0f77f7..7f5ec28571 100644 --- a/src/gui/rhi/qrhid3d11_p_p.h +++ b/src/gui/rhi/qrhid3d11_p_p.h @@ -203,6 +203,7 @@ struct QD3D11ShaderResourceBindings : public QRhiShaderResourceBindings void destroy() override; bool create() override; + bool hasDynamicOffset = false; QVarLengthArray sortedBindings; uint generation = 0; -- cgit v1.2.3