@@ -76,21 +76,31 @@ class SubAllocatedDescriptorSet : public core::IReferenceCounted
76
76
}
77
77
}
78
78
79
+ // amount of bindings in the descriptor set layout used
80
+ uint32_t getLayoutBindingCount () { return m_allocatableRanges.size (); }
81
+
82
+ // whether that binding index can be sub-allocated
83
+ bool isBindingAllocatable (uint32_t binding) { return m_allocatableRanges[binding].reservedSize != 0 ; }
84
+
85
+ AddressAllocator& getBindingAllocator (uint32_t binding)
86
+ {
87
+ assert (isBindingAllocatable (binding)); // Check if this binding has an allocator
88
+ return *m_allocatableRanges[binding].addressAllocator ;
89
+ }
90
+
79
91
// main methods
80
92
81
93
// ! Warning `outAddresses` needs to be primed with `invalid_value` values, otherwise no allocation happens for elements not equal to `invalid_value`
82
94
template <typename ... Args>
83
95
inline void multi_allocate (uint32_t binding, uint32_t count, value_type* outAddresses, const size_type* sizes, const Args&... args)
84
96
{
85
- auto & range = m_allocatableRanges[binding];
86
- assert (range.reservedSize ); // Check if this binding has an allocator
87
- core::address_allocator_traits<AddressAllocator>::multi_alloc_addr (*range.addressAllocator , count, outAddresses, sizes, 1 , args...);
97
+ core::address_allocator_traits<AddressAllocator>::multi_alloc_addr (getBindingAllocator (binding), count, outAddresses, sizes, 1 , args...);
88
98
}
89
99
inline void multi_deallocate (uint32_t binding, uint32_t count, const size_type* addr, const size_type* sizes)
90
100
{
91
101
auto & range = m_allocatableRanges[binding];
92
102
assert (range.reservedSize ); // Check if this binding has an allocator
93
- core::address_allocator_traits<AddressAllocator>::multi_free_addr (*range. addressAllocator , count, addr, sizes);
103
+ core::address_allocator_traits<AddressAllocator>::multi_free_addr (getBindingAllocator (binding) , count, addr, sizes);
94
104
}
95
105
};
96
106
0 commit comments