+#ifndef MSP_GL_PROGRAM_BACKEND_H_
+#define MSP_GL_PROGRAM_BACKEND_H_
+
+#include <map>
+#include <string>
+#include <vector>
+#include <msp/core/noncopyable.h>
+#include "reflectdata.h"
+
+namespace Msp {
+namespace GL {
+
+class Device;
+
+class VulkanProgram: public NonCopyable
+{
+ friend class VulkanPipelineState;
+
+protected:
+ struct TransientData
+ { };
+
+ Device &device;
+ unsigned n_stages = 0;
+ std::vector<char> creation_info;
+ std::vector<VkDescriptorSetLayout> desc_set_layout_handles;
+ VkPipelineLayout layout_handle = 0;
+
+ VulkanProgram();
+ VulkanProgram(VulkanProgram &&);
+ ~VulkanProgram();
+
+ bool has_stages() const;
+ void add_glsl_stages(const GlslModule &, const std::map<std::string, int> &, TransientData &);
+ void add_spirv_stages(const SpirVModule &, const std::map<std::string, int> &);
+
+ void finalize(const Module &, TransientData &) { }
+ void finalize_uniforms();
+
+ void set_debug_name(const std::string &) { }
+};
+
+using ProgramBackend = VulkanProgram;
+
+} // namespace GL
+} // namespace Msp
+
+#endif