diff options
Diffstat (limited to 'src/plugins/renderers/rhi/renderer/pipelineuboset.cpp')
-rw-r--r-- | src/plugins/renderers/rhi/renderer/pipelineuboset.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/plugins/renderers/rhi/renderer/pipelineuboset.cpp b/src/plugins/renderers/rhi/renderer/pipelineuboset.cpp index 0031d927d..0578c6a09 100644 --- a/src/plugins/renderers/rhi/renderer/pipelineuboset.cpp +++ b/src/plugins/renderers/rhi/renderer/pipelineuboset.cpp @@ -444,6 +444,33 @@ QByteArray rawDataForUniformValue(const QShaderDescription::BlockVariable &block ? QByteArray(value.constData<char>(), std::min(value.byteSize(), blockVariable.size)) : QByteArray::fromRawData(value.constData<char>(), std::min(value.byteSize(), blockVariable.size)); const int matrixStride = blockVariable.matrixStride; + int arrayStride = blockVariable.arrayStride; + const int firstArrayDim = !blockVariable.arrayDims.empty() ? blockVariable.arrayDims.first() : 0; + + if (blockVariable.arrayDims.size() > 1) + qCWarning(Backend) << "Multi Dimension arrays not handled yet"; + + if (arrayStride != 0 && matrixStride != 0) + qCWarning(Backend) << "Arrays of matrices not handled yet"; + + // Special cases for arrays + if (firstArrayDim > 0) { + // It appears that for a float myArray[8]; stride is reported as being + // 0 but expected size 128 bytes which means 16 bytes per float + // In that case we compute the arrayStride ourselves + if (arrayStride == 0) + arrayStride = blockVariable.size / firstArrayDim; + if (arrayStride != 0) { + QByteArray newRawData(firstArrayDim * arrayStride, '\0'); + const int byteSizePerEntry = value.elementByteSize(); + for (int i = 0, m = std::min(firstArrayDim, value.elementCount()); i < m; ++i) { + std::memcpy(newRawData.data() + i * arrayStride, + rawData.constData() + i * byteSizePerEntry, + byteSizePerEntry); + } + return newRawData; + } + } // Special cases for matrices which might have to be aligned to a vec4 stride if (matrixStride != 0 && value.byteSize() % matrixStride != 0) { @@ -457,6 +484,9 @@ QByteArray rawDataForUniformValue(const QShaderDescription::BlockVariable &block } return newRawData; } + + // Note: we currently don't handle array of matrices + return rawData; } |