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.
| 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; |
no test coverage detected