diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2020-10-10 10:48:43 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2020-10-11 10:59:02 +0200 |
commit | 755f24f153087eeafa332b36b4233ee7515c2352 (patch) | |
tree | e35c410596cf3f53883cd1680e438829820fa96d /src/gui/rhi/qrhid3d11.cpp | |
parent | fe5f2c8bffb770bc29954f68e1e4398df3048876 (diff) |
rhi: d3d: Calculate dynamic offset usage upfront
Also remove an unnecessary buffer type test.
Change-Id: I6f8312f03d3fe1729fa9b2eb95f6bfbeeccd0d4f
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/gui/rhi/qrhid3d11.cpp')
-rw-r--r-- | src/gui/rhi/qrhid3d11.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
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; } |