diff options
Diffstat (limited to 'src/plugins/renderers/rhi/renderer/pipelineuboset.cpp')
-rw-r--r-- | src/plugins/renderers/rhi/renderer/pipelineuboset.cpp | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/src/plugins/renderers/rhi/renderer/pipelineuboset.cpp b/src/plugins/renderers/rhi/renderer/pipelineuboset.cpp index ce53de1ab..54c02a8b1 100644 --- a/src/plugins/renderers/rhi/renderer/pipelineuboset.cpp +++ b/src/plugins/renderers/rhi/renderer/pipelineuboset.cpp @@ -220,14 +220,14 @@ std::vector<QRhiCommandBuffer::DynamicOffset> PipelineUBOSet::offsets(const Rend const size_t dToCmd = distanceToCommand(cmd); { // Compute offset relative to the select UBO in the subset - const size_t localOffset = m_commandsUBO.localOffsetInBufferForCommand(dToCmd); - offsets.push_back({1, localOffset}); + const auto localOffset = m_commandsUBO.localOffsetInBufferForCommand(dToCmd); + offsets.push_back({1, quint32(localOffset)}); } for (const MultiUBOBufferWithBindingAndBlockSize &materialUBO : m_materialsUBOs) { // Compute offset relative to the select UBO in the subset const size_t localOffset = materialUBO.localOffsetInBufferForCommand(dToCmd); - offsets.push_back({materialUBO.binding, localOffset}); + offsets.push_back({materialUBO.binding, quint32(localOffset)}); } return offsets; @@ -620,29 +620,34 @@ void PipelineUBOSet::uploadUBOsForCommand(const RenderCommand &command, for (const RHIShader::UBO_Member &member : qAsConst(uboBlock.members)) { const QShaderDescription::BlockVariable &blockVariable = member.blockVariable; + + // Array if (!blockVariable.arrayDims.empty()) { - if (!blockVariable.structMembers.empty()) { - const int arr0 = blockVariable.arrayDims[0]; - for (int i = 0; i < arr0; i++) { - for (const RHIShader::UBO_Member &structMember : member.structMembers) { + if (!blockVariable.structMembers.empty()) { // Array of structs + // we treat structMembers as arrayMembers when we are dealing with an array of structs´ + const size_t arr0 = size_t(blockVariable.arrayDims[0]); + const size_t m = std::max(arr0, member.structMembers.size()); + for (size_t i = 0; i < m; ++i) { + const RHIShader::UBO_Member &arrayMember = member.structMembers[i]; + for (const RHIShader::UBO_Member &arrayStructMember : arrayMember.structMembers) { uploadUniform(uniforms, ubo, - structMember, + arrayStructMember, distanceToCommand, i * blockVariable.size / arr0); } } - } else { + } else { // Array of scalars uploadUniform(uniforms, ubo, member, distanceToCommand); } } else { - if (!blockVariable.structMembers.empty()) { + if (!blockVariable.structMembers.empty()) { // Struct for (const RHIShader::UBO_Member &structMember : member.structMembers) { uploadUniform(uniforms, ubo, structMember, distanceToCommand); } - } else { + } else { // Scalar uploadUniform(uniforms, ubo, member, distanceToCommand); } |