diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-02-26 11:34:53 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2015-02-28 16:29:16 +0000 |
commit | ef702546c9262e0ea0343caccb5f7992691ebe9a (patch) | |
tree | a704b539f46d452c456525b531a96c7b3186dd32 /src/render/backend/jobs | |
parent | 8d33af238e7b855bd5a217302e586d1dfe73066e (diff) |
RenderView: moved the ShaderData name/value map building out
It is now contained in RenderViewJobUtils inside an helper struct called
UniformBlockValueBuilder.
This allow to simplify the code and will make unit testing easier.
Change-Id: Ibbeeda8d913bfa1adc7c93c1fecb9cafda15deb3
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/backend/jobs')
-rw-r--r-- | src/render/backend/jobs/renderviewjobutils.cpp | 68 | ||||
-rw-r--r-- | src/render/backend/jobs/renderviewjobutils_p.h | 22 |
2 files changed, 90 insertions, 0 deletions
diff --git a/src/render/backend/jobs/renderviewjobutils.cpp b/src/render/backend/jobs/renderviewjobutils.cpp index 62d9f2202..3d341ed2d 100644 --- a/src/render/backend/jobs/renderviewjobutils.cpp +++ b/src/render/backend/jobs/renderviewjobutils.cpp @@ -52,6 +52,9 @@ #include <Qt3DRenderer/private/sortmethod_p.h> #include <Qt3DRenderer/private/techniquefilternode_p.h> #include <Qt3DRenderer/private/viewportnode_p.h> +#include <Qt3DRenderer/private/shadervariables_p.h> +#include <Qt3DRenderer/private/managers_p.h> +#include <Qt3DRenderer/private/rendershaderdata_p.h> QT_BEGIN_NAMESPACE @@ -339,6 +342,71 @@ RenderStateSet *buildRenderStateSet(RenderRenderPass *pass, QFrameAllocator *all return stateSet; } +namespace { + +const QString blockArray = QStringLiteral("[%1]"); +const int qNodeIdTypeId = qMetaTypeId<QNodeId>(); + +} + +UniformBlockValueBuilder::UniformBlockValueBuilder() + : shaderDataManager(Q_NULLPTR) +{ +} + +UniformBlockValueBuilder::~UniformBlockValueBuilder() +{ +} + +void UniformBlockValueBuilder::buildActiveUniformNameValueMapHelper(const QString &blockName, const QString &qmlPropertyName, const QVariant &value) +{ + // In the end, values are either scalar or a scalar array + // Composed elements (structs, structs array) are simplified into simple scalars + if (value.userType() == QMetaType::QVariantList) { // Array + QVariantList list = value.value<QVariantList>(); + if (list.at(0).userType() == qNodeIdTypeId) { // Array of struct qmlPropertyName[i].structMember + for (int i = 0; i < list.size(); ++i) { + if (list.at(i).userType() == qNodeIdTypeId) { + RenderShaderData *subShaderData = shaderDataManager->lookupResource(list.at(i).value<QNodeId>()); + if (subShaderData) + buildActiveUniformNameValueMapStructHelper(subShaderData, + blockName + QStringLiteral(".") + qmlPropertyName + blockArray.arg(i), + QStringLiteral("")); + } + } + } else { // Array of scalar/vec qmlPropertyName[0] + QString varName = blockName + QStringLiteral(".") + qmlPropertyName + QStringLiteral("[0]"); + if (uniforms.contains(varName)) + activeUniformNamesToValue.insert(varName, value); + } + } else if (value.userType() == qNodeIdTypeId) { // Struct qmlPropertyName.structMember + RenderShaderData *rSubShaderData = shaderDataManager->lookupResource(value.value<QNodeId>()); + if (rSubShaderData) + buildActiveUniformNameValueMapStructHelper(rSubShaderData, + blockName, + qmlPropertyName); + } else { // Scalar / Vec + QString varName = blockName + QStringLiteral(".") + qmlPropertyName; + if (uniforms.contains(varName)) + activeUniformNamesToValue.insert(varName, value); + } +} + +void UniformBlockValueBuilder::buildActiveUniformNameValueMapStructHelper(RenderShaderData *rShaderData, const QString &blockName, const QString &qmlPropertyName) +{ + const QHash<QString, QVariant> &properties = updatedPropertiesOnly ? rShaderData->updatedProperties() : rShaderData->properties(); + QHash<QString, QVariant>::const_iterator it = properties.begin(); + const QHash<QString, QVariant>::const_iterator end = properties.end(); + + while (it != end) { + QString prefix = qmlPropertyName.isEmpty() ? QStringLiteral("") : QStringLiteral("."); + buildActiveUniformNameValueMapHelper(blockName + prefix + qmlPropertyName, + it.key(), + it.value()); + ++it; + } +} + } // namespace Render } // namespace Qt3D diff --git a/src/render/backend/jobs/renderviewjobutils_p.h b/src/render/backend/jobs/renderviewjobutils_p.h index 3c6714247..19bf9f6ce 100644 --- a/src/render/backend/jobs/renderviewjobutils_p.h +++ b/src/render/backend/jobs/renderviewjobutils_p.h @@ -60,6 +60,9 @@ class RenderStateSet; class RenderTechnique; class RenderView; class Renderer; +class ShaderDataManager; +class ShaderUniform; +class RenderShaderData; Q_AUTOTEST_EXPORT void setRenderViewConfigFromFrameGraphLeafNode(RenderView *rv, const FrameGraphNode *fgLeaf); @@ -103,6 +106,25 @@ Q_AUTOTEST_EXPORT ParameterInfoList::iterator findParamInfo(ParameterInfoList *i Q_AUTOTEST_EXPORT RenderStateSet *buildRenderStateSet(RenderRenderPass *pass, QFrameAllocator *allocator); + +struct Q_AUTOTEST_EXPORT UniformBlockValueBuilder +{ + UniformBlockValueBuilder(); + ~UniformBlockValueBuilder(); + + void buildActiveUniformNameValueMapHelper(const QString &blockName, + const QString &qmlPropertyName, + const QVariant &value); + void buildActiveUniformNameValueMapStructHelper(RenderShaderData *rShaderData, + const QString &blockName, + const QString &qmlPropertyName = QString()); + + bool updatedPropertiesOnly; + QHash<QString, ShaderUniform> uniforms; + QHash<QString, QVariant> activeUniformNamesToValue; + ShaderDataManager *shaderDataManager; +}; + } // namespace Render } // namespace Qt3D |