summaryrefslogtreecommitdiffstats
path: root/src/render/backend/jobs
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-02-26 11:34:53 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-02-28 16:29:16 +0000
commitef702546c9262e0ea0343caccb5f7992691ebe9a (patch)
treea704b539f46d452c456525b531a96c7b3186dd32 /src/render/backend/jobs
parent8d33af238e7b855bd5a217302e586d1dfe73066e (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.cpp68
-rw-r--r--src/render/backend/jobs/renderviewjobutils_p.h22
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