From 8c9dfd7914472585f4fd0519f6f2a278225c3658 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Fri, 9 Oct 2020 20:12:34 +0200 Subject: rhi: gl: vk: Pre-calculate the flags for dyn.offset ...instead of doing a loop in setShaderResources() just for this. Change-Id: Iac8d4517783967c6b8bca4926cceca918f7dcdec Reviewed-by: Andy Nichols --- src/gui/rhi/qrhigles2.cpp | 64 ++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 28 deletions(-) (limited to 'src/gui/rhi/qrhigles2.cpp') diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp index 63f419da94..5411d779e1 100644 --- a/src/gui/rhi/qrhigles2.cpp +++ b/src/gui/rhi/qrhigles2.cpp @@ -1091,31 +1091,27 @@ void QRhiGles2::setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBind srb = compPsD->m_shaderResourceBindings; } - QRhiPassResourceTracker &passResTracker(cbD->passResTrackers[cbD->currentPassResTrackerIndex]); QGles2ShaderResourceBindings *srbD = QRHI_RES(QGles2ShaderResourceBindings, srb); - bool hasDynamicOffsetInSrb = false; - for (int i = 0, ie = srbD->m_bindings.count(); i != ie; ++i) { - const QRhiShaderResourceBinding::Data *b = srbD->m_bindings.at(i).data(); - switch (b->type) { - case QRhiShaderResourceBinding::UniformBuffer: - // no BufUniformRead / AccessUniform because no real uniform buffers are used - if (b->u.ubuf.hasDynamicOffset) - hasDynamicOffsetInSrb = true; - break; - case QRhiShaderResourceBinding::SampledTexture: - if (cbD->passNeedsResourceTracking) { + if (cbD->passNeedsResourceTracking) { + QRhiPassResourceTracker &passResTracker(cbD->passResTrackers[cbD->currentPassResTrackerIndex]); + for (int i = 0, ie = srbD->m_bindings.count(); i != ie; ++i) { + const QRhiShaderResourceBinding::Data *b = srbD->m_bindings.at(i).data(); + switch (b->type) { + case QRhiShaderResourceBinding::UniformBuffer: + // no BufUniformRead / AccessUniform because no real uniform buffers are used + break; + case QRhiShaderResourceBinding::SampledTexture: for (int elem = 0; elem < b->u.stex.count; ++elem) { trackedRegisterTexture(&passResTracker, QRHI_RES(QGles2Texture, b->u.stex.texSamplers[elem].tex), QRhiPassResourceTracker::TexSample, QRhiPassResourceTracker::toPassTrackerTextureStage(b->stage)); } - } - break; - case QRhiShaderResourceBinding::ImageLoad: - case QRhiShaderResourceBinding::ImageStore: - case QRhiShaderResourceBinding::ImageLoadStore: - if (cbD->passNeedsResourceTracking) { + break; + case QRhiShaderResourceBinding::ImageLoad: + case QRhiShaderResourceBinding::ImageStore: + case QRhiShaderResourceBinding::ImageLoadStore: + { QGles2Texture *texD = QRHI_RES(QGles2Texture, b->u.simage.tex); QRhiPassResourceTracker::TextureAccess access; if (b->type == QRhiShaderResourceBinding::ImageLoad) @@ -1127,11 +1123,11 @@ void QRhiGles2::setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBind trackedRegisterTexture(&passResTracker, texD, access, QRhiPassResourceTracker::toPassTrackerTextureStage(b->stage)); } - break; - case QRhiShaderResourceBinding::BufferLoad: - case QRhiShaderResourceBinding::BufferStore: - case QRhiShaderResourceBinding::BufferLoadStore: - if (cbD->passNeedsResourceTracking) { + break; + case QRhiShaderResourceBinding::BufferLoad: + case QRhiShaderResourceBinding::BufferStore: + case QRhiShaderResourceBinding::BufferLoadStore: + { QGles2Buffer *bufD = QRHI_RES(QGles2Buffer, b->u.sbuf.buf); QRhiPassResourceTracker::BufferAccess access; if (b->type == QRhiShaderResourceBinding::BufferLoad) @@ -1143,16 +1139,17 @@ void QRhiGles2::setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBind trackedRegisterBuffer(&passResTracker, bufD, access, QRhiPassResourceTracker::toPassTrackerBufferStage(b->stage)); } - break; - default: - break; + break; + default: + break; + } } } const bool srbChanged = gfxPsD ? (cbD->currentGraphicsSrb != srb) : (cbD->currentComputeSrb != srb); const bool srbRebuilt = cbD->currentSrbGeneration != srbD->generation; - if (srbChanged || srbRebuilt || hasDynamicOffsetInSrb) { + if (srbChanged || srbRebuilt || srbD->hasDynamicOffset) { if (gfxPsD) { cbD->currentGraphicsSrb = srb; cbD->currentComputeSrb = nullptr; @@ -1168,7 +1165,7 @@ void QRhiGles2::setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBind cmd.args.bindShaderResources.maybeComputePs = compPsD; cmd.args.bindShaderResources.srb = srb; cmd.args.bindShaderResources.dynamicOffsetCount = 0; - if (hasDynamicOffsetInSrb) { + if (srbD->hasDynamicOffset) { if (dynamicOffsetCount < QGles2CommandBuffer::Command::MAX_DYNAMIC_OFFSET_COUNT) { cmd.args.bindShaderResources.dynamicOffsetCount = dynamicOffsetCount; uint *p = cmd.args.bindShaderResources.dynamicOffsetPairs; @@ -4448,6 +4445,17 @@ bool QGles2ShaderResourceBindings::create() if (!rhiD->sanityCheckShaderResourceBindings(this)) return false; + hasDynamicOffset = false; + for (int i = 0, ie = m_bindings.count(); i != ie; ++i) { + const QRhiShaderResourceBinding::Data *b = m_bindings.at(i).data(); + if (b->type == QRhiShaderResourceBinding::UniformBuffer) { + if (b->u.ubuf.hasDynamicOffset) { + hasDynamicOffset = true; + break; + } + } + } + rhiD->updateLayoutDesc(this); generation += 1; -- cgit v1.2.3