1066{
1068 size_t out_idx = 0;
1069
1070 for (uint64_t layer = start_frame;
1071 layer < start_frame + num_frames && layer <
m_data.size() && out_idx < output.size();
1072 ++layer) {
1075 const auto* vec = std::get_if<std::vector<T>>(&
m_data[layer]);
1076 if (!vec || vec->empty())
1077 return;
1078 const size_t copy_n = std::min(layer_elems, std::min(vec->size(), output.size() - out_idx));
1079 std::copy_n(vec->begin(), static_cast<std::ptrdiff_t>(copy_n), output.begin() + static_cast<std::ptrdiff_t>(out_idx));
1080 out_idx += copy_n;
1081 });
1082 }
1083
1084 if (out_idx < output.size()) {
1085 std::fill(output.begin() + static_cast<std::ptrdiff_t>(out_idx), output.end(), T {});
1086 }
1087}
Memory::SeqlockArray m_slot_locks
std::vector< DataVariant > m_data
void ensure_cpu(uint32_t layer) const
Download a GPU-held layer into m_data before a CPU read.
bool seqlock_read_void(const Seqlock &lock, uint32_t max_attempts, Fn &&fn)
Invoke a void read functor under a Seqlock with a bounded retry count.