Files
CosmicEngine/src/Engine/Core/Graphics/API/DeletionQueue.hpp

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