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

Function FillProgramResourceBindings

engine/graphics/src/graphics.cpp:1483–1545  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1481 }
1482
1483 void FillProgramResourceBindings(
1484 Program* program,
1485 dmArray<ShaderResourceBinding>& resources,
1486 dmArray<ShaderResourceTypeInfo>& stage_type_infos,
1487 ResourceBindingDesc bindings[MAX_SET_COUNT][MAX_BINDINGS_PER_SET_COUNT],
1488 uint32_t ubo_alignment,
1489 uint32_t ssbo_alignment,
1490 ProgramResourceBindingsInfo& info)
1491 {
1492 for (int i = 0; i < resources.Size(); ++i)
1493 {
1494 ShaderResourceBinding& res = resources[i];
1495 ResourceBindingDesc& binding = bindings[res.m_Set][res.m_Binding];
1496 ProgramResourceBinding& program_resource_binding = program->m_ResourceBindings[res.m_Set][res.m_Binding];
1497
1498 if (!binding.m_Taken)
1499 {
1500 binding.m_Binding = res.m_Binding;
1501 binding.m_Taken = 1;
1502
1503 program_resource_binding.m_Res = &res;
1504 program_resource_binding.m_TypeInfos = &stage_type_infos;
1505 program_resource_binding.m_StageFlags |= res.m_StageFlags;
1506
1507 switch(res.m_BindingFamily)
1508 {
1509 case BINDING_FAMILY_TEXTURE:
1510 program_resource_binding.m_TextureUnit = info.m_TextureCount;
1511 info.m_TextureCount++;
1512 break;
1513 case BINDING_FAMILY_STORAGE_BUFFER:
1514 program_resource_binding.m_StorageBufferUnit = info.m_StorageBufferCount;
1515 info.m_StorageBufferCount++;
1516
1517 #if 0
1518 dmLogInfo("SSBO: name=%s, set=%d, binding=%d, ssbo-unit=%d", res.m_Name, res.m_Set, res.m_Binding, program_resource_binding.m_StorageBufferUnit);
1519 #endif
1520
1521 break;
1522 case BINDING_FAMILY_UNIFORM_BUFFER:
1523 {
1524 assert(res.m_Type.m_UseTypeIndex);
1525 program_resource_binding.m_UniformBufferOffset = info.m_UniformDataSize;
1526 program_resource_binding.m_BindingUserData = AddUniformBufferLayout(program, &res, stage_type_infos.Begin(), stage_type_infos.Size());
1527
1528 info.m_UniformBufferCount++;
1529 info.m_UniformDataSize += res.m_BindingInfo.m_BlockSize;
1530 info.m_UniformDataSizeAligned += DM_ALIGN(res.m_BindingInfo.m_BlockSize, ubo_alignment);
1531 }
1532 break;
1533 case BINDING_FAMILY_GENERIC:
1534 default:break;
1535 }
1536
1537 info.m_MaxSet = dmMath::Max(info.m_MaxSet, (uint32_t) (res.m_Set + 1));
1538 info.m_MaxBinding = dmMath::Max(info.m_MaxBinding, (uint32_t) (res.m_Binding + 1));
1539
1540 #if 0

Calls 7

AddUniformBufferLayoutFunction · 0.85
assertFunction · 0.50
MaxFunction · 0.50
SizeMethod · 0.45
BeginMethod · 0.45
SetCapacityMethod · 0.45
CapacityMethod · 0.45

Tested by

no test coverage detected