Rework API graphique Vulkan - EnTT pour ECS + Chargement modèle 3D assimp + SDL3 pour events input et fenetre + mesh texture camera transform ok + attention tous les assets nouveaus ne sont pas commités et il y a du code test en dur dans scene addentity + restructuration globale
This commit is contained in:
54
src/Engine/Core/Graphics/API/DeletionQueue.hpp
Normal file
54
src/Engine/Core/Graphics/API/DeletionQueue.hpp
Normal file
@@ -0,0 +1,54 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user