54 lines
1.7 KiB
C++
54 lines
1.7 KiB
C++
|
|
#ifndef DELETIONQUEUE_HPP
|
||
|
|
#define DELETIONQUEUE_HPP
|
||
|
|
|
||
|
|
#include <cstdint>
|
||
|
|
#include <functional>
|
||
|
|
#include <deque>
|
||
|
|
#include <array>
|
||
|
|
#include "Constants.hpp"
|
||
|
|
|
||
|
|
class DeletionQueue {
|
||
|
|
private:
|
||
|
|
// une queue par frame + une queue immédiate
|
||
|
|
std::array<std::deque<std::function<void()>>, MAX_FRAMES_IN_FLIGHT> m_frameQueues;
|
||
|
|
std::deque<std::function<void()>> m_immediateQueue;
|
||
|
|
|
||
|
|
public:
|
||
|
|
// destruction différée - attendre MAX_FRAMES_IN_FLIGHT frames
|
||
|
|
void push(uint32_t currentFrame, std::function<void()>&& func) {
|
||
|
|
// on enfile dans la frame "opposée" pour attendre un cycle complet
|
||
|
|
uint32_t targetFrame = (currentFrame + MAX_FRAMES_IN_FLIGHT - 1) % MAX_FRAMES_IN_FLIGHT;
|
||
|
|
m_frameQueues[targetFrame].push_back(std::move(func));
|
||
|
|
}
|
||
|
|
|
||
|
|
// destruction immédiate - device.waitIdle() doit avoir été appelé avant
|
||
|
|
void pushImmediate(std::function<void()>&& func) {
|
||
|
|
m_immediateQueue.push_back(std::move(func));
|
||
|
|
}
|
||
|
|
|
||
|
|
// appelé au début de chaque frame - détruit les ressources de cette frame
|
||
|
|
void flush(uint32_t frameIndex) {
|
||
|
|
auto& queue = m_frameQueues[frameIndex];
|
||
|
|
while (!queue.empty()) {
|
||
|
|
queue.front()();
|
||
|
|
queue.pop_front();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// appelé à la fermeture - détruit tout
|
||
|
|
void flushAll() {
|
||
|
|
// vider toutes les frame queues
|
||
|
|
for (auto& queue : m_frameQueues) {
|
||
|
|
while (!queue.empty()) {
|
||
|
|
queue.front()();
|
||
|
|
queue.pop_front();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// vider la queue immédiate
|
||
|
|
while (!m_immediateQueue.empty()) {
|
||
|
|
m_immediateQueue.front()();
|
||
|
|
m_immediateQueue.pop_front();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|
||
|
|
#endif
|