summaryrefslogtreecommitdiffstats
path: root/src/plugins/renderers/rhi/renderer/pipelineuboset.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/renderers/rhi/renderer/pipelineuboset.cpp')
-rw-r--r--src/plugins/renderers/rhi/renderer/pipelineuboset.cpp27
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);
}