iter != end;
++iter)
{
- // @todo This means parsing the uniform string every frame. Instead, store the array index if present.
- int arrayIndex = (*iter).arrayIndex;
+ auto& uniform = *iter;
+ int arrayIndex = uniform.arrayIndex;
- auto uniformInfo = Graphics::UniformInfo{};
- auto uniformFound = program.GetUniform((*iter).uniformName.GetCString(),
- (*iter).uniformNameHashNoArray ? (*iter).uniformNameHashNoArray
- : (*iter).uniformNameHash,
- uniformInfo);
+ if(!uniform.uniformFunc)
+ {
+ auto uniformInfo = Graphics::UniformInfo{};
+ auto uniformFound = program.GetUniform(uniform.uniformName.GetCString(),
+ uniform.uniformNameHashNoArray ? uniform.uniformNameHashNoArray
+ : uniform.uniformNameHash,
+ uniformInfo);
+
+ uniform.uniformOffset = uniformInfo.offset;
+ uniform.uniformLocation = uniformInfo.location;
+
+ if (uniformFound)
+ {
+ auto dst = ubo.GetOffset() + uniformInfo.offset;
+ const auto typeSize = GetPropertyValueSizeForUniform((*iter).propertyValue->GetType());
+ const auto dest = dst + static_cast<uint32_t>(typeSize) * arrayIndex;
+ const auto func = GetPropertyValueGetter((*iter).propertyValue->GetType());
+
+ ubo.Write(&((*iter).propertyValue->*func)(updateBufferIndex),
+ typeSize,
+ dest);
- if(uniformFound)
+ uniform.uniformSize = typeSize;
+ uniform.uniformFunc = func;
+ }
+ }
+ else
{
- auto dst = ubo.GetOffset() + uniformInfo.offset;
- const auto typeSize = GetPropertyValueSizeForUniform( (*iter).propertyValue->GetType() );
- const auto dest = dst + static_cast<uint32_t>(typeSize) * arrayIndex;
- const auto func = GetPropertyValueGetter((*iter).propertyValue->GetType());
+ auto dst = ubo.GetOffset() + uniform.uniformOffset;
+ const auto typeSize = uniform.uniformSize;
+ const auto dest = dst + static_cast<uint32_t>(typeSize) * arrayIndex;
+ const auto func = uniform.uniformFunc;
+
+
ubo.Write(&((*iter).propertyValue->*func)(updateBufferIndex),
typeSize,
dest);
Render::PipelineCache* mPipelineCache{nullptr};
using Hash = unsigned long;
+
+ typedef const float&(PropertyInputImpl::*FuncGetter )(BufferIndex) const;
+
struct UniformIndexMap
{
ConstString uniformName; ///< The uniform name
Hash uniformNameHash{0u};
Hash uniformNameHashNoArray{0u};
int32_t arrayIndex{-1}; ///< The array index
+
+ int16_t uniformLocation{0u};
+ uint16_t uniformOffset{0u};
+ uint16_t uniformSize{0u};
+ FuncGetter uniformFunc{0};
};
using UniformIndexMappings = Dali::Vector<UniformIndexMap>;