summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSvenn-Arne Dragly <svenn-arne.dragly@qt.io>2017-09-20 12:44:28 +0200
committerSvenn-Arne Dragly <svenn-arne.dragly@qt.io>2017-12-06 11:10:14 +0000
commitdc16f08f2c34a949de8508359f64582a5843754f (patch)
tree25b001934992a65350d22cb2e66735ab57864235
parente611d7f28c2bf5eb7963d8d1e4779293b29b7123 (diff)
Store parameter handle instead of uniform value
This makes it possible to cache the parameter handles in case they do not change between frames, even though the uniform value changes. Change-Id: I3468126131e9a105d26235ea2bac5cb8e70f6b5f Reviewed-by: Paul Lemire <paul.lemire@kdab.com> Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r--src/render/backend/renderview.cpp13
-rw-r--r--src/render/jobs/renderviewjobutils.cpp9
-rw-r--r--src/render/jobs/renderviewjobutils_p.h5
3 files changed, 15 insertions, 12 deletions
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 4486e42d9..549d6e054 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -978,17 +978,18 @@ void RenderView::setShaderAndUniforms(RenderCommand *command,
const ParameterInfoList::const_iterator parametersEnd = parameters.cend();
while (it != parametersEnd) {
+ Parameter *param = m_manager->data<Parameter, ParameterManager>(it->handle);
+ const UniformValue &uniformValue = param->uniformValue();
if (uniformNamesIds.contains(it->nameId)) { // Parameter is a regular uniform
- setUniformValue(command->m_parameterPack, it->nameId, it->value);
+ setUniformValue(command->m_parameterPack, it->nameId, uniformValue);
} else if (uniformBlockNamesIds.indexOf(it->nameId) != -1) { // Parameter is a uniform block
- setUniformBlockValue(command->m_parameterPack, shader, shader->uniformBlockForBlockNameId(it->nameId), it->value);
+ setUniformBlockValue(command->m_parameterPack, shader, shader->uniformBlockForBlockNameId(it->nameId), uniformValue);
} else if (shaderStorageBlockNamesIds.indexOf(it->nameId) != -1) { // Parameters is a SSBO
- setShaderStorageValue(command->m_parameterPack, shader, shader->storageBlockForBlockNameId(it->nameId), it->value);
+ setShaderStorageValue(command->m_parameterPack, shader, shader->storageBlockForBlockNameId(it->nameId), uniformValue);
} else { // Parameter is a struct
- const UniformValue &v = it->value;
ShaderData *shaderData = nullptr;
- if (v.valueType() == UniformValue::NodeId &&
- (shaderData = m_manager->shaderDataManager()->lookupResource(*v.constData<Qt3DCore::QNodeId>())) != nullptr) {
+ if (uniformValue.valueType() == UniformValue::NodeId &&
+ (shaderData = m_manager->shaderDataManager()->lookupResource(*uniformValue.constData<Qt3DCore::QNodeId>())) != nullptr) {
// Try to check if we have a struct or array matching a QShaderData parameter
setDefaultUniformBlockShaderDataValue(command->m_parameterPack, shader, shaderData, StringToInt::lookupString(it->nameId));
}
diff --git a/src/render/jobs/renderviewjobutils.cpp b/src/render/jobs/renderviewjobutils.cpp
index cf23e572f..6a6f62916 100644
--- a/src/render/jobs/renderviewjobutils.cpp
+++ b/src/render/jobs/renderviewjobutils.cpp
@@ -392,10 +392,11 @@ void addParametersForIds(ParameterInfoList *params, ParameterManager *manager,
const Qt3DCore::QNodeIdVector &parameterIds)
{
for (const QNodeId paramId : parameterIds) {
- Parameter *param = manager->lookupResource(paramId);
+ const HParameter parameterHandle = manager->lookupHandle(paramId);
+ const Parameter *param = manager->data(parameterHandle);
ParameterInfoList::iterator it = std::lower_bound(params->begin(), params->end(), param->nameId());
if (it == params->end() || it->nameId != param->nameId())
- params->insert(it, ParameterInfo(param->nameId(), param->uniformValue()));
+ params->insert(it, ParameterInfo(param->nameId(), parameterHandle));
}
}
@@ -518,9 +519,9 @@ void UniformBlockValueBuilder::buildActiveUniformNameValueMapStructHelper(Shader
}
}
-ParameterInfo::ParameterInfo(const int nameId, const UniformValue &value)
+ParameterInfo::ParameterInfo(const int nameId, const HParameter &handle)
: nameId(nameId)
- , value(value)
+ , handle(handle)
{}
bool ParameterInfo::operator<(const ParameterInfo &other) const Q_DECL_NOEXCEPT
diff --git a/src/render/jobs/renderviewjobutils_p.h b/src/render/jobs/renderviewjobutils_p.h
index c1d37b28a..81bef11de 100644
--- a/src/render/jobs/renderviewjobutils_p.h
+++ b/src/render/jobs/renderviewjobutils_p.h
@@ -57,6 +57,7 @@
#include <QtCore/qvariant.h>
#include <QMatrix4x4>
#include <Qt3DRender/private/uniform_p.h>
+#include <Qt3DRender/private/handle_types_p.h>
QT_BEGIN_NAMESPACE
@@ -109,10 +110,10 @@ Q_AUTOTEST_EXPORT inline T variant_value(const QVariant &v)
struct ParameterInfo
{
- explicit ParameterInfo(const int nameId = -1, const UniformValue &value = UniformValue());
+ explicit ParameterInfo(const int nameId = -1, const HParameter &handle = HParameter());
int nameId;
- UniformValue value;
+ HParameter handle;
bool operator<(const int otherNameId) const Q_DECL_NOEXCEPT;
bool operator<(const ParameterInfo &other) const Q_DECL_NOEXCEPT;