@@ -180,7 +180,13 @@ class SubAllocatedDescriptorSet : public core::IReferenceCounted
180
180
video::IGPUDescriptorSet* getDescriptorSet () { return m_descriptorSet.get (); }
181
181
182
182
// ! Warning `outAddresses` needs to be primed with `invalid_value` values, otherwise no allocation happens for elements not equal to `invalid_value`
183
- inline size_type try_multi_allocate (uint32_t binding, size_type count, video::IGPUDescriptorSet::SDescriptorInfo* descriptors, value_type* outAddresses)
183
+ inline size_type try_multi_allocate (
184
+ uint32_t binding,
185
+ size_type count,
186
+ video::IGPUDescriptorSet::SDescriptorInfo* descriptors,
187
+ video::IGPUDescriptorSet::SWriteDescriptorSet* outDescriptorWrites,
188
+ value_type* outAddresses
189
+ )
184
190
{
185
191
auto debugGuard = stAccessVerifyDebugGuard ();
186
192
@@ -217,17 +223,21 @@ class SubAllocatedDescriptorSet : public core::IReferenceCounted
217
223
// can we change it?
218
224
write.info = &descriptor;
219
225
}
220
- infos.push_back (descriptor);
221
- writes.push_back (write);
226
+ outDescriptorWrites[i] = write;
222
227
}
223
228
224
- // TODO: this goes outside
225
- m_logicalDevice->updateDescriptorSets (writes, {});
226
229
return unallocatedSize;
227
230
}
228
231
229
232
template <class Clock =typename std::chrono::steady_clock>
230
- inline size_type multi_allocate (const std::chrono::time_point<Clock>& maxWaitPoint, uint32_t binding, size_type count, video::IGPUDescriptorSet::SDescriptorInfo* descriptors, value_type* outAddresses) noexcept
233
+ inline size_type multi_allocate (
234
+ const std::chrono::time_point<Clock>& maxWaitPoint,
235
+ uint32_t binding,
236
+ size_type count,
237
+ video::IGPUDescriptorSet::SDescriptorInfo* descriptors,
238
+ video::IGPUDescriptorSet::SWriteDescriptorSet* outDescriptorWrites,
239
+ value_type* outAddresses
240
+ ) noexcept
231
241
{
232
242
auto debugGuard = stAccessVerifyDebugGuard ();
233
243
@@ -239,7 +249,7 @@ class SubAllocatedDescriptorSet : public core::IReferenceCounted
239
249
auto & eventHandler = range->second .eventHandler ;
240
250
241
251
// try allocate once
242
- size_type unallocatedSize = try_multi_allocate (binding, count, descriptors, outAddresses);
252
+ size_type unallocatedSize = try_multi_allocate (binding, count, descriptors, outDescriptorWrites, outAddresses);
243
253
if (!unallocatedSize)
244
254
return 0u ;
245
255
@@ -248,22 +258,34 @@ class SubAllocatedDescriptorSet : public core::IReferenceCounted
248
258
{
249
259
eventHandler.wait (maxWaitPoint, unallocatedSize);
250
260
251
- unallocatedSize = try_multi_allocate (binding, unallocatedSize, &descriptors[count - unallocatedSize], &outAddresses[count - unallocatedSize]);
261
+ unallocatedSize = try_multi_allocate (
262
+ binding,
263
+ unallocatedSize,
264
+ &descriptors[count - unallocatedSize],
265
+ &outDescriptorWrites[count - unallocatedSize],
266
+ &outAddresses[count - unallocatedSize]
267
+ );
252
268
if (!unallocatedSize)
253
269
return 0u ;
254
270
} while (Clock::now ()<maxWaitPoint);
255
271
256
272
return unallocatedSize;
257
273
}
258
274
259
- inline size_type multi_allocate (uint32_t binding, size_type count, video::IGPUDescriptorSet::SDescriptorInfo* descriptors, value_type* outAddresses) noexcept
275
+ inline size_type multi_allocate (
276
+ uint32_t binding,
277
+ size_type count,
278
+ video::IGPUDescriptorSet::SDescriptorInfo* descriptors,
279
+ video::IGPUDescriptorSet::SWriteDescriptorSet* outDescriptorWrites,
280
+ value_type* outAddresses
281
+ ) noexcept
260
282
{
261
283
auto range = m_allocatableRanges.find (binding);
262
284
// Check if this binding has an allocator
263
285
if (range == m_allocatableRanges.end ())
264
286
return count;
265
287
266
- return multi_allocate (TimelineEventHandlerBase::default_wait (), binding, count, descriptors, outAddresses);
288
+ return multi_allocate (TimelineEventHandlerBase::default_wait (), binding, count, descriptors, outDescriptorWrites, outAddresses);
267
289
}
268
290
269
291
inline void multi_deallocate (uint32_t binding, size_type count, const size_type* addr)
0 commit comments