--- /dev/null
+#ifndef MSP_GL_VULKAN_DESTROYQUEUE_H_
+#define MSP_GL_VULKAN_DESTROYQUEUE_H_
+
+#include <deque>
+#include "handles.h"
+
+namespace Msp {
+namespace GL {
+
+class Device;
+class VulkanFunctions;
+
+class DestroyQueue
+{
+private:
+ struct Entry
+ {
+ void *handle = 0;
+ void (*destroy_func)(const VulkanFunctions &, void *) = 0;
+ unsigned memory_id = 0;
+ unsigned on_frame = 0;
+ };
+
+ Device &device;
+ std::deque<Entry> queue;
+ unsigned current_frame = 0;
+
+public:
+ DestroyQueue(Device &);
+ ~DestroyQueue();
+
+ void destroy(VkBuffer, unsigned);
+ void destroy(VkFence);
+ void destroy(VkFramebuffer);
+ void destroy(VkImageView);
+ void destroy(VkSemaphore);
+
+private:
+ template<typename T, void (VulkanFunctions::*)(T) const>
+ void destroy(T, unsigned = 0);
+
+public:
+ void tick();
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif