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