From 0a92c970b7a8a9b1310e56e19a7d4b6ceb141270 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Mon, 1 Jul 2024 16:05:14 +0200 Subject: [PATCH] rhi: gl: Move bindShaderResources scratch arrays to be non-local ..and reusable. Task-number: QTBUG-125087 Change-Id: I469a4f826d15635c4c825431a7a7a8aaead41823 Pick-to: 6.7 6.6 6.5 Reviewed-by: Andy Nichols (cherry picked from commit c7d536a83763c65c4dd789f60404ce3e283d668b) Reviewed-by: Qt Cherry-pick Bot --- src/gui/rhi/qrhigles2.cpp | 70 ++++++++++++++++----------------------- src/gui/rhi/qrhigles2_p.h | 19 +++++++++++ 2 files changed, 47 insertions(+), 42 deletions(-) diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp index eb78931b85d..525c519ff2f 100644 --- a/src/gui/rhi/qrhigles2.cpp +++ b/src/gui/rhi/qrhigles2.cpp @@ -4039,26 +4039,12 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, QGles2ShaderResourceBindings *srbD = QRHI_RES(QGles2ShaderResourceBindings, srb); int texUnit = 1; // start from unit 1, keep 0 for resource mgmt stuff to avoid clashes bool activeTexUnitAltered = false; - union data32_t { - float f; - qint32 i; - }; - QVarLengthArray packedArray; QGles2UniformDescriptionVector &uniforms(maybeGraphicsPs ? QRHI_RES(QGles2GraphicsPipeline, maybeGraphicsPs)->uniforms : QRHI_RES(QGles2ComputePipeline, maybeComputePs)->uniforms); QGles2UniformState *uniformState = maybeGraphicsPs ? QRHI_RES(QGles2GraphicsPipeline, maybeGraphicsPs)->uniformState : QRHI_RES(QGles2ComputePipeline, maybeComputePs)->uniformState; - struct SeparateTexture { - QGles2Texture *texture; - int binding; - int elem; - }; - QVarLengthArray separateTextureBindings; - struct SeparateSampler { - QGles2Sampler *sampler; - int binding; - }; - QVarLengthArray separateSamplerBindings; + m_scratch.separateTextureBindings.clear(); + m_scratch.separateSamplerBindings.clear(); for (int i = 0, ie = srbD->m_bindings.size(); i != ie; ++i) { const QRhiShaderResourceBinding::Data *b = shaderResourceBindingData(srbD->m_bindings.at(i)); @@ -4126,9 +4112,9 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, } } else { // input is 16 bytes per element as per std140, have to convert to packed - packedArray.resize(elemCount); - qrhi_std140_to_packed(&packedArray.data()->f, 1, elemCount, src); - f->glUniform1fv(uniform.glslLocation, elemCount, &packedArray.constData()->f); + m_scratch.packedArray.resize(elemCount); + qrhi_std140_to_packed(&m_scratch.packedArray.data()->f, 1, elemCount, src); + f->glUniform1fv(uniform.glslLocation, elemCount, &m_scratch.packedArray.constData()->f); } } break; @@ -4152,9 +4138,9 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, f->glUniform2fv(uniform.glslLocation, 1, v); } } else { - packedArray.resize(elemCount * 2); - qrhi_std140_to_packed(&packedArray.data()->f, 2, elemCount, src); - f->glUniform2fv(uniform.glslLocation, elemCount, &packedArray.constData()->f); + m_scratch.packedArray.resize(elemCount * 2); + qrhi_std140_to_packed(&m_scratch.packedArray.data()->f, 2, elemCount, src); + f->glUniform2fv(uniform.glslLocation, elemCount, &m_scratch.packedArray.constData()->f); } } break; @@ -4180,9 +4166,9 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, f->glUniform3fv(uniform.glslLocation, 1, v); } } else { - packedArray.resize(elemCount * 3); - qrhi_std140_to_packed(&packedArray.data()->f, 3, elemCount, src); - f->glUniform3fv(uniform.glslLocation, elemCount, &packedArray.constData()->f); + m_scratch.packedArray.resize(elemCount * 3); + qrhi_std140_to_packed(&m_scratch.packedArray.data()->f, 3, elemCount, src); + f->glUniform3fv(uniform.glslLocation, elemCount, &m_scratch.packedArray.constData()->f); } } break; @@ -4229,9 +4215,9 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, memcpy(mat + 6, srcMat + 8, 3 * sizeof(float)); f->glUniformMatrix3fv(uniform.glslLocation, 1, GL_FALSE, mat); } else { - packedArray.resize(elemCount * 9); - qrhi_std140_to_packed(&packedArray.data()->f, 3, elemCount * 3, src); - f->glUniformMatrix3fv(uniform.glslLocation, elemCount, GL_FALSE, &packedArray.constData()->f); + m_scratch.packedArray.resize(elemCount * 9); + qrhi_std140_to_packed(&m_scratch.packedArray.data()->f, 3, elemCount * 3, src); + f->glUniformMatrix3fv(uniform.glslLocation, elemCount, GL_FALSE, &m_scratch.packedArray.constData()->f); } } break; @@ -4244,9 +4230,9 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, if (elemCount < 1) { f->glUniform1i(uniform.glslLocation, *reinterpret_cast(src)); } else { - packedArray.resize(elemCount); - qrhi_std140_to_packed(&packedArray.data()->i, 1, elemCount, src); - f->glUniform1iv(uniform.glslLocation, elemCount, &packedArray.constData()->i); + m_scratch.packedArray.resize(elemCount); + qrhi_std140_to_packed(&m_scratch.packedArray.data()->i, 1, elemCount, src); + f->glUniform1iv(uniform.glslLocation, elemCount, &m_scratch.packedArray.constData()->i); } } break; @@ -4256,9 +4242,9 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, if (elemCount < 1) { f->glUniform2iv(uniform.glslLocation, 1, reinterpret_cast(src)); } else { - packedArray.resize(elemCount * 2); - qrhi_std140_to_packed(&packedArray.data()->i, 2, elemCount, src); - f->glUniform2iv(uniform.glslLocation, elemCount, &packedArray.constData()->i); + m_scratch.packedArray.resize(elemCount * 2); + qrhi_std140_to_packed(&m_scratch.packedArray.data()->i, 2, elemCount, src); + f->glUniform2iv(uniform.glslLocation, elemCount, &m_scratch.packedArray.constData()->i); } } break; @@ -4268,9 +4254,9 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, if (elemCount < 1) { f->glUniform3iv(uniform.glslLocation, 1, reinterpret_cast(src)); } else { - packedArray.resize(elemCount * 3); - qrhi_std140_to_packed(&packedArray.data()->i, 3, elemCount, src); - f->glUniform3iv(uniform.glslLocation, elemCount, &packedArray.constData()->i); + m_scratch.packedArray.resize(elemCount * 3); + qrhi_std140_to_packed(&m_scratch.packedArray.data()->i, 3, elemCount, src); + f->glUniform3iv(uniform.glslLocation, elemCount, &m_scratch.packedArray.constData()->i); } } break; @@ -4339,13 +4325,13 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, case QRhiShaderResourceBinding::Texture: for (int elem = 0; elem < b->u.stex.count; ++elem) { QGles2Texture *texD = QRHI_RES(QGles2Texture, b->u.stex.texSamplers[elem].tex); - separateTextureBindings.append({ texD, b->binding, elem }); + m_scratch.separateTextureBindings.append({ texD, b->binding, elem }); } break; case QRhiShaderResourceBinding::Sampler: { QGles2Sampler *samplerD = QRHI_RES(QGles2Sampler, b->u.stex.texSamplers[0].sampler); - separateSamplerBindings.append({ samplerD, b->binding }); + m_scratch.separateSamplerBindings.append({ samplerD, b->binding }); } break; case QRhiShaderResourceBinding::ImageLoad: @@ -4384,7 +4370,7 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, } } - if (!separateTextureBindings.isEmpty() || !separateSamplerBindings.isEmpty()) { + if (!m_scratch.separateTextureBindings.isEmpty() || !m_scratch.separateSamplerBindings.isEmpty()) { const QGles2SamplerDescriptionVector &samplers(maybeGraphicsPs ? QRHI_RES(QGles2GraphicsPipeline, maybeGraphicsPs)->samplers : QRHI_RES(QGles2ComputePipeline, maybeComputePs)->samplers); void *ps; @@ -4399,10 +4385,10 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD, for (const QGles2SamplerDescription &shaderSampler : samplers) { if (shaderSampler.combinedBinding >= 0) continue; - for (const SeparateSampler &sepSampler : separateSamplerBindings) { + for (const Scratch::SeparateSampler &sepSampler : std::as_const(m_scratch.separateSamplerBindings)) { if (sepSampler.binding != shaderSampler.sbinding) continue; - for (const SeparateTexture &sepTex : separateTextureBindings) { + for (const Scratch::SeparateTexture &sepTex : std::as_const(m_scratch.separateTextureBindings)) { if (sepTex.binding != shaderSampler.tbinding) continue; const int loc = shaderSampler.glslLocation + sepTex.elem; diff --git a/src/gui/rhi/qrhigles2_p.h b/src/gui/rhi/qrhigles2_p.h index 5cd998fae62..d17662007ef 100644 --- a/src/gui/rhi/qrhigles2_p.h +++ b/src/gui/rhi/qrhigles2_p.h @@ -1131,6 +1131,25 @@ public: QByteArray data; }; QHash m_pipelineCache; + + struct Scratch { + union data32_t { + float f; + qint32 i; + }; + QVarLengthArray packedArray; + struct SeparateTexture { + QGles2Texture *texture; + int binding; + int elem; + }; + QVarLengthArray separateTextureBindings; + struct SeparateSampler { + QGles2Sampler *sampler; + int binding; + }; + QVarLengthArray separateSamplerBindings; + } m_scratch; }; Q_DECLARE_TYPEINFO(QRhiGles2::DeferredReleaseEntry, Q_RELOCATABLE_TYPE);