MCPcopy Create free account
hub / github.com/defold/defold / VisitUniformLeafNodes

Function VisitUniformLeafNodes

engine/graphics/src/graphics.cpp:1294–1355  ·  view source on GitHub ↗

This function will be called recursively to visit all the nested types of a uniform buffer, so that we can create leaf uniforms for all leaf data members.

Source from the content-addressed store, hash-verified

1292 // This function will be called recursively to visit all the nested types of a uniform buffer,
1293 // so that we can create leaf uniforms for all leaf data members.
1294 static void VisitUniformLeafNodes(
1295 IterateUniformsCallback callback,
1296 void* user_data,
1297 const ProgramResourceBinding* resource,
1298 const dmArray<ShaderResourceTypeInfo>& type_infos,
1299 ShaderResourceType type,
1300 char* namespace_name,
1301 char* instance_name,
1302 dmArray<char>* canonical_name_buffer,
1303 uint32_t canonical_name_buffer_offset,
1304 uint32_t base_offset = 0)
1305 {
1306 const ShaderResourceTypeInfo& type_info = type_infos[type.m_TypeIndex];
1307
1308 for (int i = 0; i < type_info.m_MemberCount; ++i)
1309 {
1310 const ShaderResourceMember& member = type_info.m_Members[i];
1311
1312 uint32_t name_length = strlen(member.m_Name);
1313 uint32_t bytes_to_write = name_length + 1; // +1 for null-terminator
1314 bool add_prefixed_dot = canonical_name_buffer_offset > 0;
1315
1316 if (add_prefixed_dot)
1317 {
1318 bytes_to_write++; // 1 for the prefix '.'
1319 }
1320
1321 if (canonical_name_buffer->Capacity() <= canonical_name_buffer_offset + bytes_to_write)
1322 {
1323 canonical_name_buffer->OffsetCapacity(bytes_to_write);
1324 canonical_name_buffer->SetSize(canonical_name_buffer->Capacity());
1325 }
1326
1327 char* name_write_start = canonical_name_buffer->Begin() + canonical_name_buffer_offset;
1328
1329 if (add_prefixed_dot)
1330 {
1331 name_write_start[0] = '.';
1332 name_write_start++;
1333 }
1334
1335 memcpy(name_write_start, member.m_Name, name_length);
1336 name_write_start[name_length] = 0;
1337
1338 if (member.m_Type.m_UseTypeIndex)
1339 {
1340 uint32_t sub_name_offset = canonical_name_buffer_offset + name_length + (int) add_prefixed_dot;
1341 VisitUniformLeafNodes(callback, user_data, resource, type_infos, member.m_Type, namespace_name, instance_name, canonical_name_buffer, sub_name_offset, member.m_Offset + base_offset);
1342 }
1343 else
1344 {
1345 CreateUniformLeafMembersCallbackParams params = {};
1346 params.m_CanonicalName = canonical_name_buffer->Begin();
1347 params.m_Namespace = namespace_name;
1348 params.m_InstanceName = instance_name;
1349 params.m_Member = &member;
1350 params.m_BaseOffset = base_offset;
1351 params.m_Resource = resource;

Callers 1

IterateUniformsFunction · 0.85

Calls 4

CapacityMethod · 0.45
OffsetCapacityMethod · 0.45
SetSizeMethod · 0.45
BeginMethod · 0.45

Tested by

no test coverage detected